57 lines
		
	
	
	
		
			1,002 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
	
		
			1,002 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define .csa
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
! Case jump
 | 
						|
! Expects on stack:	address of case descriptor
 | 
						|
!			case index
 | 
						|
! 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.
 | 
						|
 | 
						|
.csa:	pop h		!hl = address of case descriptor
 | 
						|
	pop d		!de = index
 | 
						|
	push b		!save localbase
 | 
						|
	mov c,m
 | 
						|
	inx h
 | 
						|
	mov b,m
 | 
						|
	inx h
 | 
						|
	push b		!save default pointer on stack
 | 
						|
	mov a,e
 | 
						|
	sub m
 | 
						|
	inx h
 | 
						|
	mov c,a
 | 
						|
	mov a,d
 | 
						|
	sbb m
 | 
						|
	inx h
 | 
						|
	mov b,a		!bc = index - lower bound
 | 
						|
	jc 1f		!get default pointer
 | 
						|
	mov a,m
 | 
						|
	inx h
 | 
						|
	sub c
 | 
						|
	mov a,m
 | 
						|
	inx h
 | 
						|
	sbb b
 | 
						|
	jc 1f		!upper-lower should be >= index-lower
 | 
						|
	dad b
 | 
						|
	dad b		!hl now points to the wanted pointer
 | 
						|
	mov a,m
 | 
						|
	inx h
 | 
						|
	mov h,m
 | 
						|
	mov l,a		!hl = pointer for index
 | 
						|
	ora h
 | 
						|
	jz 1f		!get default pointer if pointer = 0
 | 
						|
	pop b		!remove default pointer
 | 
						|
	pop b		!localbase
 | 
						|
	pchl		!jump!!!!
 | 
						|
 | 
						|
1:	pop h		!get default pointer
 | 
						|
	mov a,l
 | 
						|
	ora h
 | 
						|
	cz ecase	!trap
 | 
						|
	pop b		!restore localbase
 | 
						|
	pchl		!jump!!!!
 | 
						|
 |