123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- .define .csb
- .sect .text
- .sect .rom
- .sect .data
- .sect .bss
- .sect .text
- ! 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 hl ! pointer to descriptor
- pop de ! case index
- ld c,(hl) ! bc := default offset
- inc hl
- ld b,(hl)
- inc hl
- push bc ! save default on stack
- ld c,(hl) ! bc := #entries
- inc hl
- ld b,(hl)
- inc hl
- 1:
- ! loop, try to find the case index
- ! in the descriptor
- ld a,b
- or c
- jr z,noteq ! done, index not found
- ld a,(hl) ! is de=(hl) ?
- inc hl
- cp e
- jr nz,2f ! no
- ld a,(hl)
- inc hl
- cp d
- jr nz,3f ! no
- ld a,(hl) ! yes, get jump address
- inc hl
- ld h,(hl)
- ld l,a
- pop af ! remove default
- jr 4f
- 2:
- inc hl ! skip high byte of index
- 3:
- inc hl ! skip jump address
- inc hl
- dec bc
- jr 1b
- noteq:
- pop hl ! take default exit
- 4:
- ld a,l ! jump address is zero?
- or h
- jr z,.trp.z ! yes, trap
- jp (hl)
|