58 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .define .csb
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| .sect .text
 | |
| 
 | |
| ! Table lookup 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.
 | |
| 
 | |
| .csb:	pop h		!hl = pointer to descriptor
 | |
| 	pop d		!de = case index
 | |
| 	push b		!save localbase
 | |
| 	mov c,m		!bc = default pointer
 | |
| 	inx h
 | |
| 	mov b,m
 | |
| 	inx h
 | |
| 	push b		!save default on stack
 | |
| 	mov c,m		!bc = number of entries
 | |
| 	inx h
 | |
| 	mov b,m
 | |
| 	inx h
 | |
| !loop: try to find the case index in the descriptor
 | |
| 1:	mov a,b
 | |
| 	ora c
 | |
| 	jz 4f		!done, index not found
 | |
| 	mov a,m		!do we have the right index?
 | |
| 	inx h
 | |
| 	cmp e
 | |
| 	jnz 2f		!no
 | |
| 	mov a,m
 | |
| 	inx h
 | |
| 	cmp d
 | |
| 	jnz 3f		!no
 | |
| 	mov a,m
 | |
| 	inx h
 | |
| 	mov h,m
 | |
| 	mov l,a
 | |
| 	pop psw		!remove default pointer
 | |
| 	jmp 5f
 | |
| 
 | |
| 2:	inx h		!skip high byte of index
 | |
| 3:	inx h		!skip jump address
 | |
| 	inx h
 | |
| 	dcx b
 | |
| 	jmp 1b
 | |
| 
 | |
| 4:	pop h		!take default exit
 | |
| 5:	pop b		!restore localbase
 | |
| 	mov a,l		!jump address is zero?
 | |
| 	ora h
 | |
| 	cz ecase	!trap
 | |
| 	pchl		!jump!!!!
 | |
| 
 |