From e9f04824eadf809bdb62cac7ebdd673d651ec0ed Mon Sep 17 00:00:00 2001 From: zxq5 Date: Thu, 26 Jun 2025 00:51:20 +0100 Subject: [PATCH] updates to dsa libs --- resources/dsa/lib/io/print.dsa | 36 ++++++++++++ resources/dsa/lib/maths/fib.dsa | 30 +++++++--- resources/dsa/{test.dsa => main.dsa} | 29 ++++------ resources/dsa/testprint.dsa | 83 ++++++++++++++++++++++++++++ 4 files changed, 152 insertions(+), 26 deletions(-) rename resources/dsa/{test.dsa => main.dsa} (67%) create mode 100644 resources/dsa/testprint.dsa diff --git a/resources/dsa/lib/io/print.dsa b/resources/dsa/lib/io/print.dsa index 1946fa9..bf7b73f 100644 --- a/resources/dsa/lib/io/print.dsa +++ b/resources/dsa/lib/io/print.dsa @@ -29,6 +29,8 @@ // jmp print::print_word // +include maths "../maths/core.dsa" + dw display: 0x20000 dw current: 0x20000 @@ -155,6 +157,40 @@ _print_hex_nibble_number: addi rg1, 1 return +// ------------------------------------------ +// print whitespace +print_whitespace: + push bpr + mov spr, bpr + + ldw current, rg1 + lli 0x20, rg0 + stb rg0, rg1 + addi rg1, 1 + jmp _end + +// ------------------------------------------ +// print newline +print_newline: + push bpr + mov spr, bpr + + ldw display, rg0 + ldw current, rg1 + sub rg1, rg0, rg0 + + lwi 80, rg2 + push rg0 + push rg2 + call maths::divmod + pop rg2 + addi rg2, 80 + ldw display, rg1 + add rg1, rg2, rg1 + + // _end saves the display state + jmp _end + // ------------------------------------------ // resets the cursor position on the screen to 0x20000. (0,0) reset: diff --git a/resources/dsa/lib/maths/fib.dsa b/resources/dsa/lib/maths/fib.dsa index d51c094..d0a6a2c 100644 --- a/resources/dsa/lib/maths/fib.dsa +++ b/resources/dsa/lib/maths/fib.dsa @@ -1,18 +1,30 @@ -fib_n: - pop ret - pop rg0 // n +include print "../io/print.dsa" + +fib_n: + push bpr + mov spr, bpr + + ldw bpr, rg1, 8 // load op 2 - lli 0, rg1 - lli 1, rg2 - start: + mov rg1, rg2 add rg1, rg2, acc + + pusha 4 push rg1 + call print::print_hex_word + pop rg1 + popa 4 + mov rg2, rg1 mov acc, rg2 - + cmp rg0, zero dec rg0 - + jgt start - jmp 4, ret \ No newline at end of file + + stw rg1, bpr, 8 + mov bpr, spr + pop bpr + return diff --git a/resources/dsa/test.dsa b/resources/dsa/main.dsa similarity index 67% rename from resources/dsa/test.dsa rename to resources/dsa/main.dsa index 67d82c6..e2d9c08 100644 --- a/resources/dsa/test.dsa +++ b/resources/dsa/main.dsa @@ -1,33 +1,28 @@ -include print "./lib/io/print.dsa" - dw idt: 0xFFFF0000 dw stack: 0x10000 -db interrupt: "INT: Hello world" - init: + // setup interrupt handlers + ldw idt, idr + lwi handle_hard_fault, rg0 + stw rg0, idr, 4 // set up a stack. ldw stack, bpr mov bpr, spr start: - ldw idt, idr - - lwi handle_hard_fault, rg0 - stw rg0, idr, 4 - - - lwi 0x1234abcd, rg0 - push rg0 - call print::print_hex_word - pop zero - hlt - + lwi 10, rg0 + push rg0 + call maths::fib_n + pop zero + hlt +// fault handler in case we fail DSA. dw hard_fault_err: "FATAL: Illegal Instruction or Memory Access!" handle_hard_fault: + call print::clear call print::reset lwi hard_fault_err, rg0 push rg0 call print::print pop zero - hlt + hlt \ No newline at end of file diff --git a/resources/dsa/testprint.dsa b/resources/dsa/testprint.dsa new file mode 100644 index 0000000..ad3601c --- /dev/null +++ b/resources/dsa/testprint.dsa @@ -0,0 +1,83 @@ +include print "./lib/io/print.dsa" + +dw idt: 0xFFFF0000 +dw stack: 0x10000 +init: + // setup interrupt handlers + ldw idt, idr + lwi handle_hard_fault, rg0 + stw rg0, idr, 4 + // set up a stack. + ldw stack, bpr + mov bpr, spr + + +db string: "I won, the game!" +db hexbyte: 0xab +dw hexword: 0x1234abcd +db replace: "I lost" + +start: + // test print string + lwi string, rg0 + push rg0 + call print::print + pop zero + + // test print hex byte. + ldb hexbyte, rg0 + push rg0 + call print::print_hex_byte + pop zero + + // test print hex word. + ldw hexword, rg0 + push rg0 + call print::print_hex_word + pop zero + + // test print char + lli 0x40, rg0 // print @ + push rg0 + call print::print_byte + pop zero + + // test newline + call print::print_newline + + lwi string rg0 + push rg0 + call print::print + + // test print word + lwi 0x31323334, rg0 // print 1234 + push rg0 + call print::print_word + pop zero + + // test reset cursor pos + call print::reset + + // test print string at reset pos + lwi replace, rg0 + push rg0 + call print::print + pop zero + + lli 3, rg0 + ldw rg0, rg0 + + hlt + + + +// fault handler in case we fail DSA. +dw hard_fault_err: "FATAL: Illegal Instruction or Memory Access!" +handle_hard_fault: + call print::clear + call print::reset + lwi hard_fault_err, rg0 + push rg0 + call print::print + pop zero + hlt