12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- .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!!!!
|