2020-07-06 00:17:44 +00:00
|
|
|
; 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
|
|
|
|
|
2020-07-11 00:24:11 +00:00
|
|
|
; expected to start at $02/0000
|
2020-07-06 00:17:44 +00:00
|
|
|
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
|
|
|
|
lda #^BANK2_START
|
|
|
|
|
|
|
|
ldal BANK8_ADDR
|
|
|
|
lda 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
|
|
|
|
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
|
|
|
|
|
2020-07-11 00:24:11 +00:00
|
|
|
; Test whether we're finding symbols for 16-bit address operands
|
|
|
|
; without reloc data.
|
|
|
|
lda: $0000,y
|
|
|
|
sta: $0002,y
|
|
|
|
|
2020-07-06 00:17:44 +00:00
|
|
|
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
|
2020-07-10 20:56:07 +00:00
|
|
|
|
|
|
|
; 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
|
2020-07-06 00:17:44 +00:00
|
|
|
rts
|