68 lines
1.3 KiB
ArmAsm
68 lines
1.3 KiB
ArmAsm
.define Csb
|
|
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
.sect .text
|
|
|
|
! This subroutine performs the case jump by searching the table.
|
|
! 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 are used to address the jump
|
|
! pointers.
|
|
|
|
|
|
Csb:
|
|
stx ADDR ! address of descriptor (lowbyte)
|
|
sta ADDR+1 ! address of descriptor (highbyte)
|
|
stx ADDR+2
|
|
sta ADDR+3
|
|
ldy #2
|
|
lda (ADDR),y ! number of entries (lowbyte)
|
|
pha
|
|
jsr Pop
|
|
stx ARTH ! index (lowbyte)
|
|
sta ARTH+1 ! index (highbyte)
|
|
pla
|
|
tax
|
|
inx
|
|
2: clc
|
|
lda #4
|
|
adc ADDR+2
|
|
sta ADDR+2 ! pointer (lowbyte)
|
|
bcc 1f
|
|
lda #0
|
|
adc ADDR+3
|
|
sta ADDR+3 ! pointer (highbyte)
|
|
1: ldy #0
|
|
lda (ADDR+2),y
|
|
cmp ARTH
|
|
bne 3f ! pointer (lowbyte) <> index (lowbyte)
|
|
iny
|
|
lda (ADDR+2),y
|
|
cmp ARTH+1
|
|
bne 3f ! pointer (highbyte) <> index (highbyte)
|
|
iny
|
|
lda (ADDR+2),y ! jump address (lowbyte)
|
|
tax
|
|
iny
|
|
lda (ADDR+2),y ! jump address (highbyte)
|
|
jmp 4f
|
|
3: dex
|
|
bne 2b
|
|
5: ldy #0
|
|
lda (ADDR),y ! default pointer (lowbyte)
|
|
tax
|
|
iny
|
|
lda (ADDR),y ! default pointer (highbyte)
|
|
beq 1f
|
|
4: bne 1f ! pointer (lowbyte) <> 0
|
|
cpx #0
|
|
bne 1f ! pointer (highbyte) <> 0
|
|
beq 5b ! get default pointer
|
|
1: stx ADDR
|
|
sta ADDR+1
|
|
jmp (ADDR) ! jump
|
|
|
|
|