36 lines
		
	
	
	
		
			820 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
	
		
			820 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #
 | |
| /*
 | |
|  * VideoCore IV support library for the ACK
 | |
|  * © 2013 David Given
 | |
|  * This file is redistributable under the terms of the 3-clause BSD license.
 | |
|  * See the file 'Copying' in the root of the distribution for the full text.
 | |
|  */
 | |
| 
 | |
| #include "videocore.h"
 | |
| 
 | |
| .define	.csa
 | |
| .sect .data
 | |
| .csa:
 | |
| 	! on entry:
 | |
| 	!   r0 = un-fixed-up descriptor
 | |
| 	!   r1 = value
 | |
| 	add r0, gp
 | |
| 
 | |
| 	ld r2, 4 (r0)            ! check lower bound
 | |
| 
 | |
| 	b.lo r1, r2, default     ! jump to default if r1 < r2
 | |
| 
 | |
| 	sub r1, r2               ! adjust value to be 0-based
 | |
| 
 | |
| 	ld r2, 8 (r0)            ! check upper bound
 | |
| 	b.hi r1, r2, default     ! jump to default if r1 > r2
 | |
| 
 | |
|     add r1, #3
 | |
| go:
 | |
|     ld r1, (r0, r1)          ! load destination address
 | |
|     add r1, gp
 | |
|     b r1                     ! ...and go
 | |
| 
 | |
| default:
 | |
| 	mov r1, #0               ! index of default value
 | |
| 	b go
 |