; Copyright 2020 faddenSoft. All Rights Reserved. ; See the LICENSE.txt file for distribution terms (Apache 2.0). ; ; Assembler: Merlin 32 ; ; Segment #1 : code; main segment, loads anywhere BANK2_START EXT BANK2_MOV_DST EXT BANK8_START EXT BANK8_ADDR EXT BANK8_MOV_SRC EXT ADDR_FFE0 EXT ; expected to start at $02/0000 REL ;generate relocatable code start clc xce sep #$30 mx %11 ldal start nop jsl BANK2_START jsl BANK8_START ldal BANK2_START lda BANK2_START lda #BANK2_START lda #^BANK2_START ldal BANK8_ADDR lda BANK8_ADDR lda #BANK8_ADDR lda #^BANK8_ADDR nop ; Do some stuff with 16-bit registers. Merlin 32 treats <>^ as shift ; operations rather than byte selectors. rep #$30 mx %00 lda #BANK8_ADDR lda #^BANK8_ADDR nop ; Check MVN/MVP. Handing them correctly requires having two different ; symbol refs on a single instruction. lda #15 ldx #BANK8_MOV_SRC ldy #BANK2_MOV_DST mvn #^BANK8_MOV_SRC,#^BANK2_MOV_DST nop ; Test whether we're finding symbols for 16-bit address operands ; without reloc data. lda: $0000,y sta: $0002,y check_pea pea $0000 pea $f000 pea BANK8_ADDR pea ^BANK8_ADDR pea check_pea pea >check_pea pea ^check_pea pea check_pea+18 pea check_pea+$1000 nop jmp :skipdata ; Generate 2/3/4-byte refs. The OMF reloc entry generated by Merlin32 ; for ADRL is only 3 bytes wide. dw ADDR_FFE0 adr ADDR_FFE0 adrl ADDR_FFE0 :skipdata ; Check a situation where we block a relocation from being fully formed. ; The access to addr_dat+2 and addr_dat cause labels to be auto-generated. ; Because we access the high part first, there's no opportunity to find ; a pre-existing label nearby. If the reloc code generates a 3-byte or ; 4-byte data item at addr_dat, the label at addr_dat+2 will be hidden. phk plb lda #$0000 asl A asl A tax lda addr_dat+2,X pha lda addr_dat,X pha beq :skip_ad rts addr_dat adrl check_pea adrl :skipdata :skip_ad rts