annotate code/gqc.tp @ 56:fde898a3cbbe

Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
author Michael Pavone <pavone@retrodev.com>
date Sun, 27 Jul 2014 19:52:30 -0700
parents 194a1414e240
children d35601d47db1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 mem <- :_addr {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #{
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 addr <- { _addr }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 string <- { "[" . _addr . "]" }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 isReg? <- { false }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 reg? <- :val {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 (object does: val understand?: "isReg?") && (val isReg?)
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 reg <- :_num {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 #{
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 num <- { _num }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 string <- { (#["a" "b" "c" "d" "e" "f" "g" "h" "pc"]) get: _num }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 isReg? <- { true }
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
17 != <- :other { (not: (reg?: other)) || _num != (other num) }
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 = <- :other { (reg?: other) && _num = (other num) }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 inst <- :_name _args {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 #{
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 name <- _name
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 args <- _args
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 translateLabels <- :labelDict {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 missing <- #[]
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
27 args <- args map: :arg {
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 if: (object does: arg understand?: "isString?") && (arg isString?) {
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
29 labelDict get: arg else: {
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 missing append: arg
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
31 arg
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 }
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
33 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
34 arg
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 missing
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 label <- ""
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 comment <- ""
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 string <- {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 (if: label != "" { ";" . label . "\n " } else: { " " }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43 ) . name . " " . (args join: ", ") . (
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 if: comment = "" { "" } else: { " ;" . comment})
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 _nextLabel <- 0
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 _setLabel <- :inst {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 inst
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 prog <- #{
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 instructions <- #[]
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 add <- :inst {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 instructions append: (_setLabel: inst)
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 makeLabel <- :suffix {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 num <- _nextLabel
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 _nextLabel <- _nextLabel + 1
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 "" . num . "_" . suffix
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 labels <- dict hash
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 setLabel <- :name {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 labels set: name pc
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 _setLabel <- :inst {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 _setLabel <- :i { i }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 inst label!: name
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 pc <- { instructions length }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 print <- {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 foreach: instructions :idx i {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 missing <- i translateLabels: labels
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 if: (missing length) > 0 {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 error: "Undefined labels " . (missing join: ", ") . " at address " . idx
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 print: (string: i) . "\n"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 error <- :msg {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 (file stderr) write: "Error - " . msg . "\n"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 _nextVar <- 0
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 //a and b are reserved for int/return values
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 //h is reserved as a stack pointer
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
88 _allTemp <- [
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 reg: 2
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 reg: 3
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 reg: 4
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 reg: 5
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 reg: 6
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 ]
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
95 _tempRegs <- _allTemp
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 _exprHandlers <- dict hash
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 compileExpr:syms <- :expr :syms {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 _exprHandlers ifget: (expr nodeType) :handler {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 handler: expr syms
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 } else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 error: "Unhandled node type " . (expr nodeType)
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 _exprHandlers set: (ast intlit) :expr syms {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 expr val
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 _opNames <- dict hash
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 _opNames set: "+" "ADD"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 _opNames set: "-" "SUB"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 _opNames set: "*" "MUL"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115 _opNames set: "/" "DIV"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 _opNames set: "and" "AND"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 _opNames set: "or" "OR"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 _opNames set: "xor" "XOR"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 _exprHandlers set: (ast binary) :expr syms {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 startTempRegs <- _tempRegs
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 l <- compileExpr: (expr left) syms: syms
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 r <- compileExpr: (expr right) syms: syms
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 dest <- l
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 if: (reg?: l) {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 _tempRegs <- startTempRegs filter: :r { r != l }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 } else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 dest <- startTempRegs value
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 prog add: (inst: "MOV" #[
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 dest
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 l
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 ])
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 _tempRegs <- startTempRegs tail
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 _opNames ifget: (expr op) :i {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 prog add: (inst: i #[
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 dest
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 r
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 ])
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 dest
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 } else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 error: "operator " . (expr op) . " is not supported"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 _exprHandlers set: (ast sym) :expr syms {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 syms ifDefined: (expr name) :info {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 info def
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 } else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 error: "symbol " . (expr name) . " is not defined"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 _exprHandlers set: (ast assignment) :expr syms {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 sym <- expr to
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 syms ifDefined: (sym name) :info {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 } else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 syms define: (sym name) (mem: _nextVar)
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 _nextVar <- _nextVar + 1
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 info <- syms find: (sym name) else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 error: "this should never happen!"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 startTempRegs <- _tempRegs
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 v <- compileExpr: (expr assign) syms: syms
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 _tempRegs <- startTempRegs
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 dest <- info def
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 prog add: (inst: "MOV" #[
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 dest
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 v
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 ])
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 dest
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
175 _funHandlers <- dict hash
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
176 //provide symbolic names for all the interupt routines
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
177 _funHandlers set: "debug" :args syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
178 prog add: (inst: "INT" #[8])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
179 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
180 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
181 _funHandlers set: "direction!" :args syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
182 dir <- args value
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
183 startTempRegs <- _tempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
184 v <- compileExpr: dir syms: syms
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
185 _tempRegs <- startTempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
186 if: (reg: 0) != v {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
187 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
188 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
189 v
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
190 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
191 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
192 prog add: (inst: "INT" #[0])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
193 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
194 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
195 _funHandlers set: "lambdamanPos" :args syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
196 prog add: (inst: "INT" #[1])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
197 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
198 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
199 _funHandlers set: "lambdaman2Pos" :args syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
200 prog add: (inst: "INT" #[2])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
201 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
202 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
203 _funHandlers set: "me" :args syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
204 prog add: (inst: "INT" #[3])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
205 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
206 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
207 foreach: #["ghostStartPos" "ghostPos" "ghostStatus"] :idx name {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
208 intNum <- idx + 4
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
209 _funHandlers set: name :args syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
210 ghostIdx <- args value
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
211 startTempRegs <- _tempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
212 v <- compileExpr: ghostIdx syms: syms
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
213 _tempRegs <- startTempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
214 if: (reg: 0) != v {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
215 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
216 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
217 v
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
218 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
219 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
220 prog add: (inst: "INT" #[intNum])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
221 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
222 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
223 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
224 _funHandlers set: "mapContentsAt" :args syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
225 x <- args value
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
226 y <- (args tail) value
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
227 startTempRegs <- _tempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
228 x <- compileExpr: x syms: syms
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
229 y <- compileExpr: y syms: syms
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
230 _tempRegs <- startTempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
231 if: (reg: 0) != x {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
232 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
233 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
234 x
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
235 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
236 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
237 if: (reg: 1) != y {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
238 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
239 reg: 1
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
240 y
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
241 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
242 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
243 prog add: (inst: "INT" #[7])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
244 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
245 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
246
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
247 //allow access to raw instructions
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
248 foreach: #["MOV" "INC" "DEC" "ADD" "SUB" "MUL" "DIV" "AND" "OR" "XOR" "JLT" "JEQ" "JGT" "HLT"] :idx instName {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
249 _funHandlers set: instName :args syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
250 saveTempRegs <- _tempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
251 args <- args map: :arg { compileExpr: arg syms: syms }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
252 prog add: (inst: instName args)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
253 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
254 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
255
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
256 _funHandlers set: "while:do" :args syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
257 cond <- ((args value) expressions) value
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
258 body <- ((args tail) value) expressions
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
259
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
260 if: (cond nodeType) = (ast binary) {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
261 top <- prog makeLabel: "loop_top"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
262 end <- prog makeLabel: "loop_end"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
263 prog setLabel: top
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
264
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
265 saveTempRegs <- _tempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
266 l <- compileExpr: (cond left) syms: syms
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
267 r <- compileExpr: (cond right) syms: syms
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
268 _tempRegs <- saveTempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
269
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
270 ok <- true
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
271 //we need the inverse check in the instruction since a true condition
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
272 //means continue the loop, whereas we need a jump instruction that jumps
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
273 //only when it is time to exit
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
274 if: (cond op) = ">=" {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
275 prog add: (inst: "JLT" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
276 end
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
277 l
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
278 r
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
279 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
280 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
281 if: (cond op) = "<=" {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
282 prog add: (inst: "JGT" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
283 end
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
284 l
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
285 r
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
286 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
287 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
288 if: (cond op) = "!=" {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
289 prog add: (inst: "JEQ" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
290 end
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
291 l
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
292 r
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
293 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
294 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
295 if: (cond op) = ">" {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
296 bodyLbl <- prog makeLabel: "loop_body"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
297 prog add: (inst: "JGT" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
298 bodyLbl
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
299 l
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
300 r
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
301 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
302 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
303 reg: 8
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
304 end
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
305 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
306 prog setLabel: bodyLbl
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
307 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
308 if: (cond op) = "<" {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
309 bodyLbl <- prog makeLabel: "loop_body"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
310 prog add: (inst: "JLT" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
311 bodyLbl
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
312 l
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
313 r
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
314 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
315 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
316 reg: 8
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
317 end
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
318 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
319 prog setLabel: bodyLbl
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
320 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
321 bodyLbl <- prog makeLabel: "loop_body"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
322 if: (cond op) = "=" {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
323 prog add: (inst: "JEQ" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
324 bodyLbl
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
325 l
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
326 r
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
327 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
328 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
329 reg: 8
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
330 end
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
331 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
332 prog setLabel: bodyLbl
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
333 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
334 ok <- false
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
335 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
336 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
337 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
338 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
339 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
340 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
341 if: ok {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
342 //TODO: do 2 passes for labels to allow forward references
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
343 foreach: body :idx expr {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
344 if: (expr nodeType) = (ast sym) {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
345 //allow using bare symbols to define labels
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
346 lbl <- prog makeLabel: (expr name)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
347 prog setLabel: lbl
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
348 syms define: (expr name) lbl
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
349 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
350 saveTempRegsExpr <- _tempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
351 v <- compileExpr: expr syms: syms
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
352 _tempRegs <- saveTempRegsExpr
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
353 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
354 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
355 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
356 reg: 8
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
357 top
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
358 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
359 prog setLabel: end
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
360 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
361 error: "Condition parameter to while:do must be a comparison operator expression"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
362 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
363 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
364 error: "Condition parameter to while:do must be a comparison operator expression"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
365 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
366 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
367
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
368 _exprHandlers set: (ast call) :expr syms {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
369 tc <- (expr tocall)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
370 if: (tc nodeType) = (ast sym) {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
371 _funHandlers ifget: (tc name) :handler {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
372 handler: (expr args) syms
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
373 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
374 syms ifDefined: (tc name) :info {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
375 saveTempRegs <- _tempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
376 funArgs <- (expr args) map: :arg { compileExpr: arg syms: syms}
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
377 _tempRegs <- saveTempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
378
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
379 //save registers that need it
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
380 needSave <- _allTemp filter: :r {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
381 not: (_tempRegs contains?: r)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
382 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
383 foreach: needSave :idx r {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
384 prog add: (inst: "DEC" #[(reg: 7)])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
385 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
386 mem: (reg: 7)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
387 r
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
388 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
389 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
390 after <- prog makeLabel: "after_call"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
391 //save PC value after call
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
392 prog add: (inst: "DEC" #[(reg: 7)])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
393 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
394 mem: (reg: 7)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
395 after
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
396 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
397 //put arguments into the appropriate registers
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
398 passregs <- _allTemp
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
399 foreach: funArgs :idx arg {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
400 passreg <- passregs value
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
401 passregs <- passregs tail
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
402 if: passreg != arg {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
403 //there's a potential for clobbering argument temp regs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
404 //but there's no time to figure out a good solution
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
405 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
406 passreg
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
407 arg
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
408 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
409 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
410 print: "Skipping MOV for argument: " . arg . "\n"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
411 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
412 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
413 //jump to function
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
414 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
415 reg: 8
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
416 info def
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
417 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
418 prog setLabel: after
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
419 //adjust PC
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
420 prog add: (inst: "INC" #[(reg: 7)])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
421
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
422 //restore registers that were saved earlier
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
423 foreach: (reverse: needSave) :idx r {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
424 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
425 r
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
426 mem: (reg: 7)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
427 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
428 prog add: (inst: "INC" #[(reg: 7)])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
429 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
430 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
431 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
432 error: "Function " . (tc name) . " is not defined"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
433 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
434 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
435 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
436 error: "Calling expressions is not supported in"
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
437 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
438 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
439
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
440
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
441 _compileFun <- :fName fun globsyms {
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
442 syms <- symbols tableWithParent: globsyms
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
443
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
444 saveTempRegs <- _tempRegs
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
445 foreach: (fun args) :idx arg {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
446 argname <- (if: (arg startsWith?: ":") { arg from: 1 } else: { arg })
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
447 r <- _tempRegs value
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
448 _tempRegs <- _tempRegs tail
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
449 syms define: argname r
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
450 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
451
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452 lastexpr <- ((fun expressions) length) - 1
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
454 //TODO: do 2 passes for labels to allow forward references
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 foreach: (fun expressions) :idx expr {
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
456 if: idx != lastexpr && (expr nodeType) = (ast sym) {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
457 //allow using bare symbols to define labels
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
458 prog setLabel: (expr name)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
459 syms define: (expr name) (expr name)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
460 } else: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
461 saveTempRegsExpr <- _tempRegs
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
462 v <- compileExpr: expr syms: syms
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
463 _tempRegs <- saveTempRegsExpr
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
464 if: idx = lastexpr && (fName != "main") {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
465 //move result to a register
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
466 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
467 reg: 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
468 v
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
469 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
470 //return instruction
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
471 prog add: (inst: "MOV" #[
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
472 reg: 8
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
473 mem: (reg: 7)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
474 ])
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
475 }
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
476 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
477 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
478 saveTempRegs <- _tempRegs
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
479 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
480
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
481 #{
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
482 compile <- :code {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
483 res <- parser top: code
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
484 if: res {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
485 outer <- res yield
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
486 functions <- dict hash
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
487 syms <- symbols table
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
488 //define symbols for all registers
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
489 //for low level shenanigans
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
490 i <- 0
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
491 while: { i < 9 } do: {
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
492 r <- reg: i
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
493 syms define: (string: r) r
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
494 i <- i + 1
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
495 }
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
496 //define symbols for interrupt return values
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
497 syms define: "xCoord" (reg: 0)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
498 syms define: "yCoord" (reg: 1)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
499 syms define: "vitality" (reg: 0)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
500 syms define: "direction" (reg: 1)
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
501
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
502 //process top level assignments
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
503 foreach: (outer messages) :idx msg {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
504 if: (msg nodeType) = (ast assignment) {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
505 def <- msg assign
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
506 sym <- (msg to) name
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
507
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
508 if: (def nodeType) = (ast lambda) {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
509 functions set: sym def
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
510 syms define: sym sym
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
511 } else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
512 compileExpr: msg syms: syms
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
513 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
514 } else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
515 error: "Only assignments are allowed at the top level"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
516 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
517 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
518
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
519 functions ifget: "main" :def {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
520 prog setLabel: "main"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
521 _compileFun: "main" def syms
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
522 } else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
523 error: "Program must have a main function!"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
524 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
525 prog add: (inst: "HLT" #[])
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
526
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
527 foreach: functions :name def {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
528 if: name != "main" {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
529 prog setLabel: name
56
fde898a3cbbe Mostly complete version of gqc. Biggest omission is if:else. Defining labels also needs work.
Michael Pavone <pavone@retrodev.com>
parents: 55
diff changeset
530 _compileFun: name def syms
55
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
531 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
532 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
533 print: prog
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
534 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
535 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
536
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
537 compileFile <- :filename {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
538 f <- file open: filename
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
539 compile: (f readAll)
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
540 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
541
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
542 main <- :args {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
543 if: (args length) > 1 {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
544 compileFile: (args get: 1)
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
545 } else: {
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
546 print: "Usage lmc FILE\n"
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
547 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
549 }
194a1414e240 Partial implementation of Ghost-Quiche
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
550 }