.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


