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