Browse code

More progress on assembler

Andrew Alderwick authored on 12/04/2021 20:01:36
Showing 2 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,14 @@
1
+%swap2 { SWP SWP2 }
2
+%swap4 { swap2 swap2 }
3
+%swap8 { swap4 swap4 }
4
+%swap16 { swap8 swap8 }
5
+
6
+%NOPa2r { NOP2r }
7
+
8
+;Hello { world 2 there 1 testing 10 }
9
+
10
+( references to variables (e.g. Hello.world) not implemented yet )
11
+
12
+NOPa2r
13
+swap16
14
+
... ...
@@ -3,6 +3,7 @@
3 3
 
4 4
 %HCF { #0000 DIV }
5 5
 %SHORT_FLAG { #20 }
6
+%RETURN_FLAG { #40 }
6 7
 
7 8
 ( devices )
8 9
 
... ...
@@ -23,19 +24,49 @@
23 24
 	,assembler-heap-start =assembler.heap
24 25
 	#0070 =assembler.addr
25 26
 
26
-	,$token ^assemble-token JSR
27
-	,$token2 ^assemble-token JSR
28
-	,$token3 ^assemble-token JSR
29
-	,$token4 ^assemble-token JSR
30
-	,$token5 ^assemble-token JSR
31
-	~assembler.state
27
+	,$read-filename =File.name
28
+	#1000 =File.length
29
+	#f000 =File.load
30
+
31
+	#f000 #1000 ^assemble-chunk JSR
32 32
 	HCF
33 33
 
34
-	$token [ 3b Hello 00 ]
35
-	$token2 [ 7b 00 ]
36
-	$token3 [ testing 00 ]
37
-	$token4 [ 30 00 ]
38
-	$token5 [ 7d 00 ]
34
+	$read-filename [ etc/assembler-test.usm 00 ]
35
+
36
+@assemble-chunk ( ptr* len* -- 00 if EOF found in chunk
37
+                            OR assembled-up-to-ptr* 01 if reached end of chunk )
38
+	OVR2 ADD2 STH2
39
+	#0001 SUB2
40
+
41
+	$per-token
42
+	DUP2 STH2
43
+
44
+	$loop
45
+	#0001 ADD2
46
+	DUP2 PEK2
47
+	#20 GTH ^$loop JNZ
48
+
49
+	DUP2 OVR2r STH2r LTS2 ^$valid JNZ
50
+	SWP2r POP2r POP2
51
+	STH2r #0001 ADD2
52
+	#01 JMP2r
53
+
54
+	$valid
55
+	DUP2 PEK2 #00 OVR2 POK2
56
+	STH2r #0001 ADD2 ^assemble-token JSR
57
+	^$per-token JNZ
58
+
59
+	POP2 POP2r #00 JMP2r
60
+
61
+@assemble-macro ( macro-ptr* -- )
62
+	DUP2 ,strlen JSR2 DUP2 #0000 EQU2 ^$end JNZ
63
+	OVR2 ^assemble-token JSR
64
+	ADD2 #0001 ADD2
65
+	^assemble-macro JMP
66
+
67
+	$end
68
+	POP2 POP2
69
+	JMP2r
39 70
 
40 71
 @assemble-token ( string-ptr* -- )
41 72
 	( get location of tree )
... ...
@@ -628,6 +659,7 @@
628 659
 	$end
629 660
 	DUP ^$loop JNZ
630 661
 	POP
662
+	~assembler.state #0c ORA =assembler.state
631 663
 	JMP2r
632 664
 
633 665
 (
... ...
@@ -656,7 +688,7 @@
656 688
 	JMP2r
657 689
 
658 690
 @macro-}   [ 0000 ]    [ 0000 ]    [ 7d ]
659
-	~assembler.heap DUP2 #f0 ROT ROT POK2
691
+	~assembler.heap DUP2 #00 ROT ROT POK2
660 692
 	#0001 ADD2 =assembler.heap
661 693
 	~assembler.state #fc AND =assembler.state
662 694
 	JMP2r
... ...
@@ -687,10 +719,40 @@
687 719
 	JMP2r
688 720
 
689 721
 @normal-main
690
-	,$string =Console.string
691
-	HCF
722
+	~assembler.token
723
+	,opcodes-tree OVR2 #03 ,traverse-tree JSR2
724
+	^$not-opcode JNZ
692 725
 
693
-	$string [ Not 20 implemented 0a 00 ]
726
+	,opcodes-asm SUB2 #0007 DIV2
727
+	SWP2 #0003 ADD2
728
+	$flags
729
+	DUP2 PEK2
730
+	DUP #00 EQU ^$end-flags JNZ
731
+	DUP #32 NEQ ^$not-two JNZ
732
+	POP SWP2 SHORT_FLAG ORA SWP2 #0001 ADD2 ^$flags JMP
733
+	$not-two
734
+	DUP #72 NEQ ^$not-r JNZ
735
+	POP SWP2 RETURN_FLAG ORA SWP2 #0001 ADD2 ^$flags JMP
736
+	$not-r
737
+	POP POP2 ~assembler.token SWP2
738
+	^$not-opcode JMP
739
+
740
+	$end-flags
741
+	POP POP2
742
+	,write-byte JSR2
743
+	POP
744
+	JMP2r
745
+
746
+	$not-opcode
747
+	POP2
748
+	,macro-tree SWP2 #ff ,traverse-tree JSR2
749
+	^$not-macro JNZ
750
+	,assemble-macro JMP2 ( tail call )
751
+
752
+	$not-macro
753
+	( FIXME complain about bad opcode / nonexistent macro )
754
+	POP2
755
+	JMP2r
694 756
 
695 757
 (
696 758
 	Here's the big set of trees relating to labels. Starting from l-root, all