implement prefix calculator
This commit is contained in:
parent
09178c6d94
commit
76257daea8
3 changed files with 226 additions and 2 deletions
31
calculator/README.md
Normal file
31
calculator/README.md
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Calculator
|
||||||
|
|
||||||
|
This program accepts an arithmetic expression in prefix notation
|
||||||
|
on standard input and prints the result on standard output.
|
||||||
|
|
||||||
|
Supported operations:
|
||||||
|
|
||||||
|
- Addition
|
||||||
|
- Subtraction
|
||||||
|
- Multiplication
|
||||||
|
- Division
|
||||||
|
|
||||||
|
All calculations are preformed on Integers in range $[-2^{23}, 2^{23} - 1]$. Negative numbers can be written as `(- 0 n)`, where `n` is the number
|
||||||
|
|
||||||
|
Here are some examples:
|
||||||
|
|
||||||
|
```{bash}
|
||||||
|
(* 21 2)
|
||||||
|
00000042
|
||||||
|
(/ 6 (* 2 (+ 2 1)))
|
||||||
|
00000001
|
||||||
|
(* (/ 6 2) (+ 2 1))
|
||||||
|
00000009
|
||||||
|
(- 33 (* 4 25))
|
||||||
|
-00000067
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- Source code: calc.asm
|
||||||
|
- Frequency: any (faster is faster)
|
||||||
|
- Author: Jakob Jesenko, 2026
|
||||||
193
calculator/calc.asm
Normal file
193
calculator/calc.asm
Normal file
|
|
@ -0,0 +1,193 @@
|
||||||
|
calc START 0
|
||||||
|
nextln LDA #stack
|
||||||
|
STA sp
|
||||||
|
CLEAR A
|
||||||
|
STA ldigit
|
||||||
|
readlp TD stdin
|
||||||
|
JEQ readlp
|
||||||
|
CLEAR A
|
||||||
|
RD stdin
|
||||||
|
COMP #0
|
||||||
|
JEQ halt
|
||||||
|
COMP white .whitespace (parse number?)
|
||||||
|
JEQ newexp
|
||||||
|
COMP opn . (
|
||||||
|
JEQ newexp
|
||||||
|
COMP cls . )
|
||||||
|
JEQ endexp
|
||||||
|
COMP plus . +
|
||||||
|
JEQ pplus
|
||||||
|
COMP minus . -
|
||||||
|
JEQ pminus
|
||||||
|
COMP times . *
|
||||||
|
JEQ ptimes
|
||||||
|
COMP slash . /
|
||||||
|
JEQ pslash
|
||||||
|
COMP lnfeed . \n
|
||||||
|
JEQ prtres
|
||||||
|
J pdigit
|
||||||
|
|
||||||
|
|
||||||
|
newexp CLEAR A
|
||||||
|
STA ldigit
|
||||||
|
J readlp
|
||||||
|
endexp CLEAR A
|
||||||
|
STA ldigit
|
||||||
|
LDA sp
|
||||||
|
SUB #3
|
||||||
|
STA sp
|
||||||
|
LDS @sp
|
||||||
|
SUB #3
|
||||||
|
STA sp
|
||||||
|
LDT @sp
|
||||||
|
SUB #3
|
||||||
|
STA sp
|
||||||
|
LDA @sp
|
||||||
|
COMP plus . +
|
||||||
|
JEQ xplus
|
||||||
|
COMP minus . -
|
||||||
|
JEQ xminus
|
||||||
|
COMP times . *
|
||||||
|
JEQ xtimes
|
||||||
|
COMP slash . /
|
||||||
|
JEQ xslash
|
||||||
|
pres STT @sp
|
||||||
|
LDA sp
|
||||||
|
ADD #3
|
||||||
|
STA sp
|
||||||
|
J readlp
|
||||||
|
|
||||||
|
pplus CLEAR A
|
||||||
|
STA ldigit
|
||||||
|
LDA plus
|
||||||
|
STA @sp
|
||||||
|
LDA sp
|
||||||
|
ADD #3
|
||||||
|
STA sp
|
||||||
|
J readlp
|
||||||
|
pminus CLEAR A
|
||||||
|
STA ldigit
|
||||||
|
LDA minus
|
||||||
|
STA @sp
|
||||||
|
LDA sp
|
||||||
|
ADD #3
|
||||||
|
STA sp
|
||||||
|
J readlp
|
||||||
|
ptimes CLEAR A
|
||||||
|
STA ldigit
|
||||||
|
LDA times
|
||||||
|
STA @sp
|
||||||
|
LDA sp
|
||||||
|
ADD #3
|
||||||
|
STA sp
|
||||||
|
J readlp
|
||||||
|
pslash CLEAR A
|
||||||
|
STA ldigit
|
||||||
|
LDA slash
|
||||||
|
STA @sp
|
||||||
|
LDA sp
|
||||||
|
ADD #3
|
||||||
|
STA sp
|
||||||
|
J readlp
|
||||||
|
pdigit SUB zero
|
||||||
|
RMO A,B
|
||||||
|
LDA ldigit
|
||||||
|
COMP #1
|
||||||
|
JEQ pndgit
|
||||||
|
pcdgit RMO B,A
|
||||||
|
STA @sp
|
||||||
|
LDA sp
|
||||||
|
ADD #3
|
||||||
|
STA sp
|
||||||
|
LDA #1
|
||||||
|
STA ldigit
|
||||||
|
J readlp
|
||||||
|
pndgit LDA sp
|
||||||
|
SUB #3
|
||||||
|
STA sp
|
||||||
|
LDA @sp
|
||||||
|
MUL #10
|
||||||
|
ADDR A,B
|
||||||
|
J pcdgit
|
||||||
|
|
||||||
|
xplus ADDR S,T
|
||||||
|
J pres
|
||||||
|
xminus SUBR S,T
|
||||||
|
J pres
|
||||||
|
xtimes MULR S,T
|
||||||
|
J pres
|
||||||
|
xslash DIVR S,T
|
||||||
|
J pres
|
||||||
|
|
||||||
|
prtres LDB #base
|
||||||
|
STB bp
|
||||||
|
LDA sp
|
||||||
|
SUB #3
|
||||||
|
STA sp
|
||||||
|
LDA @sp
|
||||||
|
AND negsgn
|
||||||
|
COMP negsgn
|
||||||
|
JEQ prtneg
|
||||||
|
prtnxt LDA @bp
|
||||||
|
COMP #0
|
||||||
|
JEQ prtext
|
||||||
|
LDA @sp
|
||||||
|
DIV @bp
|
||||||
|
ADD zero
|
||||||
|
WD stdout
|
||||||
|
SUB zero
|
||||||
|
LDB @bp
|
||||||
|
MULR B,A
|
||||||
|
LDB @sp
|
||||||
|
SUBR A,B
|
||||||
|
STB @sp
|
||||||
|
LDA bp
|
||||||
|
ADD #3
|
||||||
|
STA bp
|
||||||
|
J prtnxt
|
||||||
|
prtext
|
||||||
|
LDA lnfeed
|
||||||
|
WD stdout
|
||||||
|
J nextln
|
||||||
|
prtneg
|
||||||
|
LDA minus
|
||||||
|
WD stdout
|
||||||
|
LDA #0
|
||||||
|
SUB #1
|
||||||
|
LDS @sp
|
||||||
|
MULR S,A
|
||||||
|
STA @sp
|
||||||
|
J prtnxt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
halt J halt
|
||||||
|
|
||||||
|
stdin BYTE 0x00
|
||||||
|
stdout BYTE 0x01
|
||||||
|
zero WORD 48
|
||||||
|
lnfeed WORD 10
|
||||||
|
white WORD 32
|
||||||
|
opn WORD 40
|
||||||
|
cls WORD 41
|
||||||
|
plus WORD 43
|
||||||
|
minus WORD 45
|
||||||
|
times WORD 42
|
||||||
|
slash WORD 47
|
||||||
|
|
||||||
|
ldigit WORD 0
|
||||||
|
negsgn WORD 0x800000
|
||||||
|
|
||||||
|
bp RESW 1
|
||||||
|
base WORD 10000000
|
||||||
|
WORD 1000000
|
||||||
|
WORD 100000
|
||||||
|
WORD 10000
|
||||||
|
WORD 1000
|
||||||
|
WORD 100
|
||||||
|
WORD 10
|
||||||
|
WORD 1
|
||||||
|
WORD 0
|
||||||
|
|
||||||
|
sp RESW 1
|
||||||
|
stack RESW 256
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
# PPM image viewer
|
# PPM image viewer
|
||||||
|
|
||||||
Reads a ppm image from an input device (AF.dev by default)
|
Reads a ppm image from an input device (AF.dev by default)
|
||||||
and displays it on SicTools builtin graphical screen.
|
and displays it on SicTools builtin graphical screen.
|
||||||
|
|
||||||
To resize and convert your image you can use ffmpeg:
|
To resize and convert your image you can use ffmpeg:
|
||||||
|
|
||||||
```{sh}
|
```{sh}
|
||||||
ffmpeg -i image.png -vf scale="64x-1" AF.ppm && mv AF.ppm AF.dev
|
ffmpeg -i image.png -vf scale="64x-1" AF.ppm && mv AF.ppm AF.dev
|
||||||
```
|
```
|
||||||
|
|
@ -13,4 +14,3 @@ ffmpeg -i image.png -vf scale="64x-1" AF.ppm && mv AF.ppm AF.dev
|
||||||
- dimensions can be adjusted by changing their values in code
|
- dimensions can be adjusted by changing their values in code
|
||||||
- Frequency: any
|
- Frequency: any
|
||||||
- Author: Jakob Jesenko, 2026
|
- Author: Jakob Jesenko, 2026
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue