Execute Computer/Zero: Difference between revisions

implementation in Forth
(Applesoft BASIC)
(implementation in Forth)
Line 134:
400 DATA "LINKED LIST",45,111,69,112,71,0,78,0,171,79,192,46,224,32,0,28,1,0,0,0,6,0,2,26,5,20,3,30,1,22,4,24
500 DATA "PRISONER",0,0,224,0,0,35,157,178,35,93,174,33,127,65,194,32,127,64,192,35,93,33,126,99,</lang>
 
=={{header|Forth}}==
{{works with|gforth|0.7.3}}
<br>
<lang forth>#! /usr/bin/gforth
 
\ Execute Computer/Zero
 
\ reserve 32 cells for memory
 
CREATE MEMORY 32 cells allot
MEMORY 32 cells erase
 
 
\ gets the address of the memory cell with the given index
: mem ( ix - addr )
cells MEMORY +
;
 
\ splits a byte into instruction and argument
: instruction ( ix -> arg inst )
mem @ dup
32 mod swap
32 /
;
 
\ defines a program by giving its name and the 32 memory contents (in binary)
: PROGRAM ( "name" "b01" ... "b31" -- )
CREATE
base @ >r 2 base !
32 0 DO
BEGIN
parse-name
dup 0= WHILE
2drop refill drop
REPEAT
s>number? 2drop ,
LOOP
r> base !
DOES> ( -- n00 ... n31 )
32 0 DO
dup @ swap cell+
LOOP
drop
;
 
\ loads 32 bytes from the stack into memory
: >memory ( n00 ... n31 -- )
-1 31 -DO
i mem !
1 -LOOP
;
 
\ prints accumulator and program counter
: .acc-pc ( acc pc -- acc pc )
over 3 .r dup 3 .r
;
 
\ prints the argument
: .x ( x -- x )
dup 2 .r
;
 
\ performs one step of the simulation
: step ( acc pc -- acc' pc' )
.acc-pc ." : "
tuck instruction CASE
0 OF ." NOP " .x drop swap 1+ ENDOF
1 OF ." LDA " .x nip mem @ swap 1+ ENDOF
2 OF ." STA " .x over swap mem ! swap 1+ ENDOF
3 OF ." ADD " .x mem @ + 256 mod swap 1+ ENDOF
4 OF ." SUB " .x mem @ - 256 mod swap 1+ ENDOF
5 OF ." BRZ " .x over 0= if rot drop else drop swap 1+ then ENDOF
6 OF ." JMP " .x rot drop ENDOF
7 OF ." STP " .x drop nip -1 ENDOF
ENDCASE
." -> " .acc-pc
;
 
\ runs the simulation, starting with accumulator zero and program counter zero
: run ( -- acc )
0 0 cr
BEGIN
dup 0>= WHILE
step cr
REPEAT
drop
;
 
 
\ the five example programs
 
PROGRAM 2+2
00100011 01100100
11100000 00000010
00000010 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
 
PROGRAM 7*8
00101100 01101010
01001100 00101011
10001101 01001011
10101000 11000000
00101100 11100000
00001000 00000111
00000000 00000001
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
 
PROGRAM Fibonacci
00101110 01001111
01101101 01001110
00101111 01001101
00110000 10010001
10101011 01010000
11000000 00101110
11100000 00000001
00000001 00000000
00001000 00000001
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
 
PROGRAM List'
00101101 01101111
01000101 01110000
01000111 00000000
01001110 00000000
10101011 01001111
11000000 00101110
11100000 00100000
00000000 00011100
00000001 00000000
00000000 00000000
00000110 00000000
00000010 00011010
00000101 00010100
00000011 00011110
00000001 00010110
00000100 00011000
 
PROGRAM Prisoner
00000000 00000000
11100000 00000000
00100011 10011101
10110010 00100011
01011101 10101110
00100001 01111111
01000001 11000010
00100000 01111111
01000000 11000010
00100011 01011101
00100001 01111110
01100011 01000001
00100000 01111110
01100011 01000000
11000010 00000000
00000001 00000011
 
 
\ runs a program and drops the result
: run-sample-program ( -- )
>memory run drop
;
 
 
\ run the five example programs
 
2+2 run-sample-program
7*8 run-sample-program
Fibonacci run-sample-program
List' run-sample-program
Prisoner run-sample-program
 
bye
</lang>
 
{{out}}
0 0 : LDA 3 -> 2 1
2 1 : ADD 4 -> 4 2
4 2 : STP 0 -> 4 -1
 
0 0 : LDA 12 -> 0 1
0 1 : ADD 10 -> 8 2
8 2 : STA 12 -> 8 3
8 3 : LDA 11 -> 7 4
7 4 : SUB 13 -> 6 5
6 5 : STA 11 -> 6 6
6 6 : BRZ 8 -> 6 7
6 7 : JMP 0 -> 6 0
6 0 : LDA 12 -> 8 1
8 1 : ADD 10 -> 16 2
16 2 : STA 12 -> 16 3
16 3 : LDA 11 -> 6 4
6 4 : SUB 13 -> 5 5
5 5 : STA 11 -> 5 6
5 6 : BRZ 8 -> 5 7
5 7 : JMP 0 -> 5 0
5 0 : LDA 12 -> 16 1
16 1 : ADD 10 -> 24 2
24 2 : STA 12 -> 24 3
24 3 : LDA 11 -> 5 4
5 4 : SUB 13 -> 4 5
4 5 : STA 11 -> 4 6
4 6 : BRZ 8 -> 4 7
4 7 : JMP 0 -> 4 0
4 0 : LDA 12 -> 24 1
24 1 : ADD 10 -> 32 2
32 2 : STA 12 -> 32 3
32 3 : LDA 11 -> 4 4
4 4 : SUB 13 -> 3 5
3 5 : STA 11 -> 3 6
3 6 : BRZ 8 -> 3 7
3 7 : JMP 0 -> 3 0
3 0 : LDA 12 -> 32 1
32 1 : ADD 10 -> 40 2
40 2 : STA 12 -> 40 3
40 3 : LDA 11 -> 3 4
3 4 : SUB 13 -> 2 5
2 5 : STA 11 -> 2 6
2 6 : BRZ 8 -> 2 7
2 7 : JMP 0 -> 2 0
2 0 : LDA 12 -> 40 1
40 1 : ADD 10 -> 48 2
48 2 : STA 12 -> 48 3
48 3 : LDA 11 -> 2 4
2 4 : SUB 13 -> 1 5
1 5 : STA 11 -> 1 6
1 6 : BRZ 8 -> 1 7
1 7 : JMP 0 -> 1 0
1 0 : LDA 12 -> 48 1
48 1 : ADD 10 -> 56 2
56 2 : STA 12 -> 56 3
56 3 : LDA 11 -> 1 4
1 4 : SUB 13 -> 0 5
0 5 : STA 11 -> 0 6
0 6 : BRZ 8 -> 0 8
0 8 : LDA 12 -> 56 9
56 9 : STP 0 -> 56 -1
 
0 0 : LDA 14 -> 1 1
1 1 : STA 15 -> 1 2
1 2 : ADD 13 -> 2 3
2 3 : STA 14 -> 2 4
2 4 : LDA 15 -> 1 5
1 5 : STA 13 -> 1 6
1 6 : LDA 16 -> 8 7
8 7 : SUB 17 -> 7 8
7 8 : BRZ 11 -> 7 9
7 9 : STA 16 -> 7 10
7 10 : JMP 0 -> 7 0
7 0 : LDA 14 -> 2 1
2 1 : STA 15 -> 2 2
2 2 : ADD 13 -> 3 3
3 3 : STA 14 -> 3 4
3 4 : LDA 15 -> 2 5
2 5 : STA 13 -> 2 6
2 6 : LDA 16 -> 7 7
7 7 : SUB 17 -> 6 8
6 8 : BRZ 11 -> 6 9
6 9 : STA 16 -> 6 10
6 10 : JMP 0 -> 6 0
6 0 : LDA 14 -> 3 1
3 1 : STA 15 -> 3 2
3 2 : ADD 13 -> 5 3
5 3 : STA 14 -> 5 4
5 4 : LDA 15 -> 3 5
3 5 : STA 13 -> 3 6
3 6 : LDA 16 -> 6 7
6 7 : SUB 17 -> 5 8
5 8 : BRZ 11 -> 5 9
5 9 : STA 16 -> 5 10
5 10 : JMP 0 -> 5 0
5 0 : LDA 14 -> 5 1
5 1 : STA 15 -> 5 2
5 2 : ADD 13 -> 8 3
8 3 : STA 14 -> 8 4
8 4 : LDA 15 -> 5 5
5 5 : STA 13 -> 5 6
5 6 : LDA 16 -> 5 7
5 7 : SUB 17 -> 4 8
4 8 : BRZ 11 -> 4 9
4 9 : STA 16 -> 4 10
4 10 : JMP 0 -> 4 0
4 0 : LDA 14 -> 8 1
8 1 : STA 15 -> 8 2
8 2 : ADD 13 -> 13 3
13 3 : STA 14 -> 13 4
13 4 : LDA 15 -> 8 5
8 5 : STA 13 -> 8 6
8 6 : LDA 16 -> 4 7
4 7 : SUB 17 -> 3 8
3 8 : BRZ 11 -> 3 9
3 9 : STA 16 -> 3 10
3 10 : JMP 0 -> 3 0
3 0 : LDA 14 -> 13 1
13 1 : STA 15 -> 13 2
13 2 : ADD 13 -> 21 3
21 3 : STA 14 -> 21 4
21 4 : LDA 15 -> 13 5
13 5 : STA 13 -> 13 6
13 6 : LDA 16 -> 3 7
3 7 : SUB 17 -> 2 8
2 8 : BRZ 11 -> 2 9
2 9 : STA 16 -> 2 10
2 10 : JMP 0 -> 2 0
2 0 : LDA 14 -> 21 1
21 1 : STA 15 -> 21 2
21 2 : ADD 13 -> 34 3
34 3 : STA 14 -> 34 4
34 4 : LDA 15 -> 21 5
21 5 : STA 13 -> 21 6
21 6 : LDA 16 -> 2 7
2 7 : SUB 17 -> 1 8
1 8 : BRZ 11 -> 1 9
1 9 : STA 16 -> 1 10
1 10 : JMP 0 -> 1 0
1 0 : LDA 14 -> 34 1
34 1 : STA 15 -> 34 2
34 2 : ADD 13 -> 55 3
55 3 : STA 14 -> 55 4
55 4 : LDA 15 -> 34 5
34 5 : STA 13 -> 34 6
34 6 : LDA 16 -> 1 7
1 7 : SUB 17 -> 0 8
0 8 : BRZ 11 -> 0 11
0 11 : LDA 14 -> 55 12
55 12 : STP 0 -> 55 -1
 
0 0 : LDA 13 -> 32 1
32 1 : ADD 15 -> 60 2
60 2 : STA 5 -> 60 3
60 3 : ADD 16 -> 61 4
61 4 : STA 7 -> 61 5
61 5 : LDA 28 -> 1 6
1 6 : STA 14 -> 1 7
1 7 : LDA 29 -> 22 8
22 8 : BRZ 11 -> 22 9
22 9 : STA 15 -> 22 10
22 10 : JMP 0 -> 22 0
22 0 : LDA 13 -> 32 1
32 1 : ADD 15 -> 54 2
54 2 : STA 5 -> 54 3
54 3 : ADD 16 -> 55 4
55 4 : STA 7 -> 55 5
55 5 : LDA 22 -> 2 6
2 6 : STA 14 -> 2 7
2 7 : LDA 23 -> 26 8
26 8 : BRZ 11 -> 26 9
26 9 : STA 15 -> 26 10
26 10 : JMP 0 -> 26 0
26 0 : LDA 13 -> 32 1
32 1 : ADD 15 -> 58 2
58 2 : STA 5 -> 58 3
58 3 : ADD 16 -> 59 4
59 4 : STA 7 -> 59 5
59 5 : LDA 26 -> 3 6
3 6 : STA 14 -> 3 7
3 7 : LDA 27 -> 30 8
30 8 : BRZ 11 -> 30 9
30 9 : STA 15 -> 30 10
30 10 : JMP 0 -> 30 0
30 0 : LDA 13 -> 32 1
32 1 : ADD 15 -> 62 2
62 2 : STA 5 -> 62 3
62 3 : ADD 16 -> 63 4
63 4 : STA 7 -> 63 5
63 5 : LDA 30 -> 4 6
4 6 : STA 14 -> 4 7
4 7 : LDA 31 -> 24 8
24 8 : BRZ 11 -> 24 9
24 9 : STA 15 -> 24 10
24 10 : JMP 0 -> 24 0
24 0 : LDA 13 -> 32 1
32 1 : ADD 15 -> 56 2
56 2 : STA 5 -> 56 3
56 3 : ADD 16 -> 57 4
57 4 : STA 7 -> 57 5
57 5 : LDA 24 -> 5 6
5 6 : STA 14 -> 5 7
5 7 : LDA 25 -> 20 8
20 8 : BRZ 11 -> 20 9
20 9 : STA 15 -> 20 10
20 10 : JMP 0 -> 20 0
20 0 : LDA 13 -> 32 1
32 1 : ADD 15 -> 52 2
52 2 : STA 5 -> 52 3
52 3 : ADD 16 -> 53 4
53 4 : STA 7 -> 53 5
53 5 : LDA 20 -> 6 6
6 6 : STA 14 -> 6 7
6 7 : LDA 21 -> 0 8
0 8 : BRZ 11 -> 0 11
0 11 : LDA 14 -> 6 12
6 12 : STP 0 -> 6 -1
 
0 0 : NOP 0 -> 0 1
0 1 : NOP 0 -> 0 2
0 2 : STP 0 -> 0 -1
 
=={{header|J}}==
 
22

edits