57 lines
		
	
	
	
		
			686 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
	
		
			686 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .define .ret
 | |
| .define .lfr
 | |
| 
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| 
 | |
| ! 'ret' and 'lfr' for sizes > 4 (and <= 8)
 | |
| 
 | |
| retarea: .space 8
 | |
| 
 | |
| .sect .text
 | |
| 
 | |
| .ret:
 | |
| ! parameters:
 | |
| !	de: size in bytes
 | |
| !	stack: return value
 | |
| 
 | |
| 	pop ix		! save return address
 | |
| 	ld hl,retarea
 | |
| 	srl d
 | |
| 	rr e		! divide size by 2
 | |
| 1:
 | |
| 	pop bc
 | |
| 	ld (hl), c
 | |
| 	inc hl
 | |
| 	ld (hl), b
 | |
| 	inc hl
 | |
| 	dec de
 | |
| 	ld a,d
 | |
| 	or e
 | |
| 	jr nz,1b	! done?
 | |
| 	jp (ix)		! yes, return
 | |
| 
 | |
| .lfr:
 | |
| ! parameters:
 | |
| !	de: size in bytes
 | |
| !	result on stack: return value
 | |
| 
 | |
| 	pop ix		! save return address
 | |
| 	ld hl,retarea
 | |
| 	add hl,de
 | |
| 	srl d
 | |
| 	rr e		! divide size by 2
 | |
| 1:
 | |
| 	dec hl
 | |
| 	ld b,(hl)
 | |
| 	dec hl
 | |
| 	ld c,(hl)
 | |
| 	push bc
 | |
| 	dec de
 | |
| 	ld a,d
 | |
| 	or e
 | |
| 	jr nz,1b	! done?
 | |
| 	jp (ix)		! yes, return
 | |
| 
 |