.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)