prog START 0 zacetek JSUB sinit .inicializiramo sklad .beremo iz 0xFA, dokler ne preberemo 0 loop3 CLEAR A JSUB rdNum COMP #0 JEQ halt JSUB fact JSUB num J loop3 halt J halt .beri število v A dokler ne naletiš na newline in jo pretvori v int rdNum STL @stkp JSUB spush STA @stkp JSUB spush STB @stkp JSUB spush CLEAR A CLEAR B .v B bomo shranili prebran rezultat LDS #10 .za množenje loop4 RD #0xFA COMP #0xD .beremo newline JEQ nwl .else MULR S, B SUB #0x30 .pretvorimo v int ADDR A, B J loop4 nwl RD #0xFA .prebre še 0x0A CLEAR A RMO B, A JSUB spop LDB @stkp JSUB spop .LDA @stkp da ne povozimo odgovora? JSUB spop LDL @stkp RSUB .fakulteta fact COMP #1 JGT rec LDA #1 .base case RSUB rec STL @stkp JSUB spush STA @stkp JSUB spush STB @stkp JSUB spush RMO A, B .shrani n v B SUB #1 .n-1 JSUB fact .fact(n-1) MULR B, A .n * fact(n-1) JSUB spop LDB @stkp JSUB spop .LDA @stkp da ne povozimo odgovora? JSUB spop LDL @stkp RSUB .rutine za sklad .inicializira kazalec na sklad sinit STA stkA LDA #stkRESW .inicializiraj stkp STA stkp LDA stkA RSUB .pusha na sklad, pred klicem te subrutine shrani na sklad kar želiš spush STA stkA LDA stkp .poveca stkp za 3 ADD #3 STA stkp LDA stkA RSUB .popa iz sklada, po koncu te subrutine iz sklada beri kar želš spop STA stkA LDA stkp .zmanjsa stkp za 3 SUB #3 STA stkp LDA stkA RSUB .nl nl STL @stkp JSUB spush STB @stkp .shranimo registre JSUB spush STT @stkp JSUB spush STS @stkp JSUB spush LDCH newline WD #1 LDX #1 LDCH newline, X WD #1 .obnovimo registre JSUB spop LDS @stkp JSUB spop LDT @stkp JSUB spop LDB @stkp JSUB spop LDL @stkp RSUB .string string STL @stkp JSUB spush STB @stkp .shranimo registre JSUB spush STT @stkp JSUB spush STS @stkp JSUB spush STA regA loop LDB #1 CLEAR A .da lahko comparamo z 0 LDCH @regA COMP #0 WD #1 .add +1 to regA LDA regA ADD #1 STA regA JGT loop LDA regA .obnovimo registre JSUB spop LDS @stkp JSUB spop LDT @stkp JSUB spop LDB @stkp JSUB spop LDL @stkp RSUB .izpiše število zapisano v A na std izhod num STL @stkp JSUB spush STB @stkp .shranimo registre JSUB spush STT @stkp JSUB spush STS @stkp JSUB spush LDX #4 .X steje stevke, 4 je zadnji index arraya velikosti 5 LDS #10 .za množenje/deljenje LDT #0x30 .za pretvorbo v ascii loop2 RMO A, B DIVR S, B .B = B/10 MULR S, B .B= B*10 SUBR B, A .A = ostanek ADDR T, A .pretvorimo A v ascii STCH digs, X .shranimo ascii ostanek .zmanjšamo X in primerjamo z #5 RMO X, A SUB #1 RMO A, X LDA #0 COMPR X, A RMO B, A .premaknemo kar je še potrebno izračunati v A DIVR S, A .A je sedaj naslednja števka JEQ loop2 JGT loop2 .kličemo string za izpis LDA #digs JSUB string JSUB nl JSUB spop LDS @stkp JSUB spop LDT @stkp JSUB spop LDB @stkp JSUB spop LDL @stkp RSUB .digits za num digs RESB 5 .0 bo prazna za lazje izpisovanje BYTE 0 .konec števke .constante newline BYTE 0x0D BYTE 0x0A .shramba za string regA WORD 0 .podatki za sklad stkp WORD 0 stkA WORD 0 stkRESW RESW 1000 END prog