completed rec and again fixed echo

This commit is contained in:
Jaka Furlan 2025-11-08 17:05:13 +01:00
parent 8c8a68cb89
commit b16c3e23d8
6 changed files with 371 additions and 14 deletions

View file

7
FA.dev Normal file
View file

@ -0,0 +1,7 @@
1
2
3
4
5
6
0

View file

@ -2,9 +2,12 @@ echo START 0
start .LDCH txt
.JSUB char
.JSUB nl
LDA #txt
JSUB string
JSUB nl
.LDA #txt
.JSUB string
.JSUB nl
LDCH #12
JSUB num
halt J halt
@ -45,19 +48,63 @@ nl STB regB
string STA regA
STB regB
STT regT
STL regL
.STL regL
STS regS .shranimo registre
loop LDB #1
CLEAR A .da lahko comparamo z 0
LDCH @regA
COMP #0
JSUB char
WD #1
.add +1 to regA
LDA regA
ADD #1
STA regA
JGT loop
LDA regA .obnovimo registre
LDB regB
LDT regT
.LDL regL
LDS regS
RSUB
.izpiše število zapisano v A na std izhod
num STA regA
STB regB
STT regT
STL regL
STS regS .shranimo registre
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
LDA regA .obnovimo registre
LDB regB
LDT regT
@ -66,12 +113,14 @@ loop LDB #1
RSUB
.digits za num
digs RESB 5 .0 bo prazna za lazje izpisovanje
BYTE 0 .konec števke
.txt
txt BYTE C'hi'
BYTE 0
.parametri
param1 RESB 1
param2 RESB 2
.constante
newline BYTE 0x0D

View file

@ -1,11 +1,13 @@
prog START 0
JSUB sinit
LDA #5
prog START 0
zacetek CLEAR X
loop RD #0xFA
COMP #0
JEQ halt
JSUB fact
WD #1
J loop
halt J halt
halt J halt
.fakulteta
fact COMP #1

66
ass1/fact.asm Normal file
View file

@ -0,0 +1,66 @@
prog START 0
JSUB sinit
LDA #5
JSUB fact
halt J halt
.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
sinit STA stkA
LDA #stkRESW .inicializiraj stkp
STA stkp
LDA stkA
RSUB
spush STA stkA
LDA stkp .poveca stkp za 3
ADD #3
STA stkp
LDA stkA
RSUB
spop STA stkA
LDA stkp .zmanjsa stkp za 3
SUB #3
STA stkp
LDA stkA
RSUB
.podatki za sklad
stkp WORD 0
stkA WORD 0
stkRESW RESW 1000
END prog

233
ass1/rec.asm Normal file
View file

@ -0,0 +1,233 @@
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