Execute Computer/Zero: Difference between revisions
Content added Content deleted
(Applesoft BASIC) |
(implementation in Forth) |
||
Line 134: | 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 |
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> |
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}}== |
=={{header|J}}== |
||