From fd7f0e07db8024cdcbfb66b9c7997fdc119e053d Mon Sep 17 00:00:00 2001 From: privsk Date: Wed, 12 Nov 2025 09:01:11 +0100 Subject: [PATCH] napisal rec.asm --- ass1/rec.asm | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 ass1/rec.asm diff --git a/ass1/rec.asm b/ass1/rec.asm new file mode 100644 index 0000000..8a57514 --- /dev/null +++ b/ass1/rec.asm @@ -0,0 +1,136 @@ +rec START 0 + JSUB stackinit + +mainloop JSUB readnum + COMP #0 .if 0 halt + JEQ halt + JSUB fac + JSUB printnum + J mainloop + +readnum STL readret + LDA #0 + STA currentnum +readchar RD devFA + COMP #10 .stop reading if newline + JEQ endread + COMP #48 .stop reading if 0 + JEQ endread + SUB #48 + STA temp + LDA currentnum + MUL #10 + ADD temp + STA currentnum + J readchar +endread LDA currentnum + LDL readret + RSUB + +ending LDA temp + JSUB printnum + J mainloop + +printnum STL printret + STA num + LDA #0 + STA digitcnt +divloop LDA num + COMP #0 + JEQ checkzero + DIV #10 + STA quotient + MUL #10 + STA saveA + LDA num + SUB saveA + ADD #48 .convert to ascii number + STA @stkptr + JSUB push + LDA digitcnt + ADD #1 + STA digitcnt + LDA quotient + STA num + J divloop +checkzero LDA digitcnt + COMP #0 + JGT printloop + LDA #48 + WD devAA + LDL printret + RSUB +printloop LDA digitcnt + COMP #0 + JEQ printdone + LDB stkptr + COMPR X, B .stop print if stack empty + JEQ printdone + JSUB pop + WD devAA + LDA digitcnt + SUB #1 + STA digitcnt + J printloop +printdone LDL printret + LDA #0x0A .print newline + WD devAA + RSUB + +halt J halt + +fac COMP #1 .base case + JGT facrecur + LDA #1 + RSUB + + .only works for < 10 (24 bit registers) +facrecur JSUB push .recursive case + SUB #1 + JSUB fac + STA temp + STL lastJ .save jump register + LDB stkptr + COMPR X, B .exit if stack empty + JEQ ending + JSUB pop + MUL temp + LDL lastJ + RSUB + +push STA temp + STA @stkptr + LDA stkptr + ADD #3 + STA stkptr + LDA temp + RSUB + +pop STA temp + LDA stkptr + SUB #3 + STA stkptr + LDA @stkptr + RSUB + +stackinit STA temp + LDA #stack + STA stkptr + LDX stkptr + LDA temp + RSUB + +stkptr RESW 1 +temp RESW 1 +lastJ RESW 1 +printret RESW 1 +readret RESW 1 +currentnum RESW 1 +num RESW 1 +quotient RESW 1 +saveA RESW 1 +digitcnt RESW 1 +stack RESW 50 +devFA BYTE X'FA' +devAA BYTE X'AA' + END rec \ No newline at end of file