Rev 539 | Blame | Compare with Previous | Last modification | View Log | Download
# file opened: section.asm1 0000 MACRO SECTION sectionName?2 0000 ~ ; init new section to ORG 03 0000 ~ IFNDEF SECTION_MACRO_KNOWN_SECTION_sectionName?4 0000 ~ DEFINE SECTION_MACRO_KNOWN_SECTION_sectionName?5 0000 ~ SECTION_MACRO_LAST_ADR_sectionName? = 06 0000 ~ ENDIF7 0000 ~ ; if sections are switching, remember position of previous8 0000 ~ IFDEF SECTION_MACRO_PREVIOUS_SECTION9 0000 ~ SECTION_MACRO_LAST_ADR_SECTION_MACRO_PREVIOUS_SECTION = $10 0000 ~ UNDEFINE SECTION_MACRO_PREVIOUS_SECTION11 0000 ~ ENDIF12 0000 ~ DEFINE SECTION_MACRO_PREVIOUS_SECTION sectionName?13 0000 ~ ; and set/restore the position of requested section14 0000 ~ ORG SECTION_MACRO_LAST_ADR_sectionName?15 0000 ENDM16 000017 0000 DEVICE ZXSPECTRUM4818 0000 ; WARNING - the SECTION macro makes sense only with DEVICE virtual memory19 0000 ; if you do just simple `OUTPUT "section.bin"`, the output will mix all20 0000 ; sections together.21 0000 ; To output separate sections without mixing you have to save each section22 0000 ; separately at the end of assembling from the virtual-device memory.23 000024 0000 SECTION @code ; use reasonable section names which can form part of label name24 0000 > ; init new section to ORG 024 0000 > IFNDEF SECTION_MACRO_KNOWN_SECTION_@code24 0000 > DEFINE SECTION_MACRO_KNOWN_SECTION_sectionName?24 0000 >SECTION_MACRO_LAST_ADR_@code = 024 0000 > ENDIF24 0000 > ; if sections are switching, remember position of previous24 0000 > IFDEF SECTION_MACRO_PREVIOUS_SECTION24 0000 ~ >SECTION_MACRO_LAST_ADR_SECTION_MACRO_PREVIOUS_SECTION = $24 0000 ~ > UNDEFINE SECTION_MACRO_PREVIOUS_SECTION24 0000 > ENDIF24 0000 > DEFINE SECTION_MACRO_PREVIOUS_SECTION sectionName?24 0000 > ; and set/restore the position of requested section24 0000 > ORG SECTION_MACRO_LAST_ADR_@code25 0000 C7 rst 0 ; this will land to address $0000, because no ORG was done26 0001 ORG $8000 ; at the first usage of SECTION, use ORG to set initial address27 8000 @code_start equ $28 8000 00 nop ; `nop` at $800029 800130 8001 SECTION @data30 8001 > ; init new section to ORG 030 8001 > IFNDEF SECTION_MACRO_KNOWN_SECTION_@data30 8001 > DEFINE SECTION_MACRO_KNOWN_SECTION_sectionName?30 8001 >SECTION_MACRO_LAST_ADR_@data = 030 8001 > ENDIF30 8001 > ; if sections are switching, remember position of previous30 8001 > IFDEF SECTION_MACRO_PREVIOUS_SECTION30 8001 >SECTION_MACRO_LAST_ADR_@code = $30 8001 > UNDEFINE SECTION_MACRO_PREVIOUS_SECTION30 8001 > ENDIF30 8001 > DEFINE SECTION_MACRO_PREVIOUS_SECTION sectionName?30 8001 > ; and set/restore the position of requested section30 8001 > ORG SECTION_MACRO_LAST_ADR_@data31 0000 ORG $D00032 D000 @data_start equ $33 D000 61 62 63 00 s1: DZ "abc"34 D00435 D004 SECTION @code35 D004 > ; init new section to ORG 035 D004 > IFNDEF SECTION_MACRO_KNOWN_SECTION_@code35 D004 ~ > DEFINE SECTION_MACRO_KNOWN_SECTION_sectionName?35 D004 ~ >SECTION_MACRO_LAST_ADR_sectionName? = 035 D004 > ENDIF35 D004 > ; if sections are switching, remember position of previous35 D004 > IFDEF SECTION_MACRO_PREVIOUS_SECTION35 D004 >SECTION_MACRO_LAST_ADR_@data = $35 D004 > UNDEFINE SECTION_MACRO_PREVIOUS_SECTION35 D004 > ENDIF35 D004 > DEFINE SECTION_MACRO_PREVIOUS_SECTION sectionName?35 D004 > ; and set/restore the position of requested section35 D004 > ORG SECTION_MACRO_LAST_ADR_@code36 8001 21 00 D0 ld hl,s1 ; `ld hl,..` at $8001, s1 = $D00037 8004 01 04 D0 ld bc,s2 ; s2 = $D00438 800739 8007 SECTION @data39 8007 > ; init new section to ORG 039 8007 > IFNDEF SECTION_MACRO_KNOWN_SECTION_@data39 8007 ~ > DEFINE SECTION_MACRO_KNOWN_SECTION_sectionName?39 8007 ~ >SECTION_MACRO_LAST_ADR_sectionName? = 039 8007 > ENDIF39 8007 > ; if sections are switching, remember position of previous39 8007 > IFDEF SECTION_MACRO_PREVIOUS_SECTION39 8007 >SECTION_MACRO_LAST_ADR_@code = $39 8007 > UNDEFINE SECTION_MACRO_PREVIOUS_SECTION39 8007 > ENDIF39 8007 > DEFINE SECTION_MACRO_PREVIOUS_SECTION sectionName?39 8007 > ; and set/restore the position of requested section39 8007 > ORG SECTION_MACRO_LAST_ADR_@data40 D004 65 66 67 00 s2: DZ "efg"41 D008 @data_end equ $42 D00843 D008 SECTION @code43 D008 > ; init new section to ORG 043 D008 > IFNDEF SECTION_MACRO_KNOWN_SECTION_@code43 D008 ~ > DEFINE SECTION_MACRO_KNOWN_SECTION_sectionName?43 D008 ~ >SECTION_MACRO_LAST_ADR_sectionName? = 043 D008 > ENDIF43 D008 > ; if sections are switching, remember position of previous43 D008 > IFDEF SECTION_MACRO_PREVIOUS_SECTION43 D008 >SECTION_MACRO_LAST_ADR_@data = $43 D008 > UNDEFINE SECTION_MACRO_PREVIOUS_SECTION43 D008 > ENDIF43 D008 > DEFINE SECTION_MACRO_PREVIOUS_SECTION sectionName?43 D008 > ; and set/restore the position of requested section43 D008 > ORG SECTION_MACRO_LAST_ADR_@code44 8007 18 FE jr $ ; `jr` at $8007 after `ld bc,..`45 8009 @code_end equ $46 800947 8009 ; save the binary result of sections48 800949 8009 ; saving code (except that `rst 0`)50 8009 SAVEBIN "section.bin", code_start, code_end-code_start51 8009 ; saving strings52 8009 SAVEBIN "section.raw", data_start, data_end-data_start53 8009# file closed: section.asmValue Label------ - -----------------------------------------------------------0x8009 code_end0x8000 code_start0xD008 data_end0xD000 data_start0xD000 s10xD004 s20x8007 SECTION_MACRO_LAST_ADR_@code0xD008 SECTION_MACRO_LAST_ADR_@data