From 06aa39473a7ec48b003e2c3e2bd4b73ec5b40ab6 Mon Sep 17 00:00:00 2001 From: zanostro Date: Sat, 15 Nov 2025 11:18:11 +0100 Subject: [PATCH] added rec and updated gitignore to ignore device files --- .gitignore | 2 + ass1/print.asm | 23 +++++ ass1/rec.asm | 223 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 248 insertions(+) create mode 100644 ass1/print.asm create mode 100644 ass1/rec.asm diff --git a/.gitignore b/.gitignore index dbda62e..7be8ac1 100644 --- a/.gitignore +++ b/.gitignore @@ -19,5 +19,7 @@ node_modules/ __pycache__/ *.pyc + +*.dev autotester sictools.jar diff --git a/ass1/print.asm b/ass1/print.asm new file mode 100644 index 0000000..4b7d0ae --- /dev/null +++ b/ass1/print.asm @@ -0,0 +1,23 @@ +.code +prog START 0 + + LDX #0 + +loop LDCH msg,X + WD #0xAA + + TIX msglen + JLT loop + + LDA #0x0D + WD #0xAA + LDA #0x0A + WD #0xAA + +halt J halt + +.data +msg BYTE C'SIC/XE' +msglen WORD 6 + + END prog diff --git a/ass1/rec.asm b/ass1/rec.asm new file mode 100644 index 0000000..212bf23 --- /dev/null +++ b/ass1/rec.asm @@ -0,0 +1,223 @@ +prog START 0 + +.------------------------------------------- +. MAIN LOOP +. +. Psevdo: +. sp = 0 +. while true: +. n = readFA() +. if n == 0: halt +. acc = 1 +. fact() ; rekurzivno: acc = n! +. printStdout(acc) +.------------------------------------------- + CLEAR A + STA sp + +loop JSUB readFA + COMP #0 + JEQ halt + + STA n + LDA #1 + STA acc + + JSUB fact + LDA acc + JSUB printStdout + + J loop + +halt J halt + +.------------------------------------------- +. readFA +. +. Psevdo: +. B = 0 +. while true: +. ch = RD(FA) +. if ch == CR or ch == LF: break +. digit = ch - '0' +. B = B * 10 + digit +. return B +.------------------------------------------- +readFA CLEAR B + LDS #10 + +rd_loopFA RD #0xFA + COMP #0x0D . CR? + JEQ rd_doneCR_FA + COMP #0x0A . LF? + JEQ rd_doneFA + + SUB #0x30 + MULR S,B . B = B * 10 + ADDR A,B . B = B + digit + J rd_loopFA + +rd_doneCR_FA RD #0xFA . pogoltni LF po CR +rd_doneFA CLEAR A + RMO B,A + RSUB + +.------------------------------------------- +. fact +. +. Psevdo (globalni n, acc, sklad L): +. fact(): +. push(L) +. if n <= 1: +. pop(L); return +. acc = acc * n +. n = n - 1 +. fact() +. pop(L); return +.------------------------------------------- +fact . push L + LDA sp + ADD #3 + STA sp + LDX sp + STL stackL,X + + LDA n + COMP #1 + JGT fact_rec + + . base case: n <= 1 + LDX sp + LDL stackL,X + LDA sp + SUB #3 + STA sp + RSUB + +fact_rec . recursive case: acc *= n; n--; fact() + + LDB acc + LDS n + MULR S,B + STB acc + + LDA n + SUB #1 + STA n + + JSUB fact + + . pop L in return to caller + LDX sp + LDL stackL,X + LDA sp + SUB #3 + STA sp + RSUB + +.------------------------------------------- +. printStdout +. +. Psevdo: +. if A == 0: +. print "0\n" +. return +. ps_val = A +. ps_len = 0 +. while ps_val > 0: +. q = ps_val / 10 +. r = ps_val % 10 +. buf[ps_len] = '0' + r +. ps_len++ +. ps_val = q +. for i = ps_len-1 .. 0: +. print buf[i] +. print "\r\n" +.------------------------------------------- +printStdout COMP #0 + JEQ ps_zero + + STA ps_val + LDA #0 + STA ps_len + LDS #10 + LDT #0x30 . '0' + +ps_div LDA ps_val + COMP #0 + JEQ ps_divdone + + RMO A,B + DIVR S,B . kvocient v B + RMO B,X . X = kvocient + + MULR S,B + SUBR B,A . A = ostanek + ADDR T,A . A = '0' + ostanek + STA psdigit + + LDA ps_len + STA ps_idx + LDA #psbuf + ADD ps_idx + STA ps_ptr + LDA psdigit + STCH @ps_ptr + + LDA ps_len + ADD #1 + STA ps_len + + RMO X,A + STA ps_val + J ps_div + +ps_divdone LDA ps_len + SUB #1 + STA ps_idx + +ps_print LDA ps_idx + COMP #0 + JLT ps_end + + LDA #psbuf + ADD ps_idx + STA ps_ptr + LDCH @ps_ptr + WD #1 + + LDA ps_idx + SUB #1 + STA ps_idx + J ps_print + +ps_end LDA #0x0D . CR + WD #1 + LDA #0x0A . LF + WD #1 + RSUB + +ps_zero LDA #0x30 . "0" + WD #1 + LDA #0x0D + WD #1 + LDA #0x0A + WD #1 + RSUB + +.data +. rekurzija faktoriala +sp WORD 0 . stack pointer +n WORD 0 +acc WORD 0 . akumulator za faktorial +stackL RESB 60 + +. printStdout +ps_val WORD 0 +ps_len WORD 0 +ps_idx WORD 0 +psdigit WORD 0 +ps_ptr WORD 0 +psbuf RESB 12 + + END prog