103 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| #include "setarch.h"
 | |
| 
 | |
| #include "defines.h"
 | |
| 
 | |
| #if defined (__H8300SX__)
 | |
| 
 | |
| 	.global	_memset
 | |
| _memset:
 | |
| 	; Use er3 is a temporary since er0 must remain unchanged on exit.
 | |
| 	mov.l	er0,er3
 | |
| 
 | |
| 	; Fill er1 with the byte to copy.
 | |
| 	mov.b	r1l,r1h
 | |
| 	mov.w	r1,e1
 | |
| 
 | |
| 	; Account for any excess bytes and words that will be copied after
 | |
| 	; the main loop.  r2 >= 0 if there is a longword to copy.
 | |
| 	sub	#4,LEN(r2)
 | |
| 	blo	longs_done
 | |
| 
 | |
| 	; Copy one byte if doing so will make er3 word-aligned.
 | |
| 	; This isn't needed for correctness but it makes the main loop
 | |
| 	; slightly faster.
 | |
| 	bld	#0,r3l
 | |
| 	bcc	word_aligned
 | |
| 	mov.b	r1l,@er3+
 | |
| 	sub	#1,LEN(r2)
 | |
| 	blo	longs_done
 | |
| 
 | |
| word_aligned:
 | |
| 	; Likewise one word for longword alignment.
 | |
| 	bld	#1,r3l
 | |
| 	bcc	long_copy
 | |
| 	mov.w	r1,@er3+
 | |
| 	sub	#2,LEN(r2)
 | |
| 	blo	longs_done
 | |
| 
 | |
| long_copy:
 | |
| 	; Copy longwords.
 | |
| 	mov.l	er1,@er3+
 | |
| 	sub	#4,LEN(r2)
 | |
| 	bhs	long_copy
 | |
| 
 | |
| longs_done:
 | |
| 	; At this point, we need to copy r2 & 3 bytes.  Copy a word
 | |
| 	; if necessary.
 | |
| 	bld	#1,r2l
 | |
| 	bcc	words_done
 | |
| 	mov.w	r1,@er3+
 | |
| 
 | |
| words_done:
 | |
| 	; Copy a byte.
 | |
| 	bld	#0,r2l
 | |
| 	bcc	bytes_done
 | |
| 	mov.b	r1l,@er3+
 | |
| 
 | |
| bytes_done:
 | |
| 	rts
 | |
| 
 | |
| #else
 | |
| 
 | |
| ; A0P pointer to cursor
 | |
| ; A1P thing to copy
 | |
| 	.global	_memset
 | |
| 
 | |
| _memset:
 | |
| 
 | |
| ;	MOVP	@(2/4,r7),A2P	; dst
 | |
| ;	MOVP	@(4/8,r7),A1	; src thing
 | |
| ;	MOVP	@(6/12,r7),A3P	; len
 | |
| 
 | |
| 	MOVP	A2P,A2P
 | |
| 	beq	quit
 | |
| 
 | |
| 	; A3 points to the end of the area
 | |
| 	MOVP	A0P,A3P
 | |
| 	ADDP	A2P,A3P
 | |
| 
 | |
| 	; see if we can do it in words
 | |
| 	; by oring in the start of the buffer to the end address
 | |
| 
 | |
| 	or	A0L,A2L
 | |
| 	btst	#0,A2L
 | |
| 	bne	byteloop
 | |
| 	
 | |
| 	; we can do it a word at a time
 | |
| 
 | |
| 	mov.b	A1L,A1H	
 | |
| 
 | |
| wordloop:
 | |
| 	mov.w	A1,@-A3P
 | |
| 	CMPP	A3P,A0P
 | |
| 	bne	wordloop
 | |
| quit:	rts	
 | |
| 
 | |
| byteloop:
 | |
| 	mov.b	A1L,@-A3P
 | |
| 	CMPP	A3P,A0P
 | |
| 	bne	byteloop
 | |
| 	rts
 | |
| 
 | |
| #endif
 |