ack/mach/6500/libem/csa.s
1987-01-30 18:41:42 +00:00

77 lines
1.6 KiB
ArmAsm

.define Csa
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
! This subroutine performs the case jump by indexing.
! The zeropage locations ADDR, ADDR+1 contain the address of
! the case descriptor which also is the address of the
! default pointer.
! The zeropage locations ADDR+2, ADDR+3 contain the address of the
! indextable which is the casedescriptor + 6.
Csa:
stx ADDR ! address of descriptor (lowbyte)
sta ADDR+1 ! address of descriptor (highbyte)
tay
txa
clc
adc #6
sta ADDR+2 ! address of index table (lowbyte)
tya
adc #0
sta ADDR+3 ! address of index table (highbyte)
jsr Pop ! fetch index
pha ! subtract lowerbound
txa
ldy #2
sec
sbc (ADDR),y
sta ARTH ! lowerbound (lowbyte)
pla
iny
sbc (ADDR),y
sta ARTH+1 ! lowerbound (highbyte)
bmi 1f ! index < lowerbound
ldy #5
lda (ADDR),y
cmp ARTH+1
bcc 1f ! index (highbyte) > upperbound - lowerbound
bne 2f ! index (highbyte) <= upperbound - lowerbound
dey
lda (ADDR),y
cmp ARTH
bcc 1f ! index (lowbyte) > upperbound - lowerbound
2: asl ARTH
rol ARTH+1 ! index * 2
clc
lda ADDR+2
adc ARTH
sta ADDR+2 ! address of pointer (lowbyte)
lda ADDR+3
adc ARTH+1
sta ADDR+3 ! address of pointer (highbyte)
ldy #0
lda (ADDR+2),y ! jump address (lowbyte)
tax
iny
lda (ADDR+2),y ! jump address (highbyte)
bne 3f
cpx #0
beq 1f
3: stx ADDR ! pointer <> 0
sta ADDR+1
jmp (ADDR) ! jump to address
1: ldy #0 ! pointer = 0
lda (ADDR),y ! get default pointer (lowbyte)
tax
iny
lda (ADDR),y ! get default pointer (highbyte)
bne 3b
cpx #0
bne 3b ! default pointer <> 0