diff --git a/html/103glyph.subx.html b/html/103glyph.subx.html
index 1b724030..2930ea54 100644
--- a/html/103glyph.subx.html
+++ b/html/103glyph.subx.html
@@ -123,7 +123,7 @@ if ('onhashchange' in window) {
66 8b/-> *(ebp+8) 0/r32/eax
67 05/add-to-eax 4/imm32
68
- 69 (draw-code-point-on-screen-buffer %eax *(ebp+0xc) *(ebp+0x10) *(ebp+0x14) *(ebp+0x18) *(ebp+0x1c) *(ebp+0x20) *(ebp+0x24))
+ 69 (draw-code-point-on-screen-buffer %eax *(ebp+0xc) *(ebp+0x10) *(ebp+0x14) *(ebp+0x18) *(ebp+0x1c) 1 *(ebp+0x20) *(ebp+0x24))
70 $draw-code-point-on-screen-array:end:
71
72 5a/pop-to-edx
@@ -134,10 +134,10 @@ if ('onhashchange' in window) {
77 c3/return
78
79 $draw-code-point-on-screen-array:overflow:
- 80 (abort "draw-code-point-on-screen-array: screen dimensions too large")
+ 80 (abort "draw-code-point-on-screen-array: screen dimensions too large")
81
82 $draw-code-point-on-screen-array:abort:
- 83 (abort "draw-code-point-on-screen-array: coordinates are off the screen. Are the screen dimensions correct?")
+ 83 (abort "draw-code-point-on-screen-array: coordinates are off the screen. Are the screen dimensions correct?")
84
85
86
diff --git a/html/315stack-debug.subx.html b/html/315stack-debug.subx.html
index c7f1e1a9..0a588178 100644
--- a/html/315stack-debug.subx.html
+++ b/html/315stack-debug.subx.html
@@ -92,12 +92,12 @@ if ('onhashchange' in window) {
34
35 89/<- %edx 4/r32/esp
36
- 37 (cursor-position 0)
+ 37 (cursor-position 0)
38
- 39 (set-cursor-position 0 0x70 0)
+ 39 (set-cursor-position 0 0x70 0)
40 (draw-int32-hex-wrapping-right-then-down-from-cursor-over-full-screen 0 %edx 0xf 0xc)
41
- 42 (set-cursor-position %eax %ecx)
+ 42 (set-cursor-position %eax %ecx)
43 $show-stack-state:end:
44
45 5a/pop-to-edx
@@ -124,11 +124,11 @@ if ('onhashchange' in window) {
66 74/jump-if-= break/disp8
67 (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 *(ebp+8) *(ebp+0xc) *(ebp+0x10))
68
- 69 (cursor-position 0)
+ 69 (cursor-position 0)
70 81 7/subop/compare %ecx 0x28/imm32
71 75/jump-if-!= break/disp8
- 72 (clear-screen 0)
- 73 (set-cursor-position 0 0 0)
+ 72 (clear-screen 0)
+ 73 (set-cursor-position 0 0 0)
74 }
75 $debug-print:end:
76
diff --git a/html/412render-float-decimal.mu.html b/html/412render-float-decimal.mu.html
index 89183c1a..d006069c 100644
--- a/html/412render-float-decimal.mu.html
+++ b/html/412render-float-decimal.mu.html
@@ -212,14 +212,14 @@ if ('onhashchange' in window) {
148 check-stream-equal s, "NaN", "F - test-write-float-decimal-approximate-not-a-number"
149 }
150
-151 fn render-float-decimal screen: (addr screen), in: float, precision: int, x: int, y: int, color: int, background-color: int -> _/eax: int {
+151 fn render-float-decimal screen: (addr screen), in: float, precision: int, x: int, y: int, color: int, background-color: int -> _/eax: int {
152 var s-storage: (stream byte 0x10)
153 var s/esi: (addr stream byte) <- address s-storage
154 write-float-decimal-approximate s, in, precision
155 var width/eax: int <- copy 0
156 var height/ecx: int <- copy 0
-157 width, height <- screen-size screen
-158 var result/eax: int <- draw-stream-rightward screen, s, x, width, y, color, background-color
+157 width, height <- screen-size screen
+158 var result/eax: int <- draw-stream-rightward screen, s, x, width, y, color, background-color
159 return result
160 }
161
diff --git a/html/500fake-screen.mu.html b/html/500fake-screen.mu.html
index 330bf534..56909c43 100644
--- a/html/500fake-screen.mu.html
+++ b/html/500fake-screen.mu.html
@@ -73,714 +73,716 @@ if ('onhashchange' in window) {
10
11
12
- 13
- 14 type screen {
- 15
- 16 width: int
- 17 height: int
- 18 data: (handle array screen-cell)
- 19 cursor-x: int
- 20 cursor-y: int
- 21
- 22 pixels: (handle array byte)
- 23 }
- 24
- 25 type screen-cell {
- 26 data: code-point
- 27 color: int
- 28 background-color: int
- 29 unused?: boolean
- 30 }
- 31
- 32 fn initialize-screen _screen: (addr screen), width: int, height: int, pixel-graphics?: boolean {
- 33 var screen/esi: (addr screen) <- copy _screen
- 34 var tmp/eax: int <- copy 0
- 35 var dest/edi: (addr int) <- copy 0
- 36
- 37 dest <- get screen, width
- 38 tmp <- copy width
- 39 copy-to *dest, tmp
- 40
- 41 dest <- get screen, height
- 42 tmp <- copy height
- 43 copy-to *dest, tmp
- 44
- 45 {
- 46 var data-ah/edi: (addr handle array screen-cell) <- get screen, data
- 47 var capacity/eax: int <- copy width
- 48 capacity <- multiply height
- 49
- 50 populate data-ah, capacity
- 51 }
- 52
- 53 {
- 54 compare pixel-graphics?, 0/false
- 55 break-if-=
- 56 var pixels-ah/edi: (addr handle array byte) <- get screen, pixels
- 57 var capacity/eax: int <- copy width
- 58 capacity <- shift-left 3/log2-font-width
- 59 capacity <- multiply height
- 60 capacity <- shift-left 4/log2-font-height
- 61
- 62 populate pixels-ah, capacity
- 63 }
- 64
- 65 dest <- get screen, cursor-x
- 66 copy-to *dest, 0
- 67
- 68 dest <- get screen, cursor-y
- 69 copy-to *dest, 0
- 70 }
- 71
- 72
- 73 fn screen-size _screen: (addr screen) -> _/eax: int, _/ecx: int {
- 74 var screen/esi: (addr screen) <- copy _screen
- 75 var width/eax: int <- copy 0
- 76 var height/ecx: int <- copy 0
- 77 compare screen, 0
- 78 {
- 79 break-if-!=
- 80 return 0x80/128, 0x30/48
- 81 }
- 82
- 83 var tmp/edx: (addr int) <- get screen, width
- 84 width <- copy *tmp
- 85 tmp <- get screen, height
- 86 height <- copy *tmp
- 87 return width, height
- 88 }
- 89
- 90
- 91
- 92 fn draw-code-point _screen: (addr screen), c: code-point, x: int, y: int, color: int, background-color: int -> _/eax: int {
- 93 var screen/esi: (addr screen) <- copy _screen
- 94 {
- 95 compare screen, 0
- 96 break-if-!=
- 97 var result/eax: int <- draw-code-point-on-real-screen c, x, y, color, background-color
- 98 return result
- 99 }
-100
-101 var wide?/eax: boolean <- wide-code-point? c
-102 compare wide?, 0/false
-103 {
-104 break-if-=
-105 draw-wide-code-point-on-fake-screen screen, c, x, y, color, background-color
-106 return 2
-107 }
-108 draw-narrow-code-point-on-fake-screen screen, c, x, y, color, background-color
-109 return 1
-110 }
-111
-112 fn overlay-code-point _screen: (addr screen), c: code-point, x: int, y: int, color: int, background-color: int -> _/eax: int {
-113 var screen/esi: (addr screen) <- copy _screen
-114 {
-115 compare screen, 0
-116 break-if-!=
-117 var result/eax: int <- overlay-code-point-on-real-screen c, x, y, color, background-color
-118 return result
-119 }
-120
-121
-122 var wide?/eax: boolean <- wide-code-point? c
-123 compare wide?, 0/false
-124 {
-125 break-if-=
-126 draw-wide-code-point-on-fake-screen screen, c, x, y, color, background-color
-127 return 2
-128 }
-129 draw-narrow-code-point-on-fake-screen screen, c, x, y, color, background-color
-130 return 1
-131 }
-132
-133 fn draw-narrow-code-point-on-fake-screen _screen: (addr screen), c: code-point, x: int, y: int, color: int, background-color: int {
-134 var screen/esi: (addr screen) <- copy _screen
-135
-136 {
-137 compare x, 0
-138 break-if->=
-139 return
-140 }
-141 {
-142 var xmax-addr/eax: (addr int) <- get screen, width
-143 var xmax/eax: int <- copy *xmax-addr
-144 compare x, xmax
-145 break-if-<
-146 {
-147 loop
-148 }
-149 return
-150 }
-151 {
-152 compare y, 0
-153 break-if->=
-154 return
-155 }
-156 {
-157 var ymax-addr/eax: (addr int) <- get screen, height
-158 var ymax/eax: int <- copy *ymax-addr
-159 compare y, ymax
-160 break-if-<
-161 return
-162 }
-163
-164 var index/ecx: int <- screen-cell-index screen, x, y
-165 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
-166 var data/eax: (addr array screen-cell) <- lookup *data-ah
-167 var offset/ecx: (offset screen-cell) <- compute-offset data, index
-168 var dest-cell/ecx: (addr screen-cell) <- index data, offset
-169 var dest-code-point/eax: (addr code-point) <- get dest-cell, data
-170 var c2/edx: code-point <- copy c
-171 copy-to *dest-code-point, c2
-172 var dest-color/eax: (addr int) <- get dest-cell, color
-173 var src-color/edx: int <- copy color
-174 copy-to *dest-color, src-color
-175 dest-color <- get dest-cell, background-color
-176 src-color <- copy background-color
-177 copy-to *dest-color, src-color
-178 var dest/eax: (addr boolean) <- get dest-cell, unused?
-179 copy-to *dest, 0/false
-180 }
-181
-182 fn draw-wide-code-point-on-fake-screen _screen: (addr screen), c: code-point, x: int, y: int, color: int, background-color: int {
-183 var screen/esi: (addr screen) <- copy _screen
-184
-185 {
-186 compare x, 0
-187 break-if->=
-188 return
-189 }
-190 {
-191 var xmax-addr/eax: (addr int) <- get screen, width
-192 var xmax/eax: int <- copy *xmax-addr
-193 xmax <- decrement
-194 compare x, xmax
-195 break-if-<
-196 return
-197 }
-198 {
-199 compare y, 0
-200 break-if->=
-201 return
-202 }
-203 {
-204 var ymax-addr/eax: (addr int) <- get screen, height
-205 var ymax/eax: int <- copy *ymax-addr
-206 compare y, ymax
-207 break-if-<
-208 return
-209 }
-210
-211 var index/ecx: int <- screen-cell-index screen, x, y
-212 {
-213 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
-214 var data/eax: (addr array screen-cell) <- lookup *data-ah
-215 var offset/ecx: (offset screen-cell) <- compute-offset data, index
-216 var dest-cell/ecx: (addr screen-cell) <- index data, offset
-217 var dest-code-point/eax: (addr code-point) <- get dest-cell, data
-218 var c2/edx: code-point <- copy c
-219 copy-to *dest-code-point, c2
-220 var dest-color/eax: (addr int) <- get dest-cell, color
-221 var src-color/edx: int <- copy color
-222 copy-to *dest-color, src-color
-223 dest-color <- get dest-cell, background-color
-224 src-color <- copy background-color
-225 copy-to *dest-color, src-color
-226 var dest/eax: (addr boolean) <- get dest-cell, unused?
-227 copy-to *dest, 0/false
-228 }
-229
-230 index <- increment
-231 {
-232 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
-233 var data/eax: (addr array screen-cell) <- lookup *data-ah
-234 var offset/ecx: (offset screen-cell) <- compute-offset data, index
-235 var dest-cell/ecx: (addr screen-cell) <- index data, offset
-236 var dest/eax: (addr boolean) <- get dest-cell, unused?
-237 copy-to *dest, 1/true
-238 }
-239 }
-240
-241
-242 fn screen-cell-index _screen: (addr screen), x: int, y: int -> _/ecx: int {
-243 var screen/esi: (addr screen) <- copy _screen
-244 var width-addr/eax: (addr int) <- get screen, width
-245 var result/ecx: int <- copy y
-246 result <- multiply *width-addr
-247 result <- add x
-248 return result
-249 }
-250
-251 fn cursor-position _screen: (addr screen) -> _/eax: int, _/ecx: int {
-252 var screen/esi: (addr screen) <- copy _screen
-253 {
-254 compare screen, 0
-255 break-if-!=
-256 var x/eax: int <- copy 0
-257 var y/ecx: int <- copy 0
-258 x, y <- cursor-position-on-real-screen
-259 return x, y
-260 }
-261
-262 var cursor-x-addr/eax: (addr int) <- get screen, cursor-x
-263 var cursor-y-addr/ecx: (addr int) <- get screen, cursor-y
-264 return *cursor-x-addr, *cursor-y-addr
-265 }
-266
-267 fn set-cursor-position _screen: (addr screen), x: int, y: int {
-268 var screen/esi: (addr screen) <- copy _screen
-269 {
-270 compare screen, 0
-271 break-if-!=
-272 set-cursor-position-on-real-screen x, y
-273 return
-274 }
-275
-276
-277 {
-278 compare x, 0
-279 break-if->=
-280 return
-281 }
-282
-283 {
-284 var width-addr/eax: (addr int) <- get screen, width
-285 var width/eax: int <- copy *width-addr
-286 compare x, width
-287 break-if-<=
-288 return
-289 }
-290
-291 {
-292 compare y, 0
-293 break-if->=
-294 return
-295 }
-296
-297 {
-298 var height-addr/eax: (addr int) <- get screen, height
-299 var height/eax: int <- copy *height-addr
-300 compare y, height
-301 break-if-<
-302 return
-303 }
-304
-305 var dest/edi: (addr int) <- get screen, cursor-x
-306 var src/eax: int <- copy x
-307 copy-to *dest, src
-308
-309 dest <- get screen, cursor-y
-310 src <- copy y
-311 copy-to *dest, src
-312 }
-313
-314 fn draw-cursor screen: (addr screen), c: code-point {
-315 {
-316 compare screen, 0
-317 break-if-!=
-318 draw-cursor-on-real-screen c
-319 return
-320 }
-321
-322 var cursor-x/eax: int <- copy 0
-323 var cursor-y/ecx: int <- copy 0
-324 cursor-x, cursor-y <- cursor-position screen
-325 var dummy/eax: int <- draw-code-point screen, c, cursor-x, cursor-y, 0/fg, 7/bg
-326 }
-327
-328 fn clear-screen _screen: (addr screen) {
-329 var screen/esi: (addr screen) <- copy _screen
-330 {
-331 compare screen, 0
-332 break-if-!=
-333 clear-real-screen
-334 return
-335 }
-336
-337 set-cursor-position screen, 0, 0
-338 var y/eax: int <- copy 0
-339 var height/ecx: (addr int) <- get screen, height
-340 {
-341 compare y, *height
-342 break-if->=
-343 var x/edx: int <- copy 0
-344 var width/ebx: (addr int) <- get screen, width
-345 {
-346 compare x, *width
-347 break-if->=
-348 var dummy/eax: int <- draw-code-point screen, 0/nul, x, y, 0/fg=black, 0/bg=black
-349 x <- increment
-350 loop
-351 }
-352 y <- increment
-353 loop
-354 }
-355 set-cursor-position screen, 0, 0
-356 var pixels-ah/eax: (addr handle array byte) <- get screen, pixels
-357 var pixels/eax: (addr array byte) <- lookup *pixels-ah
-358 var i/ecx: int <- copy 0
-359 var max/edx: int <- length pixels
-360 {
-361 compare i, max
-362 break-if->=
-363 var curr/eax: (addr byte) <- index pixels, i
-364 var zero/ebx: byte <- copy 0
-365 copy-byte-to *curr, zero
-366 i <- increment
-367 loop
-368 }
-369 }
-370
-371 fn fake-screen-empty? _screen: (addr screen) -> _/eax: boolean {
-372 var screen/esi: (addr screen) <- copy _screen
-373 var y/eax: int <- copy 0
-374 var height/ecx: (addr int) <- get screen, height
-375 {
-376 compare y, *height
-377 break-if->=
-378 var x/edx: int <- copy 0
-379 var width/ebx: (addr int) <- get screen, width
-380 {
-381 compare x, *width
-382 break-if->=
-383 var c/eax: code-point <- screen-code-point-at screen, x, y
-384 {
-385 compare c, 0
-386 break-if-=
-387 compare c, 0x20/space
+ 13
+ 14
+ 15
+ 16 type screen {
+ 17
+ 18 width: int
+ 19 height: int
+ 20 data: (handle array screen-cell)
+ 21 cursor-x: int
+ 22 cursor-y: int
+ 23
+ 24 pixels: (handle array byte)
+ 25 }
+ 26
+ 27 type screen-cell {
+ 28 data: code-point
+ 29 color: int
+ 30 background-color: int
+ 31 unused?: boolean
+ 32 }
+ 33
+ 34 fn initialize-screen _screen: (addr screen), width: int, height: int, pixel-graphics?: boolean {
+ 35 var screen/esi: (addr screen) <- copy _screen
+ 36 var tmp/eax: int <- copy 0
+ 37 var dest/edi: (addr int) <- copy 0
+ 38
+ 39 dest <- get screen, width
+ 40 tmp <- copy width
+ 41 copy-to *dest, tmp
+ 42
+ 43 dest <- get screen, height
+ 44 tmp <- copy height
+ 45 copy-to *dest, tmp
+ 46
+ 47 {
+ 48 var data-ah/edi: (addr handle array screen-cell) <- get screen, data
+ 49 var capacity/eax: int <- copy width
+ 50 capacity <- multiply height
+ 51
+ 52 populate data-ah, capacity
+ 53 }
+ 54
+ 55 {
+ 56 compare pixel-graphics?, 0/false
+ 57 break-if-=
+ 58 var pixels-ah/edi: (addr handle array byte) <- get screen, pixels
+ 59 var capacity/eax: int <- copy width
+ 60 capacity <- shift-left 3/log2-font-width
+ 61 capacity <- multiply height
+ 62 capacity <- shift-left 4/log2-font-height
+ 63
+ 64 populate pixels-ah, capacity
+ 65 }
+ 66
+ 67 dest <- get screen, cursor-x
+ 68 copy-to *dest, 0
+ 69
+ 70 dest <- get screen, cursor-y
+ 71 copy-to *dest, 0
+ 72 }
+ 73
+ 74
+ 75 fn screen-size _screen: (addr screen) -> _/eax: int, _/ecx: int {
+ 76 var screen/esi: (addr screen) <- copy _screen
+ 77 var width/eax: int <- copy 0
+ 78 var height/ecx: int <- copy 0
+ 79 compare screen, 0
+ 80 {
+ 81 break-if-!=
+ 82 return 0x80/128, 0x30/48
+ 83 }
+ 84
+ 85 var tmp/edx: (addr int) <- get screen, width
+ 86 width <- copy *tmp
+ 87 tmp <- get screen, height
+ 88 height <- copy *tmp
+ 89 return width, height
+ 90 }
+ 91
+ 92
+ 93
+ 94 fn draw-code-point _screen: (addr screen), c: code-point, x: int, y: int, color: int, background-color: int -> _/eax: int {
+ 95 var screen/esi: (addr screen) <- copy _screen
+ 96 {
+ 97 compare screen, 0
+ 98 break-if-!=
+ 99 var result/eax: int <- draw-code-point-on-real-screen c, x, y, color, background-color
+100 return result
+101 }
+102
+103 var wide?/eax: boolean <- wide-code-point? c
+104 compare wide?, 0/false
+105 {
+106 break-if-=
+107 draw-wide-code-point-on-fake-screen screen, c, x, y, color, background-color
+108 return 2
+109 }
+110 draw-narrow-code-point-on-fake-screen screen, c, x, y, color, background-color
+111 return 1
+112 }
+113
+114 fn overlay-code-point _screen: (addr screen), c: code-point, x: int, y: int, color: int, background-color: int -> _/eax: int {
+115 var screen/esi: (addr screen) <- copy _screen
+116 {
+117 compare screen, 0
+118 break-if-!=
+119 var result/eax: int <- overlay-code-point-on-real-screen c, x, y, color, background-color
+120 return result
+121 }
+122
+123
+124 var wide?/eax: boolean <- wide-code-point? c
+125 compare wide?, 0/false
+126 {
+127 break-if-=
+128 draw-wide-code-point-on-fake-screen screen, c, x, y, color, background-color
+129 return 2
+130 }
+131 draw-narrow-code-point-on-fake-screen screen, c, x, y, color, background-color
+132 return 1
+133 }
+134
+135 fn draw-narrow-code-point-on-fake-screen _screen: (addr screen), c: code-point, x: int, y: int, color: int, background-color: int {
+136 var screen/esi: (addr screen) <- copy _screen
+137
+138 {
+139 compare x, 0
+140 break-if->=
+141 return
+142 }
+143 {
+144 var xmax-addr/eax: (addr int) <- get screen, width
+145 var xmax/eax: int <- copy *xmax-addr
+146 compare x, xmax
+147 break-if-<
+148 {
+149 loop
+150 }
+151 return
+152 }
+153 {
+154 compare y, 0
+155 break-if->=
+156 return
+157 }
+158 {
+159 var ymax-addr/eax: (addr int) <- get screen, height
+160 var ymax/eax: int <- copy *ymax-addr
+161 compare y, ymax
+162 break-if-<
+163 return
+164 }
+165
+166 var index/ecx: int <- screen-cell-index screen, x, y
+167 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
+168 var data/eax: (addr array screen-cell) <- lookup *data-ah
+169 var offset/ecx: (offset screen-cell) <- compute-offset data, index
+170 var dest-cell/ecx: (addr screen-cell) <- index data, offset
+171 var dest-code-point/eax: (addr code-point) <- get dest-cell, data
+172 var c2/edx: code-point <- copy c
+173 copy-to *dest-code-point, c2
+174 var dest-color/eax: (addr int) <- get dest-cell, color
+175 var src-color/edx: int <- copy color
+176 copy-to *dest-color, src-color
+177 dest-color <- get dest-cell, background-color
+178 src-color <- copy background-color
+179 copy-to *dest-color, src-color
+180 var dest/eax: (addr boolean) <- get dest-cell, unused?
+181 copy-to *dest, 0/false
+182 }
+183
+184 fn draw-wide-code-point-on-fake-screen _screen: (addr screen), c: code-point, x: int, y: int, color: int, background-color: int {
+185 var screen/esi: (addr screen) <- copy _screen
+186
+187 {
+188 compare x, 0
+189 break-if->=
+190 return
+191 }
+192 {
+193 var xmax-addr/eax: (addr int) <- get screen, width
+194 var xmax/eax: int <- copy *xmax-addr
+195 xmax <- decrement
+196 compare x, xmax
+197 break-if-<
+198 return
+199 }
+200 {
+201 compare y, 0
+202 break-if->=
+203 return
+204 }
+205 {
+206 var ymax-addr/eax: (addr int) <- get screen, height
+207 var ymax/eax: int <- copy *ymax-addr
+208 compare y, ymax
+209 break-if-<
+210 return
+211 }
+212
+213 var index/ecx: int <- screen-cell-index screen, x, y
+214 {
+215 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
+216 var data/eax: (addr array screen-cell) <- lookup *data-ah
+217 var offset/ecx: (offset screen-cell) <- compute-offset data, index
+218 var dest-cell/ecx: (addr screen-cell) <- index data, offset
+219 var dest-code-point/eax: (addr code-point) <- get dest-cell, data
+220 var c2/edx: code-point <- copy c
+221 copy-to *dest-code-point, c2
+222 var dest-color/eax: (addr int) <- get dest-cell, color
+223 var src-color/edx: int <- copy color
+224 copy-to *dest-color, src-color
+225 dest-color <- get dest-cell, background-color
+226 src-color <- copy background-color
+227 copy-to *dest-color, src-color
+228 var dest/eax: (addr boolean) <- get dest-cell, unused?
+229 copy-to *dest, 0/false
+230 }
+231
+232 index <- increment
+233 {
+234 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
+235 var data/eax: (addr array screen-cell) <- lookup *data-ah
+236 var offset/ecx: (offset screen-cell) <- compute-offset data, index
+237 var dest-cell/ecx: (addr screen-cell) <- index data, offset
+238 var dest/eax: (addr boolean) <- get dest-cell, unused?
+239 copy-to *dest, 1/true
+240 }
+241 }
+242
+243
+244 fn screen-cell-index _screen: (addr screen), x: int, y: int -> _/ecx: int {
+245 var screen/esi: (addr screen) <- copy _screen
+246 var width-addr/eax: (addr int) <- get screen, width
+247 var result/ecx: int <- copy y
+248 result <- multiply *width-addr
+249 result <- add x
+250 return result
+251 }
+252
+253 fn cursor-position _screen: (addr screen) -> _/eax: int, _/ecx: int {
+254 var screen/esi: (addr screen) <- copy _screen
+255 {
+256 compare screen, 0
+257 break-if-!=
+258 var x/eax: int <- copy 0
+259 var y/ecx: int <- copy 0
+260 x, y <- cursor-position-on-real-screen
+261 return x, y
+262 }
+263
+264 var cursor-x-addr/eax: (addr int) <- get screen, cursor-x
+265 var cursor-y-addr/ecx: (addr int) <- get screen, cursor-y
+266 return *cursor-x-addr, *cursor-y-addr
+267 }
+268
+269 fn set-cursor-position _screen: (addr screen), x: int, y: int {
+270 var screen/esi: (addr screen) <- copy _screen
+271 {
+272 compare screen, 0
+273 break-if-!=
+274 set-cursor-position-on-real-screen x, y
+275 return
+276 }
+277
+278
+279 {
+280 compare x, 0
+281 break-if->=
+282 return
+283 }
+284
+285 {
+286 var width-addr/eax: (addr int) <- get screen, width
+287 var width/eax: int <- copy *width-addr
+288 compare x, width
+289 break-if-<=
+290 return
+291 }
+292
+293 {
+294 compare y, 0
+295 break-if->=
+296 return
+297 }
+298
+299 {
+300 var height-addr/eax: (addr int) <- get screen, height
+301 var height/eax: int <- copy *height-addr
+302 compare y, height
+303 break-if-<
+304 return
+305 }
+306
+307 var dest/edi: (addr int) <- get screen, cursor-x
+308 var src/eax: int <- copy x
+309 copy-to *dest, src
+310
+311 dest <- get screen, cursor-y
+312 src <- copy y
+313 copy-to *dest, src
+314 }
+315
+316 fn draw-cursor screen: (addr screen), c: code-point {
+317 {
+318 compare screen, 0
+319 break-if-!=
+320 draw-cursor-on-real-screen c
+321 return
+322 }
+323
+324 var cursor-x/eax: int <- copy 0
+325 var cursor-y/ecx: int <- copy 0
+326 cursor-x, cursor-y <- cursor-position screen
+327 var dummy/eax: int <- draw-code-point screen, c, cursor-x, cursor-y, 0/fg, 7/bg
+328 }
+329
+330 fn clear-screen _screen: (addr screen) {
+331 var screen/esi: (addr screen) <- copy _screen
+332 {
+333 compare screen, 0
+334 break-if-!=
+335 clear-real-screen
+336 return
+337 }
+338
+339 set-cursor-position screen, 0, 0
+340 var y/eax: int <- copy 0
+341 var height/ecx: (addr int) <- get screen, height
+342 {
+343 compare y, *height
+344 break-if->=
+345 var x/edx: int <- copy 0
+346 var width/ebx: (addr int) <- get screen, width
+347 {
+348 compare x, *width
+349 break-if->=
+350 var dummy/eax: int <- draw-code-point screen, 0/nul, x, y, 0/fg=black, 0/bg=black
+351 x <- increment
+352 loop
+353 }
+354 y <- increment
+355 loop
+356 }
+357 set-cursor-position screen, 0, 0
+358 var pixels-ah/eax: (addr handle array byte) <- get screen, pixels
+359 var pixels/eax: (addr array byte) <- lookup *pixels-ah
+360 var i/ecx: int <- copy 0
+361 var max/edx: int <- length pixels
+362 {
+363 compare i, max
+364 break-if->=
+365 var curr/eax: (addr byte) <- index pixels, i
+366 var zero/ebx: byte <- copy 0
+367 copy-byte-to *curr, zero
+368 i <- increment
+369 loop
+370 }
+371 }
+372
+373 fn fake-screen-empty? _screen: (addr screen) -> _/eax: boolean {
+374 var screen/esi: (addr screen) <- copy _screen
+375 var y/eax: int <- copy 0
+376 var height/ecx: (addr int) <- get screen, height
+377 {
+378 compare y, *height
+379 break-if->=
+380 var x/edx: int <- copy 0
+381 var width/ebx: (addr int) <- get screen, width
+382 {
+383 compare x, *width
+384 break-if->=
+385 var c/eax: code-point <- screen-code-point-at screen, x, y
+386 {
+387 compare c, 0
388 break-if-=
-389 return 0/false
-390 }
-391 x <- increment
-392 loop
-393 }
-394 y <- increment
-395 loop
-396 }
-397 var pixels-ah/eax: (addr handle array byte) <- get screen, pixels
-398 var pixels/eax: (addr array byte) <- lookup *pixels-ah
-399 var y/ebx: int <- copy 0
-400 var height-addr/edx: (addr int) <- get screen, height
-401 var height/edx: int <- copy *height-addr
-402 height <- shift-left 4/log2-font-height
-403 {
-404 compare y, height
-405 break-if->=
-406 var width-addr/edx: (addr int) <- get screen, width
-407 var width/edx: int <- copy *width-addr
-408 width <- shift-left 3/log2-font-width
-409 var x/edi: int <- copy 0
-410 {
-411 compare x, width
-412 break-if->=
-413 var index/ecx: int <- pixel-index screen, x, y
-414 var color-addr/ecx: (addr byte) <- index pixels, index
-415 var color/ecx: byte <- copy-byte *color-addr
-416 compare color, 0
-417 {
-418 break-if-=
-419 return 0/false
-420 }
-421 x <- increment
-422 loop
-423 }
-424 y <- increment
-425 loop
-426 }
-427 return 1/true
-428 }
-429
-430 fn clear-rect _screen: (addr screen), xmin: int, ymin: int, xmax: int, ymax: int, background-color: int {
-431 var screen/esi: (addr screen) <- copy _screen
-432 {
-433 compare screen, 0
-434 break-if-!=
-435 clear-rect-on-real-screen xmin, ymin, xmax, ymax, background-color
-436 return
-437 }
-438
-439 set-cursor-position screen, 0, 0
-440 var y/eax: int <- copy ymin
-441 var ymax/ecx: int <- copy ymax
-442 {
-443 compare y, ymax
-444 break-if->=
-445 var x/edx: int <- copy xmin
-446 var xmax/ebx: int <- copy xmax
-447 {
-448 compare x, xmax
-449 break-if->=
-450 var dummy/eax: int <- draw-code-point screen, 0x20/space, x, y, 0/fg, background-color
-451 x <- increment
-452 loop
-453 }
-454 y <- increment
-455 loop
-456 }
-457 set-cursor-position screen, 0, 0
-458 }
-459
-460
-461
-462 fn clear-real-screen {
-463 var y/eax: int <- copy 0
-464 {
-465 compare y, 0x300/screen-height=768
-466 break-if->=
-467 var x/edx: int <- copy 0
-468 {
-469 compare x, 0x400/screen-width=1024
-470 break-if->=
-471 pixel-on-real-screen x, y, 0/color=black
-472 x <- increment
-473 loop
-474 }
-475 y <- increment
-476 loop
-477 }
-478 }
-479
-480 fn clear-rect-on-real-screen xmin: int, ymin: int, xmax: int, ymax: int, background-color: int {
-481 var y/eax: int <- copy ymin
-482 y <- shift-left 4/log2-font-height
-483 var ymax/ecx: int <- copy ymax
-484 ymax <- shift-left 4/log2-font-height
-485 {
-486 compare y, ymax
-487 break-if->=
-488 var x/edx: int <- copy xmin
-489 x <- shift-left 3/log2-font-width
-490 var xmax/ebx: int <- copy xmax
-491 xmax <- shift-left 3/log2-font-width
-492 {
-493 compare x, xmax
-494 break-if->=
-495 pixel-on-real-screen x, y, background-color
-496 x <- increment
-497 loop
-498 }
-499 y <- increment
-500 loop
-501 }
-502 }
-503
-504 fn screen-cell-unused-at? _screen: (addr screen), x: int, y: int -> _/eax: boolean {
-505 var screen/esi: (addr screen) <- copy _screen
-506 var index/ecx: int <- screen-cell-index screen, x, y
-507 var result/eax: boolean <- screen-cell-unused-at-index? screen, index
-508 return result
-509 }
-510
-511 fn screen-cell-unused-at-index? _screen: (addr screen), _index: int -> _/eax: boolean {
-512 var screen/esi: (addr screen) <- copy _screen
-513 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
-514 var data/eax: (addr array screen-cell) <- lookup *data-ah
-515 var index/ecx: int <- copy _index
-516 var offset/ecx: (offset screen-cell) <- compute-offset data, index
-517 var cell/eax: (addr screen-cell) <- index data, offset
-518 var src/eax: (addr boolean) <- get cell, unused?
-519 return *src
-520 }
-521
-522 fn screen-code-point-at _screen: (addr screen), x: int, y: int -> _/eax: code-point {
-523 var screen/esi: (addr screen) <- copy _screen
-524 var index/ecx: int <- screen-cell-index screen, x, y
-525 var result/eax: code-point <- screen-code-point-at-index screen, index
-526 return result
-527 }
-528
-529 fn screen-code-point-at-index _screen: (addr screen), _index: int -> _/eax: code-point {
-530 var screen/esi: (addr screen) <- copy _screen
-531 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
-532 var data/eax: (addr array screen-cell) <- lookup *data-ah
-533 var index/ecx: int <- copy _index
-534 var offset/ecx: (offset screen-cell) <- compute-offset data, index
-535 var cell/eax: (addr screen-cell) <- index data, offset
-536 var src/eax: (addr code-point) <- get cell, data
-537 return *src
-538 }
-539
-540 fn screen-color-at _screen: (addr screen), x: int, y: int -> _/eax: int {
-541 var screen/esi: (addr screen) <- copy _screen
-542 var index/ecx: int <- screen-cell-index screen, x, y
-543 var result/eax: int <- screen-color-at-index screen, index
-544 return result
-545 }
-546
-547 fn screen-color-at-index _screen: (addr screen), _index: int -> _/eax: int {
-548 var screen/esi: (addr screen) <- copy _screen
-549 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
-550 var data/eax: (addr array screen-cell) <- lookup *data-ah
-551 var index/ecx: int <- copy _index
-552 var offset/ecx: (offset screen-cell) <- compute-offset data, index
-553 var cell/eax: (addr screen-cell) <- index data, offset
-554 var src/eax: (addr int) <- get cell, color
-555 var result/eax: int <- copy *src
-556 return result
-557 }
-558
-559 fn screen-background-color-at _screen: (addr screen), x: int, y: int -> _/eax: int {
-560 var screen/esi: (addr screen) <- copy _screen
-561 var index/ecx: int <- screen-cell-index screen, x, y
-562 var result/eax: int <- screen-background-color-at-index screen, index
-563 return result
-564 }
-565
-566 fn screen-background-color-at-index _screen: (addr screen), _index: int -> _/eax: int {
-567 var screen/esi: (addr screen) <- copy _screen
-568 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
-569 var data/eax: (addr array screen-cell) <- lookup *data-ah
-570 var index/ecx: int <- copy _index
-571 var offset/ecx: (offset screen-cell) <- compute-offset data, index
-572 var cell/eax: (addr screen-cell) <- index data, offset
-573 var src/eax: (addr int) <- get cell, background-color
-574 var result/eax: int <- copy *src
-575 return result
-576 }
-577
-578 fn pixel screen: (addr screen), x: int, y: int, color: int {
-579 {
-580 compare screen, 0
-581 break-if-!=
-582 pixel-on-real-screen x, y, color
-583 return
-584 }
-585
-586 var screen/esi: (addr screen) <- copy screen
-587 var pixels-ah/eax: (addr handle array byte) <- get screen, pixels
-588 var pixels/eax: (addr array byte) <- lookup *pixels-ah
-589 {
-590 compare pixels, 0
-591 break-if-!=
-592 abort "pixel graphics not enabled for this screen"
-593 }
-594
-595 {
-596 compare x, 0
-597 break-if->=
-598 return
-599 }
-600 {
-601 var xmax-addr/eax: (addr int) <- get screen, width
-602 var xmax/eax: int <- copy *xmax-addr
-603 xmax <- shift-left 3/log2-font-width
-604 compare x, xmax
-605 break-if-<
-606 return
-607 }
-608 {
-609 compare y, 0
-610 break-if->=
-611 return
-612 }
-613 {
-614 var ymax-addr/eax: (addr int) <- get screen, height
-615 var ymax/eax: int <- copy *ymax-addr
-616 ymax <- shift-left 4/log2-font-height
-617 compare y, ymax
-618 break-if-<
-619 return
-620 }
-621
-622 var index/ecx: int <- pixel-index screen, x, y
-623 var dest/ecx: (addr byte) <- index pixels, index
-624 var src/eax: byte <- copy-byte color
-625 copy-byte-to *dest, src
-626 }
-627
-628 fn pixel-index _screen: (addr screen), x: int, y: int -> _/ecx: int {
-629 var screen/esi: (addr screen) <- copy _screen
-630 var width-addr/eax: (addr int) <- get screen, width
-631 var result/ecx: int <- copy y
-632 result <- multiply *width-addr
-633 result <- shift-left 3/log2-font-width
-634 result <- add x
-635 return result
-636 }
-637
-638
-639
-640
-641 fn copy-pixels _screen: (addr screen), target-screen: (addr screen) {
-642 var screen/esi: (addr screen) <- copy _screen
-643 var pixels-ah/eax: (addr handle array byte) <- get screen, pixels
-644 var _pixels/eax: (addr array byte) <- lookup *pixels-ah
-645 var pixels/edi: (addr array byte) <- copy _pixels
-646 var width-a/edx: (addr int) <- get screen, width
-647 var width/edx: int <- copy *width-a
-648 width <- shift-left 3/log2-font-width
-649 var height-a/ebx: (addr int) <- get screen, height
-650 var height/ebx: int <- copy *height-a
-651 height <- shift-left 4/log2-font-height
-652 var i/esi: int <- copy 0
-653 var y/ecx: int <- copy 0
-654 {
-655
-656 compare y, height
-657 break-if->=
-658 var x/eax: int <- copy 0
-659 {
-660 compare x, width
-661 break-if->=
-662 {
-663 var color-addr/ebx: (addr byte) <- index pixels, i
-664 var color/ebx: byte <- copy-byte *color-addr
-665 var color2/ebx: int <- copy color
-666 pixel target-screen, x, y, color2
-667 }
-668 x <- increment
-669 i <- increment
-670 loop
-671 }
-672 y <- increment
-673 loop
-674 }
-675 }
-676
-677
-678
-679
-680
-681 fn convert-screen-cells-to-pixels _screen: (addr screen) {
-682 var screen/esi: (addr screen) <- copy _screen
-683 var width-a/ebx: (addr int) <- get screen, width
-684 var height-a/edx: (addr int) <- get screen, height
-685 var data-ah/eax: (addr handle array byte) <- get screen, pixels
-686 var _data/eax: (addr array byte) <- lookup *data-ah
-687 var data: (addr array byte)
-688 copy-to data, _data
-689 var y/ecx: int <- copy 0
-690 {
-691 compare y, *height-a
-692 break-if->=
-693 var x/edi: int <- copy 0
-694 $convert-screen-cells-to-pixels:loop-x: {
-695 compare x, *width-a
-696 break-if->=
-697 {
-698 var tmp/eax: code-point <- screen-code-point-at screen, x, y
-699
-700
-701
-702 compare tmp, 0
-703 break-if-=
-704 var c: code-point
-705 copy-to c, tmp
-706 var tmp/eax: int <- screen-color-at screen, x, y
-707 var fg: int
-708 copy-to fg, tmp
-709 var bg/eax: int <- screen-background-color-at screen, x, y
-710 var offset/eax: int <- draw-code-point-on-screen-array data, c, x, y, fg, bg, *width-a, *height-a
-711 x <- add offset
-712 loop $convert-screen-cells-to-pixels:loop-x
-713 }
-714 x <- increment
-715 loop
-716 }
-717 y <- increment
-718 loop
-719 }
-720 }
+389 compare c, 0x20/space
+390 break-if-=
+391 return 0/false
+392 }
+393 x <- increment
+394 loop
+395 }
+396 y <- increment
+397 loop
+398 }
+399 var pixels-ah/eax: (addr handle array byte) <- get screen, pixels
+400 var pixels/eax: (addr array byte) <- lookup *pixels-ah
+401 var y/ebx: int <- copy 0
+402 var height-addr/edx: (addr int) <- get screen, height
+403 var height/edx: int <- copy *height-addr
+404 height <- shift-left 4/log2-font-height
+405 {
+406 compare y, height
+407 break-if->=
+408 var width-addr/edx: (addr int) <- get screen, width
+409 var width/edx: int <- copy *width-addr
+410 width <- shift-left 3/log2-font-width
+411 var x/edi: int <- copy 0
+412 {
+413 compare x, width
+414 break-if->=
+415 var index/ecx: int <- pixel-index screen, x, y
+416 var color-addr/ecx: (addr byte) <- index pixels, index
+417 var color/ecx: byte <- copy-byte *color-addr
+418 compare color, 0
+419 {
+420 break-if-=
+421 return 0/false
+422 }
+423 x <- increment
+424 loop
+425 }
+426 y <- increment
+427 loop
+428 }
+429 return 1/true
+430 }
+431
+432 fn clear-rect _screen: (addr screen), xmin: int, ymin: int, xmax: int, ymax: int, background-color: int {
+433 var screen/esi: (addr screen) <- copy _screen
+434 {
+435 compare screen, 0
+436 break-if-!=
+437 clear-rect-on-real-screen xmin, ymin, xmax, ymax, background-color
+438 return
+439 }
+440
+441 set-cursor-position screen, 0, 0
+442 var y/eax: int <- copy ymin
+443 var ymax/ecx: int <- copy ymax
+444 {
+445 compare y, ymax
+446 break-if->=
+447 var x/edx: int <- copy xmin
+448 var xmax/ebx: int <- copy xmax
+449 {
+450 compare x, xmax
+451 break-if->=
+452 var dummy/eax: int <- draw-code-point screen, 0x20/space, x, y, 0/fg, background-color
+453 x <- increment
+454 loop
+455 }
+456 y <- increment
+457 loop
+458 }
+459 set-cursor-position screen, 0, 0
+460 }
+461
+462
+463
+464 fn clear-real-screen {
+465 var y/eax: int <- copy 0
+466 {
+467 compare y, 0x300/screen-height=768
+468 break-if->=
+469 var x/edx: int <- copy 0
+470 {
+471 compare x, 0x400/screen-width=1024
+472 break-if->=
+473 pixel-on-real-screen x, y, 0/color=black
+474 x <- increment
+475 loop
+476 }
+477 y <- increment
+478 loop
+479 }
+480 }
+481
+482 fn clear-rect-on-real-screen xmin: int, ymin: int, xmax: int, ymax: int, background-color: int {
+483 var y/eax: int <- copy ymin
+484 y <- shift-left 4/log2-font-height
+485 var ymax/ecx: int <- copy ymax
+486 ymax <- shift-left 4/log2-font-height
+487 {
+488 compare y, ymax
+489 break-if->=
+490 var x/edx: int <- copy xmin
+491 x <- shift-left 3/log2-font-width
+492 var xmax/ebx: int <- copy xmax
+493 xmax <- shift-left 3/log2-font-width
+494 {
+495 compare x, xmax
+496 break-if->=
+497 pixel-on-real-screen x, y, background-color
+498 x <- increment
+499 loop
+500 }
+501 y <- increment
+502 loop
+503 }
+504 }
+505
+506 fn screen-cell-unused-at? _screen: (addr screen), x: int, y: int -> _/eax: boolean {
+507 var screen/esi: (addr screen) <- copy _screen
+508 var index/ecx: int <- screen-cell-index screen, x, y
+509 var result/eax: boolean <- screen-cell-unused-at-index? screen, index
+510 return result
+511 }
+512
+513 fn screen-cell-unused-at-index? _screen: (addr screen), _index: int -> _/eax: boolean {
+514 var screen/esi: (addr screen) <- copy _screen
+515 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
+516 var data/eax: (addr array screen-cell) <- lookup *data-ah
+517 var index/ecx: int <- copy _index
+518 var offset/ecx: (offset screen-cell) <- compute-offset data, index
+519 var cell/eax: (addr screen-cell) <- index data, offset
+520 var src/eax: (addr boolean) <- get cell, unused?
+521 return *src
+522 }
+523
+524 fn screen-code-point-at _screen: (addr screen), x: int, y: int -> _/eax: code-point {
+525 var screen/esi: (addr screen) <- copy _screen
+526 var index/ecx: int <- screen-cell-index screen, x, y
+527 var result/eax: code-point <- screen-code-point-at-index screen, index
+528 return result
+529 }
+530
+531 fn screen-code-point-at-index _screen: (addr screen), _index: int -> _/eax: code-point {
+532 var screen/esi: (addr screen) <- copy _screen
+533 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
+534 var data/eax: (addr array screen-cell) <- lookup *data-ah
+535 var index/ecx: int <- copy _index
+536 var offset/ecx: (offset screen-cell) <- compute-offset data, index
+537 var cell/eax: (addr screen-cell) <- index data, offset
+538 var src/eax: (addr code-point) <- get cell, data
+539 return *src
+540 }
+541
+542 fn screen-color-at _screen: (addr screen), x: int, y: int -> _/eax: int {
+543 var screen/esi: (addr screen) <- copy _screen
+544 var index/ecx: int <- screen-cell-index screen, x, y
+545 var result/eax: int <- screen-color-at-index screen, index
+546 return result
+547 }
+548
+549 fn screen-color-at-index _screen: (addr screen), _index: int -> _/eax: int {
+550 var screen/esi: (addr screen) <- copy _screen
+551 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
+552 var data/eax: (addr array screen-cell) <- lookup *data-ah
+553 var index/ecx: int <- copy _index
+554 var offset/ecx: (offset screen-cell) <- compute-offset data, index
+555 var cell/eax: (addr screen-cell) <- index data, offset
+556 var src/eax: (addr int) <- get cell, color
+557 var result/eax: int <- copy *src
+558 return result
+559 }
+560
+561 fn screen-background-color-at _screen: (addr screen), x: int, y: int -> _/eax: int {
+562 var screen/esi: (addr screen) <- copy _screen
+563 var index/ecx: int <- screen-cell-index screen, x, y
+564 var result/eax: int <- screen-background-color-at-index screen, index
+565 return result
+566 }
+567
+568 fn screen-background-color-at-index _screen: (addr screen), _index: int -> _/eax: int {
+569 var screen/esi: (addr screen) <- copy _screen
+570 var data-ah/eax: (addr handle array screen-cell) <- get screen, data
+571 var data/eax: (addr array screen-cell) <- lookup *data-ah
+572 var index/ecx: int <- copy _index
+573 var offset/ecx: (offset screen-cell) <- compute-offset data, index
+574 var cell/eax: (addr screen-cell) <- index data, offset
+575 var src/eax: (addr int) <- get cell, background-color
+576 var result/eax: int <- copy *src
+577 return result
+578 }
+579
+580 fn pixel screen: (addr screen), x: int, y: int, color: int {
+581 {
+582 compare screen, 0
+583 break-if-!=
+584 pixel-on-real-screen x, y, color
+585 return
+586 }
+587
+588 var screen/esi: (addr screen) <- copy screen
+589 var pixels-ah/eax: (addr handle array byte) <- get screen, pixels
+590 var pixels/eax: (addr array byte) <- lookup *pixels-ah
+591 {
+592 compare pixels, 0
+593 break-if-!=
+594 abort "pixel graphics not enabled for this screen"
+595 }
+596
+597 {
+598 compare x, 0
+599 break-if->=
+600 return
+601 }
+602 {
+603 var xmax-addr/eax: (addr int) <- get screen, width
+604 var xmax/eax: int <- copy *xmax-addr
+605 xmax <- shift-left 3/log2-font-width
+606 compare x, xmax
+607 break-if-<
+608 return
+609 }
+610 {
+611 compare y, 0
+612 break-if->=
+613 return
+614 }
+615 {
+616 var ymax-addr/eax: (addr int) <- get screen, height
+617 var ymax/eax: int <- copy *ymax-addr
+618 ymax <- shift-left 4/log2-font-height
+619 compare y, ymax
+620 break-if-<
+621 return
+622 }
+623
+624 var index/ecx: int <- pixel-index screen, x, y
+625 var dest/ecx: (addr byte) <- index pixels, index
+626 var src/eax: byte <- copy-byte color
+627 copy-byte-to *dest, src
+628 }
+629
+630 fn pixel-index _screen: (addr screen), x: int, y: int -> _/ecx: int {
+631 var screen/esi: (addr screen) <- copy _screen
+632 var width-addr/eax: (addr int) <- get screen, width
+633 var result/ecx: int <- copy y
+634 result <- multiply *width-addr
+635 result <- shift-left 3/log2-font-width
+636 result <- add x
+637 return result
+638 }
+639
+640
+641
+642
+643 fn copy-pixels _screen: (addr screen), target-screen: (addr screen) {
+644 var screen/esi: (addr screen) <- copy _screen
+645 var pixels-ah/eax: (addr handle array byte) <- get screen, pixels
+646 var _pixels/eax: (addr array byte) <- lookup *pixels-ah
+647 var pixels/edi: (addr array byte) <- copy _pixels
+648 var width-a/edx: (addr int) <- get screen, width
+649 var width/edx: int <- copy *width-a
+650 width <- shift-left 3/log2-font-width
+651 var height-a/ebx: (addr int) <- get screen, height
+652 var height/ebx: int <- copy *height-a
+653 height <- shift-left 4/log2-font-height
+654 var i/esi: int <- copy 0
+655 var y/ecx: int <- copy 0
+656 {
+657
+658 compare y, height
+659 break-if->=
+660 var x/eax: int <- copy 0
+661 {
+662 compare x, width
+663 break-if->=
+664 {
+665 var color-addr/ebx: (addr byte) <- index pixels, i
+666 var color/ebx: byte <- copy-byte *color-addr
+667 var color2/ebx: int <- copy color
+668 pixel target-screen, x, y, color2
+669 }
+670 x <- increment
+671 i <- increment
+672 loop
+673 }
+674 y <- increment
+675 loop
+676 }
+677 }
+678
+679
+680
+681
+682
+683 fn convert-screen-cells-to-pixels _screen: (addr screen) {
+684 var screen/esi: (addr screen) <- copy _screen
+685 var width-a/ebx: (addr int) <- get screen, width
+686 var height-a/edx: (addr int) <- get screen, height
+687 var data-ah/eax: (addr handle array byte) <- get screen, pixels
+688 var _data/eax: (addr array byte) <- lookup *data-ah
+689 var data: (addr array byte)
+690 copy-to data, _data
+691 var y/ecx: int <- copy 0
+692 {
+693 compare y, *height-a
+694 break-if->=
+695 var x/edi: int <- copy 0
+696 $convert-screen-cells-to-pixels:loop-x: {
+697 compare x, *width-a
+698 break-if->=
+699 {
+700 var tmp/eax: code-point <- screen-code-point-at screen, x, y
+701
+702
+703
+704 compare tmp, 0
+705 break-if-=
+706 var c: code-point
+707 copy-to c, tmp
+708 var tmp/eax: int <- screen-color-at screen, x, y
+709 var fg: int
+710 copy-to fg, tmp
+711 var bg/eax: int <- screen-background-color-at screen, x, y
+712 var offset/eax: int <- draw-code-point-on-screen-array data, c, x, y, fg, bg, *width-a, *height-a
+713 x <- add offset
+714 loop $convert-screen-cells-to-pixels:loop-x
+715 }
+716 x <- increment
+717 loop
+718 }
+719 y <- increment
+720 loop
+721 }
+722 }