76 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .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
 | |
| 
 | |
| 
 |