-
#define B0 (0x55555555)
#define B1 (0x33333333)
#define B2 (0x0F0F0F0F)
x = (x + (x >> 16)) & B4;
return x;
}
-
-int computeparity(int x)
- x ^= x >> 16;
- x ^= x >> 8;
- x ^= x >> 4;
- x &= 0xf;
- return (0x6996 >> x) & 1;
-}
-
-void main(void) {
- countbits(B0);
- computeparity(B0);
- computeparity(B0+1);
-}
-
.data
-.align 32
-;#define B0 (0x55555555)
-B0:
-.dw 0x55555555
-;#define B1 (0x33333333)
-B1:
-.dw 0x33333333
-;#define B2 (0x0F0F0F0F)
-B2:
-.dw 0x0F0F0F0F
-;#define B3 (0x001F001F)
-B3:
-.dw 0x001F001F
-;#define B4 (0x0000003F)
-B4:
-.dw 0x0000003F
+B0: .fill 0x55555555
+B1: .fill 0x33333333
+B2: .fill 0x0F0F0F0F
+B3: .fill 0x001F001F
+B4: .fill 0x0000003F
.text
;x == r1
;load address of B0 into r3
- ldil r3,low(B0);
- ldih r3,high(B0);
+ ldil r3, B0@lo;
+ ldih r3, B0@hi;
;x = (x & B0) + ((x >> 1) & B0);
;r0 = (x >> 1)
lrs r0,r1,1;
;load B0 into r2
- ldx r2, r3;
+ ldw r2, 0(r3);
;(x >> 1) & B0
and r0, r0, r2;
add r0, r0, r1;
;load B1 into r2, use displacment for address of B1 (or add?)
- ldx r2, (r3)(B1-B0);
+ ldw r2, B1-B0(r3);
;x = (x & B1) + ((x >> 2) & B1);
lrs r1, r0, 2;
and r1, r1, r2;
-
and r0, r0, r2;
-
add r0, r0, r1;
;x = (x + (x >> 4)) & B2;
- ldx r2, (r3)(B2-B0);
+ ldw r2, B2-B0(r3);
lrs r1, r0, 4;
and r1, r1, r2;
and r0, r0, r2;
-
add r0, r0, r1;
;x = (x + (x >> 8)) /*& B3 */
lrs r1, r0, 8;
add r0, r0, r1;
- ldx r2, (r3)(B4-B0);
+ ldw r2, B4-B0(r3);
;x = (x + (x >> 16)) & B4;
lrs r1, r0, 16;
add r0, r0, r1;
;return x;
ret;
;}
-
-int computeparity(int x)
- x ^= x >> 16;
- x ^= x >> 8;
- x ^= x >> 4;
- x &= 0xf;
- return (0x6996 >> x) & 1;
-}
-
-void main(void) {
- countbits(B0);
- computeparity(B0);
- computeparity(B0+1);
-}
#define UART_RECV_NEW 1
/* TODO:
- * - need jump to register value
* - uart: clear new_receive bit after the byte is copied?
* (implementation issue...)
*/
;-----
send_word:
- ; TODO: loop? (less codesize...)
lrs r0, r1, 0
call send_byte
lrs r0, r1, 8
ret
-
;-----
bootrom:
call recv_byte
u8 palindrom(u8* str, u8 len) {
u8 *str1, *str2;
if (len == 0) {
- return 0;
+ return 1;
}
str1 = str;
str2 = str + len - 1;
; r1 = str addr
; r2 = str len (u8)
- ldi r0, 0
-
- cmp r1, 0
- retzs ; return 0 if strlen = 0
+ ldis r0, 0
+ cmpi r2, 0
+ ldiszsd r0, 1
+ retzs ; return 1 if strlen = 0
add r4, r1, r2 ; set r4 to end address
- subi r4, 1
+ subi r4, r4, 1
cmp r1, r4 ; if strlen = 1 return 1
brancheq- end
schleife:
- ldb r5, r1
- ldb r6, r4
+ ldb r5, 0(r1)
+ ldb r6, 0(r4)
cmp r5, r6
retnq ; return 0 when palindrom not satisfied
--- /dev/null
+int strncmp(const uint8_t *b1, const uint8_t *b2, size_t len)
+{
+ int diff=0;
+
+ for (;len && (*b1) && (*b2) && !(diff); --len) {
+ diff = b1++ - b2++;
+ }
+
+ return diff;
+}
-int strncmp(const uint8_t *b1, const uint8_t *b2, size_t len)
-{
- int diff=0;
-
-
- for (;len && (*b1) && (*b2) && !(diff); --len) {
- diff = b1[i] - b2[i];
- }
-
- return diff;
-}
-
-
-strncmp.s:
+strncmp:
ldis r5, 0 ;
-:strfor
+strfor:
ldis r0, 0 ;
-ldb r0, r1 ; r0 = (*b1)
-ldb r5, r2 ; r5 = (*b2)
-addi r3, 0 ; len == 0
-addinq r0, 0 ; (*b1) == 0
-addinq r5, 0 ; (*b2) == 0
+ldb r0, 0(r1) ; r0 = (*b1)
+ldb r5, 0(r2) ; r5 = (*b2)
+cmpi r3, 0 ; len == 0
+cmpinq r0, 0 ; (*b1) == 0
+cmpinq r5, 0 ; (*b2) == 0
ldiseq r0,0 ;
reteq ;
sub r0, r0, r5 ; diff = (*b1)-(*b2)
-addi r0,0 ; diff!=0
+cmpi r0, 0 ; diff!=0
retnq ;
-addi r1,1 ; ++b1
-addi r2,1 ; ++b2
-subi r3,1 ; ++len
+addi r1, r1 ,1 ; ++b1
+addi r2, r2, 1 ; ++b2
+subi r3, r3, 1 ; --len
branch strfor ;