ack/mach/i80/libem/csb.s
1985-03-18 12:46:51 +00:00

54 lines
972 B
ArmAsm

.define .csb
! 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!!!!