.define Csb .sect .text .sect .rom .sect .data .sect .bss .sect .text ! This subroutine performs the case jump by searching the table. ! The zeropage locations ADDR, ADDR+1 contain the address of the ! case descriptor, which also is the address of the default pointer. ! The zeropage locations ADDR+2, ADDR+3 are used to address the jump ! pointers. Csb: stx ADDR ! address of descriptor (lowbyte) sta ADDR+1 ! address of descriptor (highbyte) stx ADDR+2 sta ADDR+3 ldy #2 lda (ADDR),y ! number of entries (lowbyte) pha jsr Pop stx ARTH ! index (lowbyte) sta ARTH+1 ! index (highbyte) pla tax inx 2: clc lda #4 adc ADDR+2 sta ADDR+2 ! pointer (lowbyte) bcc 1f lda #0 adc ADDR+3 sta ADDR+3 ! pointer (highbyte) 1: ldy #0 lda (ADDR+2),y cmp ARTH bne 3f ! pointer (lowbyte) <> index (lowbyte) iny lda (ADDR+2),y cmp ARTH+1 bne 3f ! pointer (highbyte) <> index (highbyte) iny lda (ADDR+2),y ! jump address (lowbyte) tax iny lda (ADDR+2),y ! jump address (highbyte) jmp 4f 3: dex bne 2b 5: ldy #0 lda (ADDR),y ! default pointer (lowbyte) tax iny lda (ADDR),y ! default pointer (highbyte) beq 1f 4: bne 1f ! pointer (lowbyte) <> 0 cpx #0 bne 1f ! pointer (highbyte) <> 0 beq 5b ! get default pointer 1: stx ADDR sta ADDR+1 jmp (ADDR) ! jump