12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- .define Csa
- .sect .text
- .sect .rom
- .sect .data
- .sect .bss
- .sect .text
- ! This subroutine performs the case jump by indexing.
- ! 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 contain the address of the
- ! indextable which is the casedescriptor + 6.
- Csa:
- stx ADDR ! address of descriptor (lowbyte)
- sta ADDR+1 ! address of descriptor (highbyte)
- tay
- txa
- clc
- adc #6
- sta ADDR+2 ! address of index table (lowbyte)
- tya
- adc #0
- sta ADDR+3 ! address of index table (highbyte)
- jsr Pop ! fetch index
- pha ! subtract lowerbound
- txa
- ldy #2
- sec
- sbc (ADDR),y
- sta ARTH ! lowerbound (lowbyte)
- pla
- iny
- sbc (ADDR),y
- sta ARTH+1 ! lowerbound (highbyte)
- bmi 1f ! index < lowerbound
- ldy #5
- lda (ADDR),y
- cmp ARTH+1
- bcc 1f ! index (highbyte) > upperbound - lowerbound
- bne 2f ! index (highbyte) <= upperbound - lowerbound
- dey
- lda (ADDR),y
- cmp ARTH
- bcc 1f ! index (lowbyte) > upperbound - lowerbound
- 2: asl ARTH
- rol ARTH+1 ! index * 2
- clc
- lda ADDR+2
- adc ARTH
- sta ADDR+2 ! address of pointer (lowbyte)
- lda ADDR+3
- adc ARTH+1
- sta ADDR+3 ! address of pointer (highbyte)
- ldy #0
- lda (ADDR+2),y ! jump address (lowbyte)
- tax
- iny
- lda (ADDR+2),y ! jump address (highbyte)
- bne 3f
- cpx #0
- beq 1f
- 3: stx ADDR ! pointer <> 0
- sta ADDR+1
- jmp (ADDR) ! jump to address
- 1: ldy #0 ! pointer = 0
- lda (ADDR),y ! get default pointer (lowbyte)
- tax
- iny
- lda (ADDR),y ! get default pointer (highbyte)
- bne 3b
- cpx #0
- bne 3b ! default pointer <> 0
|