;int countbits(int x) {
countbits:
;x == r1
-
+
;load address of B0 into r3
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
ldw r2, 0(r3);
;x & B0
and r1, r1, r2;
-
+
;x = (x & B0) + ((x >> 1) & B0);
add r0, r0, r1;
ldil r3, UART_STATUS@lo
ldih r3, UART_STATUS@hi
ldw r3, 0(r3)
- andi r3, r3, 1 << UART_RECV_NEW
- branchzs+ next; branch if zero
+ andx r3, 1 << UART_RECV_NEW
+ brzs+ next; branch if zero
call recv_byte
; we received the enter bootrom sign
- cmp r0, 0x48 ; 'H'
- brancheq- bt_H
+ cmpi r0, 0x48 ; 'H'
+ breq- bt_H
next:
subi r3, r3, 1
- branchnz+ timeout_loop
+ brnz+ timeout_loop
; call to default entry point
ldil r0, DEFAULT_PROG_START@lo
ldih r0, DEFAULT_PROG_START@hi
- branchreg r0
+ brr r0
;-----
send_byte:
ldil r3, UART_STATUS@lo
ldih r3, UART_STATUS@hi
ldw r3, 0(r3)
- andi r3, r3, 1 << UART_TRANS_EMPTY
- branchzs+ send_byte ; branch if zero
+ andx r3, 1 << UART_TRANS_EMPTY
+ brzs+ send_byte ; branch if zero
ldil r3, UART_TRANS@lo
ldih r3, UART_TRANS@hi
stb r1, 0(r3)
ldil r3, UART_STATUS@lo
ldih r3, UART_STATUS@hi
ldw r3, 0(r3)
- andi r3, r3, 1 << UART_RECV_NEW
- branchzs+ send_byte ; branch if zero
+ andx r3, 1 << UART_RECV_NEW
+ brzs+ send_byte ; branch if zero
ldil r3, UART_RECV@lo
ldih r3, UART_RECV@hi
- lwb r0, 0(r3)
+ ldb r0, 0(r3)
ret
;-----
or r0, r0, r1
call recv_byte
- sll r1, r1, 8
+ lls r1, r1, 8
or r0, r0, r1
call recv_byte
- sll r1, r1, 16
+ lls r1, r1, 16
or r0, r0, r1
call recv_byte
- sll r1, r1, 24
+ lls r1, r1, 24
or r0, r0, r1
ret
call recv_byte
cmpi r0, 0x57 ; 'W'
- brancheq- bt_W
+ breq- bt_W
cmpi r0, 0x52 ; 'R'
- brancheq- bt_R
+ breq- bt_R
cmpi r0, 0x51 ; 'Q'
- brancheq- bt_Q
+ breq- bt_Q
cmpi r0, 0x54 ; 'T'
- brancheq- bt_T
+ breq- bt_T
cmpi r0, 0x4a ; 'J'
- brancheq- bt_J
+ breq- bt_J
; cmpi r0, 0x48 ; 'H'
- ; brancheq bt_H
+ ; breq bt_H
; FALL THROUGH ;)
bt_H:
ldisl r1, 0x4f ; 'O'
call send_byte
- branch bootrom
+ br bootrom
bt_W:
call recv_word ; receive addr
stx r0, 0(r6)
ldisl r1, 0x44 ; 'D'
call send_byte
- branch bootrom
+ br bootrom
bt_R:
call recv_word ; receive addr
call send_byte
ldx r1, 0(r2)
call send_word
- branch bootrom
+ br bootrom
bt_Q:
call recv_word ; receive addr
stw r0, 0(r6)
ldisl r1, 0x41 ; 'A'
call send_byte
- branch bootrom
+ br bootrom
bt_T:
call recv_word ; receive addr
call send_byte
ldw r1, 0(r2)
call send_word
- branch bootrom
+ br bootrom
bt_J:
call recv_word
- branchreg r0
+ brr r0
; 102 instr. please update after modification
; palindrom checker
-
+.text
; r1 = str addr
; r2 = str len (u8)
ldis r0, 0
cmpi r2, 0
- ldiszsd r0, 1
+ ldiszs r0, 1
retzs ; return 1 if strlen = 0
add r4, r1, r2 ; set r4 to end address
subi r4, r4, 1
cmp r1, r4 ; if strlen = 1 return 1
- brancheq- end
+ breq- end
schleife:
cmp r1, r4
- branchlt+ schleife
+ brlt+ schleife
end:
+.text
strncmp:
ldis r5, 0 ;
strfor:
ldis r0, 0 ;
-ldb r0, 0(r1) ; r0 = (*b1)
+ldb r0, 0(r1)
ldb r5, 0(r2) ; r5 = (*b2)
cmpi r3, 0 ; len == 0
cmpinq r0, 0 ; (*b1) == 0
addi r1, r1 ,1 ; ++b1
addi r2, r2, 1 ; ++b2
subi r3, r3, 1 ; --len
-branch strfor ;
+br strfor ;
+.text
-
-.unsignedmul:
- ldis r3, 0 // counter initialisieren
- andx r2, 1 // test ob gerade oder ungerade
- addinzd r3, 1 // fals ungerade counter+1
- addnzd r0, r0, r1 // und c=c+a;
-.loop:
- cmp r2, r3 // compare counter == b
- addinzd r3, 2 // counter+2
- addnzd r0, r0, r1 // c=c+a;
- addnzd r0, r0, r1 // c=c+a;
- branchnz+d .loop // jump fals noch noch nicht fertig
+unsignedmul:
+ ldis r3, 0 ; counter initialisieren
+ andx r2, 1 ; test ob gerade oder ungerade
+ addidnz r3, r3, 1 ; fals ungerade counter+1
+ adddnz r0, r0, r1 ; und c=c+a;
+loop:
+ cmp r2, r3 ; compare counter == b
+ addidnz r3, r3, 2 ; counter+2
+ adddnz r0, r0, r1 ; c=c+a;
+ adddnz r0, r0, r1 ; c=c+a;
+ brnz+ loop ; jump fals noch noch nicht fertig
ret
- .data <- done (wenn man nett ist, springt man nicht lustig zwischen diesen
- .text <- done (sections hin und her... es *sollte* zwar gehen, aber [...] :p)
- .include <- TODO: zu umstaendlich? :/ Mal schaun ob mir eine einfache Loesung
- einfaellt.
+ einfaellt. Eventuell mit gcc drueberfahren
- .org <- done
- .fill aufloesen <- TODO: atm nur einmalig 32bit moeglich
- .define tabelle <- done
-- @hi und @lo behandeln? <- TODO: doch eher second stage
+- @hi und @lo behandeln? <- done
(2) Values die noch als String vorhanden ist, werden als instruction geparst.
- (vgl. 3. Spalte der 'itp;...' Ausgaben). second stage = BIG TODO
+ -> done
einschraenkungen atm:
- gleicher Namensraum fuer labels in .text und .data! wenn einer ein Label aus
.data laedt und dann aber eigentlich auf .text zugreift ist er selber schuld :/
- Expr geht zwar, aber nicht geklammert
+- In manchen situationen kanns den parser noch an den einen oder anderen Space
+ oder Tab herhauen, also lieb sein!
- viele viele mehr *testbench schreiben muss*