#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