59 lines
1 KiB
ArmAsm
59 lines
1 KiB
ArmAsm
.define .csb
|
|
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
.sect .text
|
|
|
|
! Table lookup jump
|
|
! Expects on stack: address of case descriptor
|
|
! case index
|
|
! This is not a subroutine, but just a piece of code that computes
|
|
! the jump address and jumps to it.
|
|
! Traps if resulting address is zero.
|
|
|
|
.csb: pop h !hl = pointer to descriptor
|
|
pop d !de = case index
|
|
push b !save localbase
|
|
mov c,m !bc = default pointer
|
|
inx h
|
|
mov b,m
|
|
inx h
|
|
push b !save default on stack
|
|
mov c,m !bc = number of entries
|
|
inx h
|
|
mov b,m
|
|
inx h
|
|
!loop: try to find the case index in the descriptor
|
|
1: mov a,b
|
|
ora c
|
|
jz 4f !done, index not found
|
|
mov a,m !do we have the right index?
|
|
inx h
|
|
cmp e
|
|
jnz 2f !no
|
|
mov a,m
|
|
inx h
|
|
cmp d
|
|
jnz 3f !no
|
|
mov a,m
|
|
inx h
|
|
mov h,m
|
|
mov l,a
|
|
pop psw !remove default pointer
|
|
jmp 5f
|
|
|
|
2: inx h !skip high byte of index
|
|
3: inx h !skip jump address
|
|
inx h
|
|
dcx b
|
|
jmp 1b
|
|
|
|
4: pop h !take default exit
|
|
5: pop b !restore localbase
|
|
mov a,l !jump address is zero?
|
|
ora h
|
|
cz ecase !trap
|
|
pchl !jump!!!!
|
|
|