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