ack/mach/i80/libem/csa.s
1987-01-28 18:57:04 +00:00

58 lines
1,002 B
ArmAsm

.define .csa
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
! Case 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.
.csa: pop h !hl = address of case descriptor
pop d !de = index
push b !save localbase
mov c,m
inx h
mov b,m
inx h
push b !save default pointer on stack
mov a,e
sub m
inx h
mov c,a
mov a,d
sbb m
inx h
mov b,a !bc = index - lower bound
jc 1f !get default pointer
mov a,m
inx h
sub c
mov a,m
inx h
sbb b
jc 1f !upper-lower should be >= index-lower
dad b
dad b !hl now points to the wanted pointer
mov a,m
inx h
mov h,m
mov l,a !hl = pointer for index
ora h
jz 1f !get default pointer if pointer = 0
pop b !remove default pointer
pop b !localbase
pchl !jump!!!!
1: pop h !get default pointer
mov a,l
ora h
cz ecase !trap
pop b !restore localbase
pchl !jump!!!!