57 lines
		
	
	
	
		
			805 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
	
		
			805 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#
 | 
						|
.sect .text; .sect .rom; .sect .data; .sect .bss
 | 
						|
 | 
						|
/* Stores a variable-sized block from the stack.
 | 
						|
 *
 | 
						|
 * On entry: r2 = size
 | 
						|
 * Stack: ( block address -- )
 | 
						|
 * Preserves r25 for .lar4 and .sar4
 | 
						|
 */
 | 
						|
 | 
						|
.sect .text
 | 
						|
.define .sts4
 | 
						|
.sts4:
 | 
						|
	lw r4, 0(sp)            ! r4 = address
 | 
						|
	addiu sp, sp, 4         ! sp = pointer to block
 | 
						|
 | 
						|
	! Sizes 1 and 2 are handled specially.
 | 
						|
 | 
						|
	li at, 1
 | 
						|
	beq r2, at, byte_sized
 | 
						|
	nop
 | 
						|
 | 
						|
	li at, 2
 | 
						|
	beq r2, at, word_sized
 | 
						|
	nop
 | 
						|
 | 
						|
	! Else the size must be a multiple of 4.
 | 
						|
 | 
						|
	srl r5, r2, 2           ! r5 = number of words
 | 
						|
 | 
						|
	! Copy.
 | 
						|
 | 
						|
1:
 | 
						|
	lw at, 0(sp)
 | 
						|
	sw at, 0(r4)
 | 
						|
	addiu sp, sp, 4
 | 
						|
	addiu r4, r4, 4
 | 
						|
	addiu r5, r5, -1
 | 
						|
	bne r5, zero, 1b
 | 
						|
	nop
 | 
						|
 | 
						|
	jr ra
 | 
						|
	nop
 | 
						|
 | 
						|
byte_sized:
 | 
						|
	lw at, 0(sp)
 | 
						|
	sb at, 0(r4)
 | 
						|
	addiu sp, sp, 4
 | 
						|
	jr ra
 | 
						|
	nop
 | 
						|
 | 
						|
word_sized:
 | 
						|
	lw at, 0(sp)
 | 
						|
	sh at, 0(r4)
 | 
						|
	addiu sp, sp, 4
 | 
						|
	jr ra
 | 
						|
	nop
 |