qasm/testdata/2009-branches-and-banks.S

82 lines
2.3 KiB
ArmAsm
Raw Normal View History

2019-11-13 23:51:19 +00:00
; Copyright 2018 faddenSoft. All Rights Reserved.
; See the LICENSE.txt file for distribution terms (Apache 2.0).
;
; Assembler: cc65
;
; Both cc65 (2.17) and Merlin32 (1.0) have problems computing branches that
; wrap around a bank (e.g. from $0010 to $ffd0). cc65 is slightly less
; egregious in that a workaround is possible: if you specify a label that
; is in range, and then an offset, it will generate code.
.setcpu "65816"
symlong = $123456
.org $1000
clc
xce
sep #$30
.a8
.i8
jmp zero
.org $0000
zero: bit a:zero
low: lda zero
lda low
bne low-$40 ;reference symbol
bmi low-$40 ;EDIT: format as hex
per low-$40
bvs more
brl more1
lodat: .byte $00,$01,$02 ;EDIT: set label
more: lda more-2
brl zero-$40 ;branch to high
.org $0080
more1: bit a:more1
jml bank44
.org $ffc0
high:
bit high
brl high+$43 ;branch to low
.org $440000
bank44: cmp f:bank44
low44: lda bank44
lda a:bank44 & $ffff
lda z:bank44 & $ffff ;DP ref, should resolve to "zero"
bmi low44
per low44-$40
bne low44-$40 ;branch to high44
brl bank44-$40 ;branch to late44
dat44: ;EDIT: set label
.addr dat44 ;EDIT: format as 16-bit Address
.faraddr dat44 ;EDIT: format as 24-bit Address
.org $44ffc0
late44: cmp f:late44
high44: beq cont44 ;EDIT: set label
bmi late44+$44 ;branch to low44
brl late44+$44 ;branch to low44
cont44: jml twok
.org $2000
twok: bit twok
pea dat44 & $ffff ;EDIT: set symbol=dat44
pea dat44 >> 16 ;EDIT: set symbol=dat44
bne skip
jmp [lodat]
skip: nop
j1: jsr j2 ;EDIT: set symbol=j2 for all, confirm auto-labels vanish
j2: jsr j3 ;EDIT: set label
j3: jsr j1
jsl symlong
rts