From 78357b8852626b510527f3b8d770a7dd8956fcc7 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Fri, 16 Jul 2021 08:38:43 -0700 Subject: . --- html/apps/rpn.mu.html | 217 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 html/apps/rpn.mu.html (limited to 'html/apps/rpn.mu.html') diff --git a/html/apps/rpn.mu.html b/html/apps/rpn.mu.html new file mode 100644 index 00000000..a81eb74e --- /dev/null +++ b/html/apps/rpn.mu.html @@ -0,0 +1,217 @@ + + + + +Mu - apps/rpn.mu + + + + + + + + + + +https://github.com/akkartik/mu/blob/main/apps/rpn.mu +
+  1 # Integer arithmetic using postfix notation
+  2 #
+  3 # Limitations:
+  4 #   Division not implemented yet.
+  5 #
+  6 # To build:
+  7 #   $ ./translate apps/rpn.mu
+  8 #
+  9 # Example session:
+ 10 #   $ qemu-system-i386 code.img
+ 11 #   > 4
+ 12 #   4
+ 13 #   > 5 3 -
+ 14 #   2
+ 15 #
+ 16 # Error handling is non-existent. This is just a prototype.
+ 17 
+ 18 fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk) {
+ 19   var in-storage: (stream byte 0x80)
+ 20   var in/esi: (addr stream byte) <- address in-storage
+ 21   var y/ecx: int <- copy 0
+ 22   var space/edx: grapheme <- copy 0x20
+ 23   # read-eval-print loop
+ 24   {
+ 25     # print prompt
+ 26     var x/eax: int <- draw-text-rightward screen, "> ", 0/x, 0x80/xmax, y, 3/fg/cyan, 0/bg
+ 27     # read line from keyboard
+ 28     clear-stream in
+ 29     {
+ 30       draw-cursor screen, space
+ 31       var key/eax: byte <- read-key keyboard
+ 32       compare key, 0xa/newline
+ 33       break-if-=
+ 34       compare key, 0
+ 35       loop-if-=
+ 36       var key2/eax: int <- copy key
+ 37       append-byte in, key2
+ 38       var g/eax: grapheme <- copy key2
+ 39       draw-grapheme-at-cursor screen, g, 0xf/fg, 0/bg
+ 40       move-cursor-right 0
+ 41       loop
+ 42     }
+ 43     # clear cursor
+ 44     draw-grapheme-at-cursor screen, space, 3/fg/never-used, 0/bg
+ 45     # parse and eval
+ 46     var out/eax: int <- simplify in
+ 47     # print
+ 48     y <- increment
+ 49     out, y <- draw-int32-decimal-wrapping-right-then-down screen, out, 0/xmin, y, 0x80/xmax, 0x30/ymax, 0/x, y, 7/fg, 0/bg
+ 50     # newline
+ 51     y <- increment
+ 52     #
+ 53     loop
+ 54   }
+ 55 }
+ 56 
+ 57 type int-stack {
+ 58   data: (handle array int)
+ 59   top: int
+ 60 }
+ 61 
+ 62 fn simplify in: (addr stream byte) -> _/eax: int {
+ 63   var word-storage: slice
+ 64   var word/ecx: (addr slice) <- address word-storage
+ 65   var stack-storage: int-stack
+ 66   var stack/esi: (addr int-stack) <- address stack-storage
+ 67   initialize-int-stack stack, 0x10
+ 68   $simplify:word-loop: {
+ 69     next-word in, word
+ 70     var done?/eax: boolean <- slice-empty? word
+ 71     compare done?, 0
+ 72     break-if-!=
+ 73     # if word is an operator, perform it
+ 74     {
+ 75       var is-add?/eax: boolean <- slice-equal? word, "+"
+ 76       compare is-add?, 0
+ 77       break-if-=
+ 78       var _b/eax: int <- pop-int-stack stack
+ 79       var b/edx: int <- copy _b
+ 80       var a/eax: int <- pop-int-stack stack
+ 81       a <- add b
+ 82       push-int-stack stack, a
+ 83       loop $simplify:word-loop
+ 84     }
+ 85     {
+ 86       var is-sub?/eax: boolean <- slice-equal? word, "-"
+ 87       compare is-sub?, 0
+ 88       break-if-=
+ 89       var _b/eax: int <- pop-int-stack stack
+ 90       var b/edx: int <- copy _b
+ 91       var a/eax: int <- pop-int-stack stack
+ 92       a <- subtract b
+ 93       push-int-stack stack, a
+ 94       loop $simplify:word-loop
+ 95     }
+ 96     {
+ 97       var is-mul?/eax: boolean <- slice-equal? word, "*"
+ 98       compare is-mul?, 0
+ 99       break-if-=
+100       var _b/eax: int <- pop-int-stack stack
+101       var b/edx: int <- copy _b
+102       var a/eax: int <- pop-int-stack stack
+103       a <- multiply b
+104       push-int-stack stack, a
+105       loop $simplify:word-loop
+106     }
+107     # otherwise it's an int
+108     var n/eax: int <- parse-decimal-int-from-slice word
+109     push-int-stack stack, n
+110     loop
+111   }
+112   var result/eax: int <- pop-int-stack stack
+113   return result
+114 }
+115 
+116 fn initialize-int-stack _self: (addr int-stack), n: int {
+117   var self/esi: (addr int-stack) <- copy _self
+118   var d/edi: (addr handle array int) <- get self, data
+119   populate d, n
+120   var top/eax: (addr int) <- get self, top
+121   copy-to *top, 0
+122 }
+123 
+124 fn push-int-stack _self: (addr int-stack), _val: int {
+125   var self/esi: (addr int-stack) <- copy _self
+126   var top-addr/ecx: (addr int) <- get self, top
+127   var data-ah/edx: (addr handle array int) <- get self, data
+128   var data/eax: (addr array int) <- lookup *data-ah
+129   var top/edx: int <- copy *top-addr
+130   var dest-addr/edx: (addr int) <- index data, top
+131   var val/eax: int <- copy _val
+132   copy-to *dest-addr, val
+133   add-to *top-addr, 1
+134 }
+135 
+136 fn pop-int-stack _self: (addr int-stack) -> _/eax: int {
+137   var self/esi: (addr int-stack) <- copy _self
+138   var top-addr/ecx: (addr int) <- get self, top
+139   {
+140     compare *top-addr, 0
+141     break-if->
+142     return 0
+143   }
+144   subtract-from *top-addr, 1
+145   var data-ah/edx: (addr handle array int) <- get self, data
+146   var data/eax: (addr array int) <- lookup *data-ah
+147   var top/edx: int <- copy *top-addr
+148   var result-addr/eax: (addr int) <- index data, top
+149   var val/eax: int <- copy *result-addr
+150   return val
+151 }
+
+ + + -- cgit 1.4.1-2-gfad0 n Freyer <fabian.freyer@physik.tu-berlin.de> 2014-09-26 04:01:06 +0200 committer Fabian Freyer <fabian.freyer@physik.tu-berlin.de> 2014-10-29 14:15:11 +0100 autotools: FreeBSD Support' href='/danisanti/profani-tty/commit/configure.ac?id=2c361644d6e26bafd954d08cf31b950b4ac05fba'>2c361644 ^
2519e450 ^

768df4d7 ^



f983438e ^
768df4d7 ^
f983438e ^
768df4d7 ^






2c976d35 ^
7fa9ecc7 ^

dcccfacb ^
0cdbfecb ^




524b1f23 ^
2c361644 ^
b5171cb0 ^





















dcccfacb ^

d2035496 ^

78841f2e ^
dcccfacb ^

d2035496 ^


dcccfacb ^
78841f2e ^
bd1c1394 ^
78841f2e ^
fa89e2aa ^
7e4b1b1d ^
fa89e2aa ^
e504c030 ^
50afe736 ^
fa89e2aa ^











bd1c1394 ^

50afe736 ^
fa89e2aa ^











4d00f788 ^
d2035496 ^

3ceb9b0d ^








2519e450 ^

dcccfacb ^

28f5cdf7 ^
2519e450 ^
d28930ea ^
8e0d8d2a ^
11066f20 ^
2519e450 ^
4cb302ab ^
dcccfacb ^

575b6acd ^
aa6e2284 ^
2c361644 ^
3c062438 ^



2519e450 ^
8014e902 ^
2655d9e8 ^


dcccfacb ^

b5171cb0 ^
dcccfacb ^



3cae0208 ^
3ceb9b0d ^

dcccfacb ^

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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254