about summary refs log tree commit diff stats
path: root/shell/global.mu
diff options
context:
space:
mode:
Diffstat (limited to 'shell/global.mu')
-rw-r--r--shell/global.mu70
1 files changed, 66 insertions, 4 deletions
diff --git a/shell/global.mu b/shell/global.mu
index 5d34298b..72b4a178 100644
--- a/shell/global.mu
+++ b/shell/global.mu
@@ -21,6 +21,12 @@ fn initialize-globals _self: (addr global-table) {
   append-primitive self, "cdr"
   append-primitive self, "cons"
   append-primitive self, "="
+  append-primitive self, "print"
+  # TODO: isolate screens per-sandbox
+  var screen-storage: (handle cell)
+  var screen-ah/ecx: (addr handle cell) <- address screen-storage
+  new-screen screen-ah, 5/width, 4/height
+  append-global self, "screen", *screen-ah
 }
 
 fn render-globals screen: (addr screen), _self: (addr global-table), xmin: int, ymin: int, xmax: int, ymax: int {
@@ -42,10 +48,15 @@ fn render-globals screen: (addr screen), _self: (addr global-table), xmin: int,
     var curr-name-ah/eax: (addr handle array byte) <- get curr, name
     var _curr-name/eax: (addr array byte) <- lookup *curr-name-ah
     var curr-name/ebx: (addr array byte) <- copy _curr-name
-    var tmpx/eax: int <- copy x
-    tmpx <- draw-text-rightward screen, curr-name, tmpx, xmax, bottom-line, 0x2a/fg=orange, 0x12/bg=almost-black
-    tmpx <- draw-text-rightward screen, " ", tmpx, xmax, bottom-line, 7/fg=grey, 0x12/bg=almost-black
-    x <- copy tmpx
+    {
+      var skip?/eax: boolean <- string-equal? curr-name, "screen"
+      compare skip?, 0/false
+      break-if-!=
+      var tmpx/eax: int <- copy x
+      tmpx <- draw-text-rightward screen, curr-name, tmpx, xmax, bottom-line, 0x2a/fg=orange, 0x12/bg=almost-black
+      tmpx <- draw-text-rightward screen, " ", tmpx, xmax, bottom-line, 7/fg=grey, 0x12/bg=almost-black
+      x <- copy tmpx
+    }
     curr-index <- increment
     loop
   }
@@ -66,6 +77,9 @@ fn render-globals screen: (addr screen), _self: (addr global-table), xmin: int,
       var curr-name-ah/eax: (addr handle array byte) <- get curr, name
       var _curr-name/eax: (addr array byte) <- lookup *curr-name-ah
       var curr-name/edx: (addr array byte) <- copy _curr-name
+      var skip?/eax: boolean <- string-equal? curr-name, "screen"
+      compare skip?, 0/false
+      break-if-!=
       var x/eax: int <- copy xmin
       x, y <- draw-text-wrapping-right-then-down screen, curr-name, xmin, ymin, xmax, ymax, x, y, 0x2a/fg=orange, 0x12/bg=almost-black
       x, y <- draw-text-wrapping-right-then-down screen, " <- ", xmin, ymin, xmax, ymax, x, y, 7/fg=grey, 0x12/bg=almost-black
@@ -245,6 +259,13 @@ fn apply-primitive _f: (addr cell), args-ah: (addr handle cell), out: (addr hand
     apply-compare args-ah, out, env-h, trace
     return
   }
+  {
+    var is-print?/eax: boolean <- string-equal? f-name, "print"
+    compare is-print?, 0/false
+    break-if-=
+    apply-print args-ah, out, env-h, trace
+    return
+  }
   abort "unknown primitive function"
 }
 
@@ -586,3 +607,44 @@ fn apply-compare _args-ah: (addr handle cell), out: (addr handle cell), env-h: (
   }
   new-integer out, 1/true
 }
+
+fn apply-print _args-ah: (addr handle cell), out: (addr handle cell), env-h: (handle cell), trace: (addr trace) {
+  trace-text trace, "eval", "apply print"
+  var args-ah/eax: (addr handle cell) <- copy _args-ah
+  var _args/eax: (addr cell) <- lookup *args-ah
+  var args/esi: (addr cell) <- copy _args
+  var _env/eax: (addr cell) <- lookup env-h
+  var env/edi: (addr cell) <- copy _env
+  # TODO: check that args is a pair
+  var empty-args?/eax: boolean <- nil? args
+  compare empty-args?, 0/false
+  {
+    break-if-=
+    error trace, "cons needs 2 args but got 0"
+    return
+  }
+  # screen = args->left
+  var first-ah/eax: (addr handle cell) <- get args, left
+  var first/eax: (addr cell) <- lookup *first-ah
+  var first-type/ecx: (addr int) <- get first, type
+  compare *first-type, 5/screen
+  {
+    break-if-=
+    error trace, "first arg for 'print' is not a screen"
+    return
+  }
+  var screen-ah/eax: (addr handle screen) <- get first, screen-data
+  var _screen/eax: (addr screen) <- lookup *screen-ah
+  var screen/ecx: (addr screen) <- copy _screen
+  # args->right->left
+  var right-ah/eax: (addr handle cell) <- get args, right
+  var right/eax: (addr cell) <- lookup *right-ah
+  # TODO: check that right is a pair
+  var second-ah/eax: (addr handle cell) <- get right, left
+  var stream-storage: (stream byte 0x100)
+  var stream/edi: (addr stream byte) <- address stream-storage
+  print-cell second-ah, stream, trace
+  draw-stream-wrapping-right-then-down-from-cursor-over-full-screen screen, stream, 7/fg, 0/bg
+  # return what was printed
+  copy-object second-ah, out
+}
call.cc?h=main&id=d7494165ec7ae507c7340dcaad2e2c95fda5ee11'>d7494165 ^
acc4792d ^


f1e953d0 ^
ec926027 ^




363be37f ^
b24eb476 ^
ca01193d ^
8050782c ^


50eab110 ^
8050782c ^
50eab110 ^

1fa53058 ^


ec926027 ^
31401373 ^
ec926027 ^



ca01193d ^
363be37f ^
69e14325 ^
5eb49929 ^
e2240eb4 ^

363be37f ^
77cdc6d0 ^

a89c1bed ^
77cdc6d0 ^

31401373 ^
d72f3799 ^
0b0cfb6f ^
7284d503 ^


aae198a9 ^

6424e199 ^













f89378d5 ^
aae198a9 ^












































cd111388 ^







2142ccfc ^

f3760b0f ^
2b250717 ^
2142ccfc ^

f1a6f323 ^
9cf71627 ^
59874868 ^



a89c1bed ^
59874868 ^

f1c8df7d ^


59874868 ^


f1c8df7d ^
513bfed8 ^
af085cf6 ^


3eeea0a2 ^

9cf71627 ^
5f98a10c ^

1ead3562 ^
2cb36cd0 ^

2b37bbea ^
2cb36cd0 ^

5f98a10c ^
1ead3562 ^
192d59d3 ^
2cb36cd0 ^
2b37bbea ^
2cb36cd0 ^
7284d503 ^
64cf0a59 ^
d41955c1 ^

69e14325 ^
df8bb4c3 ^
f6d47435 ^
d41955c1 ^

31401373 ^
795f5244 ^
5eb49929 ^

317c0a34 ^
ec926027 ^

ac0e9db5 ^
2e8c5d39 ^
77cdc6d0 ^
a89c1bed ^
77cdc6d0 ^


31401373 ^
d8c6265d ^
9fdda88b ^
5f98a10c ^
8eff7919 ^
f6d47435 ^
f64f1ca5 ^










2a81a547 ^
f64f1ca5 ^

2a81a547 ^




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234