From 1dcebfd73d57bdf50ab7ab818c0ada0d08612759 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 1 Nov 2010 00:40:55 +0100 Subject: [PATCH] 3a_asm/2_isa: fixed our examples --- 2_isa/src/bittwiddling.s | 6 ++--- 2_isa/src/bootrom.s | 52 ++++++++++++++++++++-------------------- 2_isa/src/palindrom.s | 8 +++---- 2_isa/src/strncmp.s | 5 ++-- 2_isa/src/umul.s | 24 +++++++++---------- 3a_asm/notes | 8 ++++--- 6 files changed, 53 insertions(+), 50 deletions(-) diff --git a/2_isa/src/bittwiddling.s b/2_isa/src/bittwiddling.s index 53861d5..d4ecc81 100644 --- a/2_isa/src/bittwiddling.s +++ b/2_isa/src/bittwiddling.s @@ -10,7 +10,7 @@ B4: .fill 0x0000003F ;int countbits(int x) { countbits: ;x == r1 - + ;load address of B0 into r3 ldil r3, B0@lo; ldih r3, B0@hi; @@ -18,7 +18,7 @@ countbits: ;x = (x & B0) + ((x >> 1) & B0); ;r0 = (x >> 1) lrs r0,r1,1; - + ;load B0 into r2 ldw r2, 0(r3); @@ -27,7 +27,7 @@ countbits: ;x & B0 and r1, r1, r2; - + ;x = (x & B0) + ((x >> 1) & B0); add r0, r0, r1; diff --git a/2_isa/src/bootrom.s b/2_isa/src/bootrom.s index d60c316..a18b1a6 100644 --- a/2_isa/src/bootrom.s +++ b/2_isa/src/bootrom.s @@ -27,30 +27,30 @@ timeout_loop: 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) @@ -73,11 +73,11 @@ recv_byte: 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 ;----- @@ -87,15 +87,15 @@ recv_word: 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 @@ -105,28 +105,28 @@ bootrom: 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 @@ -135,7 +135,7 @@ bt_W: stx r0, 0(r6) ldisl r1, 0x44 ; 'D' call send_byte - branch bootrom + br bootrom bt_R: call recv_word ; receive addr @@ -144,7 +144,7 @@ bt_R: call send_byte ldx r1, 0(r2) call send_word - branch bootrom + br bootrom bt_Q: call recv_word ; receive addr @@ -153,7 +153,7 @@ bt_Q: stw r0, 0(r6) ldisl r1, 0x41 ; 'A' call send_byte - branch bootrom + br bootrom bt_T: call recv_word ; receive addr @@ -162,10 +162,10 @@ bt_T: 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 diff --git a/2_isa/src/palindrom.s b/2_isa/src/palindrom.s index 1aa4051..ce03bb6 100755 --- a/2_isa/src/palindrom.s +++ b/2_isa/src/palindrom.s @@ -1,18 +1,18 @@ ; 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: @@ -27,7 +27,7 @@ schleife: cmp r1, r4 - branchlt+ schleife + brlt+ schleife end: diff --git a/2_isa/src/strncmp.s b/2_isa/src/strncmp.s index f4bce89..038cece 100644 --- a/2_isa/src/strncmp.s +++ b/2_isa/src/strncmp.s @@ -1,10 +1,11 @@ +.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 @@ -19,4 +20,4 @@ retnq ; addi r1, r1 ,1 ; ++b1 addi r2, r2, 1 ; ++b2 subi r3, r3, 1 ; --len -branch strfor ; +br strfor ; diff --git a/2_isa/src/umul.s b/2_isa/src/umul.s index 29749be..37e04d5 100644 --- a/2_isa/src/umul.s +++ b/2_isa/src/umul.s @@ -1,14 +1,14 @@ +.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 diff --git a/3a_asm/notes b/3a_asm/notes index 157d08b..be78258 100644 --- a/3a_asm/notes +++ b/3a_asm/notes @@ -13,20 +13,22 @@ Adressenaufloesung nicht mehr viel schief gehen. - .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* -- 2.25.1