Tweaked (setf pixel).
[movitz-core.git] / losp / x86-pc / vga.lisp
bloba146b84c758e2dd58dc67ff1ab9a63b2672b84e6
1 ;;;;------------------------------------------------------------------
2 ;;;;
3 ;;;; Copyright (C) 2001-2004,
4 ;;;; Department of Computer Science, University of Tromso, Norway.
5 ;;;;
6 ;;;; For distribution policy, see the accompanying file COPYING.
7 ;;;;
8 ;;;; Filename: vga.lisp
9 ;;;; Description: Low-level VGA interfacing.
10 ;;;; Author: Frode Vatvedt Fjeld <frodef@acm.org>
11 ;;;; Created at: Tue Sep 25 14:08:20 2001
12 ;;;;
13 ;;;; $Id: vga.lisp,v 1.14 2007/04/13 22:59:26 ffjeld Exp $
14 ;;;;
15 ;;;;------------------------------------------------------------------
17 (require :x86-pc/package)
18 (provide :x86-pc/vga)
20 (in-package muerte.x86-pc)
22 (defconstant +vga-base+ #x3c0)
24 (defmacro vga-port (register)
25 `(io-register8 +vga-base+ ,register))
27 (defun vga-crt-controller-register (register)
28 (let* ((address-register (if (logbitp 0 (io-port #x3cc :unsigned-byte8)) #x3d4 #x3b4))
29 (data-register (1+ address-register)))
30 (setf (io-port address-register :unsigned-byte8) register)
31 (io-port data-register :unsigned-byte8)))
33 (defun (setf vga-crt-controller-register) (value register)
34 (let* ((address-register (if (logbitp 0 (io-port #x3cc :unsigned-byte8)) #x3d4 #x3b4))
35 (data-register (1+ address-register)))
36 (setf (io-port address-register :unsigned-byte8) register
37 (io-port data-register :unsigned-byte8) value)))
39 (defun vga-graphics-register (register)
40 (setf (io-port #x3ce :unsigned-byte8) register)
41 (io-port #x3cf :unsigned-byte8))
43 (defun (setf vga-graphics-register) (value register)
44 (setf (io-port #x3ce :unsigned-byte8) register
45 (io-port #x3cf :unsigned-byte8) value))
47 (defun vga-sequencer-register (register)
48 (setf (vga-port 4) register)
49 (vga-port 5))
51 (defun (setf vga-sequencer-register) (value register)
52 (setf (vga-port 4) register
53 (vga-port 5) value))
55 (defun vga-attribute-register (register)
56 (vga-port #x1a)
57 (setf (vga-port 0) register)
58 (vga-port 1))
60 (defun (setf vga-attribute-register) (value register)
61 (vga-port #x1a)
62 (setf (vga-port 0) register
63 (vga-port 0) value))
65 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
67 (defun (setf vga-cursor-location) (value)
68 (setf (vga-crt-controller-register #x0e) (ldb (byte 8 8) value) ; high
69 (vga-crt-controller-register #x0f) (ldb (byte 8 0) value)) ; low
70 value)
72 (defun vga-cursor-location ()
73 (dpb (vga-crt-controller-register #x0e)
74 (byte 8 8)
75 (vga-crt-controller-register #x0f)))
77 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
79 (defun vga-memory-map ()
80 (case (ldb (byte 2 2)
81 (vga-graphics-register 6))
82 (#b00 (values #xa0000 #xbffff))
83 (#b01 (values #xa0000 #xaffff))
84 (#b10 (values #xb0000 #xb7fff))
85 (#b11 (values #xb8000 #xbffff))))
87 (defun vga-horizontal-display-end ()
88 (1+ (vga-crt-controller-register 1)))
90 (defun vga-vertical-display-end ()
91 (let ((overflow (vga-crt-controller-register 7)))
92 (+ 1
93 (vga-crt-controller-register #x12)
94 (if (logbitp 1 overflow) #x100 0)
95 (if (logbitp 6 overflow) #x200 0))))
97 (defun vga-character-height ()
98 (1+ (ldb (byte 5 0)
99 (vga-crt-controller-register 9))))
101 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
106 ;;; VGA stuff ported from http://my.execpc.com/CE/AC/geezer/osd/graphics/modes.c
108 (defconstant +vga-state-80x25+
109 '((:misc . #x67)
110 (:sequencer
111 #x03 #x00 #x03 #x00 #x02)
112 (:crtc
113 #x5F #x4F #x50 #x82 #x55 #x81 #xBF #x1F
114 #x00 #x4F #x0D #x0E #x00 #x00 #x00 #x50
115 #x9C #x0E #x8F #x28 #x1F #x96 #xB9 #xA3
116 #xFF)
117 (:graphics
118 #x00 #x00 #x00 #x00 #x00 #x10 #x0E #x00
119 #xFF)
120 (:attribute
121 #x00 #x01 #x02 #x03 #x04 #x05 #x14 #x07
122 #x38 #x39 #x3A #x3B #x3C #x3D #x3E #x3F
123 #x0C #x00 #x0F #x08 #x00)))
125 (defconstant +vga-state-80x50+
126 '((:misc . #x67)
127 (:sequencer
128 #x03 #x00 #x03 #x00 #x02)
129 (:crtc
130 #x5F #x4F #x50 #x82 #x55 #x81 #xBF #x1F
131 #x00 #x47 #x06 #x07 #x00 #x00 #x01 #x40
132 #x9C #x8E #x8F #x28 #x1F #x96 #xB9 #xA3
133 #xFF)
134 (:graphics
135 #x00 #x00 #x00 #x00 #x00 #x10 #x0E #x00
136 #xFF)
137 (:attribute
138 #x00 #x01 #x02 #x03 #x04 #x05 #x14 #x07
139 #x38 #x39 #x3A #x3B #x3C #x3D #x3E #x3F
140 #x0C #x00 #x0F #x08 #x00)))
142 (defconstant +vga-state-40x25+
143 '((:misc . #x67)
144 (:sequencer
145 #x03 #x08 #x03 #x00 #x02)
146 (:crtc
147 #x2D #x27 #x28 #x90 #x2B #xA0 #xBF #x1F
148 #x00 #x4F #x0D #x0E #x00 #x00 #x00 #xA0
149 #x9C #x8E #x8F #x14 #x1F #x96 #xB9 #xA3
150 #xFF)
151 (:graphics
152 #x00 #x00 #x00 #x00 #x00 #x10 #x0E #x00
153 #xFF)
154 (:attribute
155 #x00 #x01 #x02 #x03 #x04 #x05 #x14 #x07
156 #x38 #x39 #x3A #x3B #x3C #x3D #x3E #x3F
157 #x0C #x00 #x0F #x08 #x00)))
159 (defconstant +vga-state-40x50+
160 '((:misc . #x67)
161 (:sequencer
162 #x03 #x08 #x03 #x00 #x02)
163 (:crtc
164 #x2D #x27 #x28 #x90 #x2B #xA0 #xBF #x1F
165 #x00 #x47 #x06 #x07 #x00 #x00 #x04 #x60
166 #x9C #x8E #x8F #x14 #x1F #x96 #xB9 #xA3
167 #xFF)
168 (:graphics
169 #x00 #x00 #x00 #x00 #x00 #x10 #x0E #x00
170 #xFF)
171 (:attribute
172 #x00 #x01 #x02 #x03 #x04 #x05 #x14 #x07
173 #x38 #x39 #x3A #x3B #x3C #x3D #x3E #x3F
174 #x0C #x00 #x0F #x08 #x00)))
176 (defconstant +vga-state-90x30+
177 '((:misc . #xE7)
178 (:sequencer
179 #x03 #x01 #x03 #x00 #x02)
180 (:crtc
181 #x6B #x59 #x5A #x82 #x60 #x8D #x0B #x3E
182 #x00 #x4F #x0D #x0E #x00 #x00 #x00 #x00
183 #xEA #x0C #xDF #x2D #x10 #xE8 #x05 #xA3
184 #xFF)
185 (:graphics
186 #x00 #x00 #x00 #x00 #x00 #x10 #x0E #x00
187 #xFF)
188 (:attribute
189 #x00 #x01 #x02 #x03 #x04 #x05 #x14 #x07
190 #x38 #x39 #x3A #x3B #x3C #x3D #x3E #x3F
191 #x0C #x00 #x0F #x08 #x00)))
193 (defconstant +vga-state-90x60+
194 '((:misc . #xE7)
195 (:sequencer
196 #x03 #x01 #x03 #x00 #x02)
197 (:crtc
198 #x6B #x59 #x5A #x82 #x60 #x8D #x0B #x3E
199 #x00 #x47 #x06 #x07 #x00 #x00 #x00 #x00
200 #xEA #x0C #xDF #x2D #x08 #xE8 #x05 #xA3
201 #xFF)
202 (:graphics
203 #x00 #x00 #x00 #x00 #x00 #x10 #x0E #x00
204 #xFF)
205 (:attribute
206 #x00 #x01 #x02 #x03 #x04 #x05 #x14 #x07
207 #x38 #x39 #x3A #x3B #x3C #x3D #x3E #x3F
208 #x0C #x00 #x0F #x08 #x00)))
210 (defconstant +vga-state-320x200x256-modex+
211 '((:misc . #x63)
212 (:sequencer
213 #x03 #x01 #x0F #x00 #x06)
214 (:crtc
215 #x5F #x4F #x50 #x82 #x54 #x80 #xBF #x1F
216 #x00 #x41 #x00 #x00 #x00 #x00 #x00 #x00
217 #x9C #x0E #x8F #x28 #x00 #x96 #xB9 #xE3
218 #xFF)
219 (:graphics
220 #x00 #x00 #x00 #x00 #x00 #x40 #x05 #x0F
221 #xFF)
222 (:attribute
223 #x00 #x01 #x02 #x03 #x04 #x05 #x06 #x07
224 #x08 #x09 #x0A #x0B #x0C #x0D #x0E #x0F
225 #x41 #x00 #x0F #x00 #x00)))
228 ;; intended future wrapper for graphics modes
229 (defconstant +graphical-mode-modex+
230 '(+vga-state-320x200x256-modex+ ; vga state
231 320 ; width
232 200 ; height
233 3)) ; page count
236 (defvar *vga-current-page* 0)
237 (defvar *vga-page-count* 0)
238 (defvar *vga-width* 0)
239 (defvar *vga-height* 0)
240 (defvar *vga-viewport* '(0 0 0 0))
242 (defconstant +vga-misc-read+ #x0c)
243 (defconstant +vga-misc-write+ #x02)
245 (defconstant VGA-MISC-WRITE #x3C2)
246 (defconstant VGA-AC-INDEX #x3C0)
247 (defconstant VGA-AC-WRITE #x3C0)
248 (defconstant VGA-AC-READ #x3C1)
249 (defconstant VGA-SEQ-INDEX #x3C4)
250 (defconstant VGA-SEQ-DATA #x3C5)
251 (defconstant VGA-DAC-READ-INDEX #x3C7)
252 (defconstant VGA-DAC-WRITE-INDEX #x3C8)
253 (defconstant VGA-DAC-DATA #x3C9)
254 (defconstant VGA-MISC-READ #x3CC)
255 (defconstant VGA-GC-INDEX #x3CE)
256 (defconstant VGA-GC-DATA #x3CF)
257 (defconstant VGA-CRTC-INDEX #x3D4)
258 (defconstant VGA-CRTC-DATA #x3D5)
259 (defconstant VGA-INSTAT-READ #x3DA)
261 (defun vga-state ()
262 "Dump the state of the VGA register set."
263 (prog1
264 (list
265 (cons :misc
266 (vga-port +vga-misc-read+))
267 (cons :sequencer
268 (loop for i from 0 below 5
269 collect (vga-sequencer-register i)))
270 (cons :crtc
271 (loop for i from 0 below 25
272 collect (vga-crt-controller-register i)))
273 (cons :graphics
274 (loop for i from 0 below 9
275 collect (vga-graphics-register i)))
276 (cons :attribute
277 (loop for i from 0 below 21
278 collect (vga-attribute-register i))))
279 ;; lock 16-color palette and unblank display
280 (io-port VGA-INSTAT-READ :unsigned-byte8)
281 (setf (io-port VGA-AC-INDEX :unsigned-byte8) #x20)))
283 (defun (setf vga-state) (state &optional unsafe-p)
284 "Initialize the state of the VGA register set."
285 (let ((old-state (if unsafe-p nil (vga-state))))
286 (flet ((vga-reset (&optional c)
287 (declare (ignore c))
288 (when old-state
289 (warn "Something bad happened, resetting VGA state..")
290 (setf (vga-state t) old-state
291 old-state nil)))
292 (assert-register-set (state register-set)
293 (let ((set (assoc register-set state)))
294 (assert set () "VGA state is missing ~A." register-set)
295 (cdr set))))
296 (unwind-protect
297 (handler-bind ((serious-condition #'vga-reset))
298 ;; write MISCELLANEOUS reg
299 (setf (vga-port +vga-misc-write+)
300 (assert-register-set state :misc))
301 ;; write SEQUENCER regs
302 (loop for x in (assert-register-set state :sequencer)
303 as i upfrom 0
304 do (setf (vga-sequencer-register i) x))
305 (loop
306 ;; unlock CRTC registers
307 initially (setf (vga-crt-controller-register 3)
308 (logior #x80 (vga-crt-controller-register 3)))
309 (setf (vga-crt-controller-register #x11)
310 (logand #x7f (vga-crt-controller-register #x11)))
311 for x in (assert-register-set state :crtc)
312 as i upfrom 0
313 do (setf (vga-crt-controller-register i)
314 (case i
315 ;; make sure they remain unlocked
316 (#x03 (logior #x80 x))
317 (#x11 (logand #x7f x))
318 (t x))))
319 ;; write GRAPHICS CONTROLLER regs
320 (loop for x in (assert-register-set state :graphics)
321 as i upfrom 0
322 do (setf (vga-graphics-register i) x))
323 ;; write ATTRIBUTE CONTROLLER regs
324 (loop for x in (assert-register-set state :attribute)
325 as i upfrom 0
326 do (setf (vga-attribute-register i) x))
327 ;; lock 16-color palette and unblank display
328 (io-port VGA-INSTAT-READ :unsigned-byte8)
329 (setf (io-port VGA-AC-INDEX :unsigned-byte8) #x20)
330 (setf old-state nil))
331 (vga-reset))))
332 state)
334 (defun set-plane (p)
335 (check-type p (integer 0 3))
336 (let* ((p (logand p 3))
337 (pmask (ash 1 p)))
338 ;; set read plane
339 (setf (io-port VGA-GC-INDEX :unsigned-byte8) 4)
340 (setf (io-port VGA-GC-DATA :unsigned-byte8) p)
341 ;; set write plane
342 (setf (io-port VGA-SEQ-INDEX :unsigned-byte8) 2)
343 (setf (io-port VGA-SEQ-DATA :unsigned-byte8) pmask))
344 (values))
346 (defun set-plane-by-bitmask (p)
347 (check-type p (integer 0 15))
348 ;; set read plane
349 (setf (io-port VGA-GC-INDEX :unsigned-byte8) 4)
350 (setf (io-port VGA-GC-DATA :unsigned-byte8) p)
351 ;; set write plane
352 (setf (io-port VGA-SEQ-INDEX :unsigned-byte8) 2)
353 (setf (io-port VGA-SEQ-DATA :unsigned-byte8) p))
355 (defun vmemwr (dst-off src start end)
356 (loop for i from start below end as dst upfrom dst-off
357 do (setf (memref-int (vga-memory-map) :index dst :type :unsigned-byte8)
358 (aref src i)))
359 (values))
361 (defun write-font (buf font-height)
362 (let* ((seq2
363 (progn
364 ;; set_plane() modifies GC 4 and SEQ 2, so save them as well
365 (setf (io-port VGA-SEQ-INDEX :unsigned-byte8) 2)
366 (io-port VGA-SEQ-DATA :unsigned-byte8)))
367 (seq4
368 (progn
369 (setf (io-port VGA-SEQ-INDEX :unsigned-byte8) 4)
370 (io-port VGA-SEQ-DATA :unsigned-byte8)))
371 (gc4
372 (progn
373 ;; turn off even-odd addressing (set flat addressing)
374 ;; assume: chain-4 addressing already off
375 (setf (io-port VGA-SEQ-DATA :unsigned-byte8)
376 (logior #x04 seq4))
377 (setf (io-port VGA-GC-INDEX :unsigned-byte8) 4)
378 (io-port VGA-GC-DATA :unsigned-byte8)))
379 (gc5
380 (progn
381 (setf (io-port VGA-GC-INDEX :unsigned-byte8) 5)
382 (io-port VGA-GC-DATA :unsigned-byte8)))
383 (gc6
384 (progn
385 ;; turn off even-odd addressing
386 (setf (io-port VGA-GC-DATA :unsigned-byte8)
387 (logand gc5 (logxor #x10 #xff)))
388 (setf (io-port VGA-GC-INDEX :unsigned-byte8) 6)
389 (io-port VGA-GC-DATA :unsigned-byte8))))
390 ;; turn off even-odd addressing
391 (setf (io-port VGA-GC-DATA :unsigned-byte8)
392 (logand gc6 (logxor #xff #x02)))
393 ;; write font to plane P4
394 (set-plane 2) ; set_plane(2)
395 ;; write font 0
396 (dotimes (i 256)
397 (vmemwr (* i 32) buf (* i font-height) (* (1+ i) font-height)))
399 ;; restore registers
400 (setf (io-port VGA-SEQ-INDEX :unsigned-byte8) 2)
401 (setf (io-port VGA-SEQ-DATA :unsigned-byte8) seq2)
402 (setf (io-port VGA-SEQ-INDEX :unsigned-byte8) 4)
403 (setf (io-port VGA-SEQ-DATA :unsigned-byte8) seq4)
404 (setf (io-port VGA-GC-INDEX :unsigned-byte8) 4)
405 (setf (io-port VGA-GC-DATA :unsigned-byte8) gc4)
406 (setf (io-port VGA-GC-INDEX :unsigned-byte8) 5)
407 (setf (io-port VGA-GC-DATA :unsigned-byte8) gc5)
408 (setf (io-port VGA-GC-INDEX :unsigned-byte8) 6)
409 (setf (io-port VGA-GC-DATA :unsigned-byte8) gc6))
410 (values))
413 (defconstant +vga-font-8x8+
414 #{#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
415 #x7E #x81 #xA5 #x81 #xBD #x99 #x81 #x7E
416 #x7E #xFF #xDB #xFF #xC3 #xE7 #xFF #x7E
417 #x6C #xFE #xFE #xFE #x7C #x38 #x10 #x00
418 #x10 #x38 #x7C #xFE #x7C #x38 #x10 #x00
419 #x38 #x7C #x38 #xFE #xFE #x92 #x10 #x7C
420 #x00 #x10 #x38 #x7C #xFE #x7C #x38 #x7C
421 #x00 #x00 #x18 #x3C #x3C #x18 #x00 #x00
422 #xFF #xFF #xE7 #xC3 #xC3 #xE7 #xFF #xFF
423 #x00 #x3C #x66 #x42 #x42 #x66 #x3C #x00
424 #xFF #xC3 #x99 #xBD #xBD #x99 #xC3 #xFF
425 #x0F #x07 #x0F #x7D #xCC #xCC #xCC #x78
426 #x3C #x66 #x66 #x66 #x3C #x18 #x7E #x18
427 #x3F #x33 #x3F #x30 #x30 #x70 #xF0 #xE0
428 #x7F #x63 #x7F #x63 #x63 #x67 #xE6 #xC0
429 #x99 #x5A #x3C #xE7 #xE7 #x3C #x5A #x99
430 #x80 #xE0 #xF8 #xFE #xF8 #xE0 #x80 #x00
431 #x02 #x0E #x3E #xFE #x3E #x0E #x02 #x00
432 #x18 #x3C #x7E #x18 #x18 #x7E #x3C #x18
433 #x66 #x66 #x66 #x66 #x66 #x00 #x66 #x00
434 #x7F #xDB #xDB #x7B #x1B #x1B #x1B #x00
435 #x3E #x63 #x38 #x6C #x6C #x38 #x86 #xFC
436 #x00 #x00 #x00 #x00 #x7E #x7E #x7E #x00
437 #x18 #x3C #x7E #x18 #x7E #x3C #x18 #xFF
438 #x18 #x3C #x7E #x18 #x18 #x18 #x18 #x00
439 #x18 #x18 #x18 #x18 #x7E #x3C #x18 #x00
440 #x00 #x18 #x0C #xFE #x0C #x18 #x00 #x00
441 #x00 #x30 #x60 #xFE #x60 #x30 #x00 #x00
442 #x00 #x00 #xC0 #xC0 #xC0 #xFE #x00 #x00
443 #x00 #x24 #x66 #xFF #x66 #x24 #x00 #x00
444 #x00 #x18 #x3C #x7E #xFF #xFF #x00 #x00
445 #x00 #xFF #xFF #x7E #x3C #x18 #x00 #x00
446 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
447 #x18 #x3C #x3C #x18 #x18 #x00 #x18 #x00
448 #x6C #x6C #x6C #x00 #x00 #x00 #x00 #x00
449 #x6C #x6C #xFE #x6C #xFE #x6C #x6C #x00
450 #x18 #x7E #xC0 #x7C #x06 #xFC #x18 #x00
451 #x00 #xC6 #xCC #x18 #x30 #x66 #xC6 #x00
452 #x38 #x6C #x38 #x76 #xDC #xCC #x76 #x00
453 #x30 #x30 #x60 #x00 #x00 #x00 #x00 #x00
454 #x18 #x30 #x60 #x60 #x60 #x30 #x18 #x00
455 #x60 #x30 #x18 #x18 #x18 #x30 #x60 #x00
456 #x00 #x66 #x3C #xFF #x3C #x66 #x00 #x00
457 #x00 #x18 #x18 #x7E #x18 #x18 #x00 #x00
458 #x00 #x00 #x00 #x00 #x00 #x18 #x18 #x30
459 #x00 #x00 #x00 #x7E #x00 #x00 #x00 #x00
460 #x00 #x00 #x00 #x00 #x00 #x18 #x18 #x00
461 #x06 #x0C #x18 #x30 #x60 #xC0 #x80 #x00
462 #x7C #xCE #xDE #xF6 #xE6 #xC6 #x7C #x00
463 #x30 #x70 #x30 #x30 #x30 #x30 #xFC #x00
464 #x78 #xCC #x0C #x38 #x60 #xCC #xFC #x00
465 #x78 #xCC #x0C #x38 #x0C #xCC #x78 #x00
466 #x1C #x3C #x6C #xCC #xFE #x0C #x1E #x00
467 #xFC #xC0 #xF8 #x0C #x0C #xCC #x78 #x00
468 #x38 #x60 #xC0 #xF8 #xCC #xCC #x78 #x00
469 #xFC #xCC #x0C #x18 #x30 #x30 #x30 #x00
470 #x78 #xCC #xCC #x78 #xCC #xCC #x78 #x00
471 #x78 #xCC #xCC #x7C #x0C #x18 #x70 #x00
472 #x00 #x18 #x18 #x00 #x00 #x18 #x18 #x00
473 #x00 #x18 #x18 #x00 #x00 #x18 #x18 #x30
474 #x18 #x30 #x60 #xC0 #x60 #x30 #x18 #x00
475 #x00 #x00 #x7E #x00 #x7E #x00 #x00 #x00
476 #x60 #x30 #x18 #x0C #x18 #x30 #x60 #x00
477 #x3C #x66 #x0C #x18 #x18 #x00 #x18 #x00
478 #x7C #xC6 #xDE #xDE #xDC #xC0 #x7C #x00
479 #x30 #x78 #xCC #xCC #xFC #xCC #xCC #x00
480 #xFC #x66 #x66 #x7C #x66 #x66 #xFC #x00
481 #x3C #x66 #xC0 #xC0 #xC0 #x66 #x3C #x00
482 #xF8 #x6C #x66 #x66 #x66 #x6C #xF8 #x00
483 #xFE #x62 #x68 #x78 #x68 #x62 #xFE #x00
484 #xFE #x62 #x68 #x78 #x68 #x60 #xF0 #x00
485 #x3C #x66 #xC0 #xC0 #xCE #x66 #x3A #x00
486 #xCC #xCC #xCC #xFC #xCC #xCC #xCC #x00
487 #x78 #x30 #x30 #x30 #x30 #x30 #x78 #x00
488 #x1E #x0C #x0C #x0C #xCC #xCC #x78 #x00
489 #xE6 #x66 #x6C #x78 #x6C #x66 #xE6 #x00
490 #xF0 #x60 #x60 #x60 #x62 #x66 #xFE #x00
491 #xC6 #xEE #xFE #xFE #xD6 #xC6 #xC6 #x00
492 #xC6 #xE6 #xF6 #xDE #xCE #xC6 #xC6 #x00
493 #x38 #x6C #xC6 #xC6 #xC6 #x6C #x38 #x00
494 #xFC #x66 #x66 #x7C #x60 #x60 #xF0 #x00
495 #x7C #xC6 #xC6 #xC6 #xD6 #x7C #x0E #x00
496 #xFC #x66 #x66 #x7C #x6C #x66 #xE6 #x00
497 #x7C #xC6 #xE0 #x78 #x0E #xC6 #x7C #x00
498 #xFC #xB4 #x30 #x30 #x30 #x30 #x78 #x00
499 #xCC #xCC #xCC #xCC #xCC #xCC #xFC #x00
500 #xCC #xCC #xCC #xCC #xCC #x78 #x30 #x00
501 #xC6 #xC6 #xC6 #xC6 #xD6 #xFE #x6C #x00
502 #xC6 #xC6 #x6C #x38 #x6C #xC6 #xC6 #x00
503 #xCC #xCC #xCC #x78 #x30 #x30 #x78 #x00
504 #xFE #xC6 #x8C #x18 #x32 #x66 #xFE #x00
505 #x78 #x60 #x60 #x60 #x60 #x60 #x78 #x00
506 #xC0 #x60 #x30 #x18 #x0C #x06 #x02 #x00
507 #x78 #x18 #x18 #x18 #x18 #x18 #x78 #x00
508 #x10 #x38 #x6C #xC6 #x00 #x00 #x00 #x00
509 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xFF
510 #x30 #x30 #x18 #x00 #x00 #x00 #x00 #x00
511 #x00 #x00 #x78 #x0C #x7C #xCC #x76 #x00
512 #xE0 #x60 #x60 #x7C #x66 #x66 #xDC #x00
513 #x00 #x00 #x78 #xCC #xC0 #xCC #x78 #x00
514 #x1C #x0C #x0C #x7C #xCC #xCC #x76 #x00
515 #x00 #x00 #x78 #xCC #xFC #xC0 #x78 #x00
516 #x38 #x6C #x64 #xF0 #x60 #x60 #xF0 #x00
517 #x00 #x00 #x76 #xCC #xCC #x7C #x0C #xF8
518 #xE0 #x60 #x6C #x76 #x66 #x66 #xE6 #x00
519 #x30 #x00 #x70 #x30 #x30 #x30 #x78 #x00
520 #x0C #x00 #x1C #x0C #x0C #xCC #xCC #x78
521 #xE0 #x60 #x66 #x6C #x78 #x6C #xE6 #x00
522 #x70 #x30 #x30 #x30 #x30 #x30 #x78 #x00
523 #x00 #x00 #xCC #xFE #xFE #xD6 #xD6 #x00
524 #x00 #x00 #xB8 #xCC #xCC #xCC #xCC #x00
525 #x00 #x00 #x78 #xCC #xCC #xCC #x78 #x00
526 #x00 #x00 #xDC #x66 #x66 #x7C #x60 #xF0
527 #x00 #x00 #x76 #xCC #xCC #x7C #x0C #x1E
528 #x00 #x00 #xDC #x76 #x62 #x60 #xF0 #x00
529 #x00 #x00 #x7C #xC0 #x70 #x1C #xF8 #x00
530 #x10 #x30 #xFC #x30 #x30 #x34 #x18 #x00
531 #x00 #x00 #xCC #xCC #xCC #xCC #x76 #x00
532 #x00 #x00 #xCC #xCC #xCC #x78 #x30 #x00
533 #x00 #x00 #xC6 #xC6 #xD6 #xFE #x6C #x00
534 #x00 #x00 #xC6 #x6C #x38 #x6C #xC6 #x00
535 #x00 #x00 #xCC #xCC #xCC #x7C #x0C #xF8
536 #x00 #x00 #xFC #x98 #x30 #x64 #xFC #x00
537 #x1C #x30 #x30 #xE0 #x30 #x30 #x1C #x00
538 #x18 #x18 #x18 #x00 #x18 #x18 #x18 #x00
539 #xE0 #x30 #x30 #x1C #x30 #x30 #xE0 #x00
540 #x76 #xDC #x00 #x00 #x00 #x00 #x00 #x00
541 #x00 #x10 #x38 #x6C #xC6 #xC6 #xFE #x00
542 #x7C #xC6 #xC0 #xC6 #x7C #x0C #x06 #x7C
543 #x00 #xCC #x00 #xCC #xCC #xCC #x76 #x00
544 #x1C #x00 #x78 #xCC #xFC #xC0 #x78 #x00
545 #x7E #x81 #x3C #x06 #x3E #x66 #x3B #x00
546 #xCC #x00 #x78 #x0C #x7C #xCC #x76 #x00
547 #xE0 #x00 #x78 #x0C #x7C #xCC #x76 #x00
548 #x30 #x30 #x78 #x0C #x7C #xCC #x76 #x00
549 #x00 #x00 #x7C #xC6 #xC0 #x78 #x0C #x38
550 #x7E #x81 #x3C #x66 #x7E #x60 #x3C #x00
551 #xCC #x00 #x78 #xCC #xFC #xC0 #x78 #x00
552 #xE0 #x00 #x78 #xCC #xFC #xC0 #x78 #x00
553 #xCC #x00 #x70 #x30 #x30 #x30 #x78 #x00
554 #x7C #x82 #x38 #x18 #x18 #x18 #x3C #x00
555 #xE0 #x00 #x70 #x30 #x30 #x30 #x78 #x00
556 #xC6 #x10 #x7C #xC6 #xFE #xC6 #xC6 #x00
557 #x30 #x30 #x00 #x78 #xCC #xFC #xCC #x00
558 #x1C #x00 #xFC #x60 #x78 #x60 #xFC #x00
559 #x00 #x00 #x7F #x0C #x7F #xCC #x7F #x00
560 #x3E #x6C #xCC #xFE #xCC #xCC #xCE #x00
561 #x78 #x84 #x00 #x78 #xCC #xCC #x78 #x00
562 #x00 #xCC #x00 #x78 #xCC #xCC #x78 #x00
563 #x00 #xE0 #x00 #x78 #xCC #xCC #x78 #x00
564 #x78 #x84 #x00 #xCC #xCC #xCC #x76 #x00
565 #x00 #xE0 #x00 #xCC #xCC #xCC #x76 #x00
566 #x00 #xCC #x00 #xCC #xCC #x7C #x0C #xF8
567 #xC3 #x18 #x3C #x66 #x66 #x3C #x18 #x00
568 #xCC #x00 #xCC #xCC #xCC #xCC #x78 #x00
569 #x18 #x18 #x7E #xC0 #xC0 #x7E #x18 #x18
570 #x38 #x6C #x64 #xF0 #x60 #xE6 #xFC #x00
571 #xCC #xCC #x78 #x30 #xFC #x30 #xFC #x30
572 #xF8 #xCC #xCC #xFA #xC6 #xCF #xC6 #xC3
573 #x0E #x1B #x18 #x3C #x18 #x18 #xD8 #x70
574 #x1C #x00 #x78 #x0C #x7C #xCC #x76 #x00
575 #x38 #x00 #x70 #x30 #x30 #x30 #x78 #x00
576 #x00 #x1C #x00 #x78 #xCC #xCC #x78 #x00
577 #x00 #x1C #x00 #xCC #xCC #xCC #x76 #x00
578 #x00 #xF8 #x00 #xB8 #xCC #xCC #xCC #x00
579 #xFC #x00 #xCC #xEC #xFC #xDC #xCC #x00
580 #x3C #x6C #x6C #x3E #x00 #x7E #x00 #x00
581 #x38 #x6C #x6C #x38 #x00 #x7C #x00 #x00
582 #x18 #x00 #x18 #x18 #x30 #x66 #x3C #x00
583 #x00 #x00 #x00 #xFC #xC0 #xC0 #x00 #x00
584 #x00 #x00 #x00 #xFC #x0C #x0C #x00 #x00
585 #xC6 #xCC #xD8 #x36 #x6B #xC2 #x84 #x0F
586 #xC3 #xC6 #xCC #xDB #x37 #x6D #xCF #x03
587 #x18 #x00 #x18 #x18 #x3C #x3C #x18 #x00
588 #x00 #x33 #x66 #xCC #x66 #x33 #x00 #x00
589 #x00 #xCC #x66 #x33 #x66 #xCC #x00 #x00
590 #x22 #x88 #x22 #x88 #x22 #x88 #x22 #x88
591 #x55 #xAA #x55 #xAA #x55 #xAA #x55 #xAA
592 #xDB #xF6 #xDB #x6F #xDB #x7E #xD7 #xED
593 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
594 #x18 #x18 #x18 #x18 #xF8 #x18 #x18 #x18
595 #x18 #x18 #xF8 #x18 #xF8 #x18 #x18 #x18
596 #x36 #x36 #x36 #x36 #xF6 #x36 #x36 #x36
597 #x00 #x00 #x00 #x00 #xFE #x36 #x36 #x36
598 #x00 #x00 #xF8 #x18 #xF8 #x18 #x18 #x18
599 #x36 #x36 #xF6 #x06 #xF6 #x36 #x36 #x36
600 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
601 #x00 #x00 #xFE #x06 #xF6 #x36 #x36 #x36
602 #x36 #x36 #xF6 #x06 #xFE #x00 #x00 #x00
603 #x36 #x36 #x36 #x36 #xFE #x00 #x00 #x00
604 #x18 #x18 #xF8 #x18 #xF8 #x00 #x00 #x00
605 #x00 #x00 #x00 #x00 #xF8 #x18 #x18 #x18
606 #x18 #x18 #x18 #x18 #x1F #x00 #x00 #x00
607 #x18 #x18 #x18 #x18 #xFF #x00 #x00 #x00
608 #x00 #x00 #x00 #x00 #xFF #x18 #x18 #x18
609 #x18 #x18 #x18 #x18 #x1F #x18 #x18 #x18
610 #x00 #x00 #x00 #x00 #xFF #x00 #x00 #x00
611 #x18 #x18 #x18 #x18 #xFF #x18 #x18 #x18
612 #x18 #x18 #x1F #x18 #x1F #x18 #x18 #x18
613 #x36 #x36 #x36 #x36 #x37 #x36 #x36 #x36
614 #x36 #x36 #x37 #x30 #x3F #x00 #x00 #x00
615 #x00 #x00 #x3F #x30 #x37 #x36 #x36 #x36
616 #x36 #x36 #xF7 #x00 #xFF #x00 #x00 #x00
617 #x00 #x00 #xFF #x00 #xF7 #x36 #x36 #x36
618 #x36 #x36 #x37 #x30 #x37 #x36 #x36 #x36
619 #x00 #x00 #xFF #x00 #xFF #x00 #x00 #x00
620 #x36 #x36 #xF7 #x00 #xF7 #x36 #x36 #x36
621 #x18 #x18 #xFF #x00 #xFF #x00 #x00 #x00
622 #x36 #x36 #x36 #x36 #xFF #x00 #x00 #x00
623 #x00 #x00 #xFF #x00 #xFF #x18 #x18 #x18
624 #x00 #x00 #x00 #x00 #xFF #x36 #x36 #x36
625 #x36 #x36 #x36 #x36 #x3F #x00 #x00 #x00
626 #x18 #x18 #x1F #x18 #x1F #x00 #x00 #x00
627 #x00 #x00 #x1F #x18 #x1F #x18 #x18 #x18
628 #x00 #x00 #x00 #x00 #x3F #x36 #x36 #x36
629 #x36 #x36 #x36 #x36 #xFF #x36 #x36 #x36
630 #x18 #x18 #xFF #x18 #xFF #x18 #x18 #x18
631 #x18 #x18 #x18 #x18 #xF8 #x00 #x00 #x00
632 #x00 #x00 #x00 #x00 #x1F #x18 #x18 #x18
633 #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF
634 #x00 #x00 #x00 #x00 #xFF #xFF #xFF #xFF
635 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0
636 #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F
637 #xFF #xFF #xFF #xFF #x00 #x00 #x00 #x00
638 #x00 #x00 #x76 #xDC #xC8 #xDC #x76 #x00
639 #x00 #x78 #xCC #xF8 #xCC #xF8 #xC0 #xC0
640 #x00 #xFC #xCC #xC0 #xC0 #xC0 #xC0 #x00
641 #x00 #x00 #xFE #x6C #x6C #x6C #x6C #x00
642 #xFC #xCC #x60 #x30 #x60 #xCC #xFC #x00
643 #x00 #x00 #x7E #xD8 #xD8 #xD8 #x70 #x00
644 #x00 #x66 #x66 #x66 #x66 #x7C #x60 #xC0
645 #x00 #x76 #xDC #x18 #x18 #x18 #x18 #x00
646 #xFC #x30 #x78 #xCC #xCC #x78 #x30 #xFC
647 #x38 #x6C #xC6 #xFE #xC6 #x6C #x38 #x00
648 #x38 #x6C #xC6 #xC6 #x6C #x6C #xEE #x00
649 #x1C #x30 #x18 #x7C #xCC #xCC #x78 #x00
650 #x00 #x00 #x7E #xDB #xDB #x7E #x00 #x00
651 #x06 #x0C #x7E #xDB #xDB #x7E #x60 #xC0
652 #x38 #x60 #xC0 #xF8 #xC0 #x60 #x38 #x00
653 #x78 #xCC #xCC #xCC #xCC #xCC #xCC #x00
654 #x00 #x7E #x00 #x7E #x00 #x7E #x00 #x00
655 #x18 #x18 #x7E #x18 #x18 #x00 #x7E #x00
656 #x60 #x30 #x18 #x30 #x60 #x00 #xFC #x00
657 #x18 #x30 #x60 #x30 #x18 #x00 #xFC #x00
658 #x0E #x1B #x1B #x18 #x18 #x18 #x18 #x18
659 #x18 #x18 #x18 #x18 #x18 #xD8 #xD8 #x70
660 #x18 #x18 #x00 #x7E #x00 #x18 #x18 #x00
661 #x00 #x76 #xDC #x00 #x76 #xDC #x00 #x00
662 #x38 #x6C #x6C #x38 #x00 #x00 #x00 #x00
663 #x00 #x00 #x00 #x18 #x18 #x00 #x00 #x00
664 #x00 #x00 #x00 #x00 #x18 #x00 #x00 #x00
665 #x0F #x0C #x0C #x0C #xEC #x6C #x3C #x1C
666 #x58 #x6C #x6C #x6C #x6C #x00 #x00 #x00
667 #x70 #x98 #x30 #x60 #xF8 #x00 #x00 #x00
668 #x00 #x00 #x3C #x3C #x3C #x3C #x00 #x00
669 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 })
671 (defconstant +vga-font-8x16+
672 #{#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
673 #x00 #x00 #x7E #x81 #xA5 #x81 #x81 #xBD #x99 #x81 #x81 #x7E #x00 #x00 #x00 #x00
674 #x00 #x00 #x7E #xFF #xDB #xFF #xFF #xC3 #xE7 #xFF #xFF #x7E #x00 #x00 #x00 #x00
675 #x00 #x00 #x00 #x00 #x6C #xFE #xFE #xFE #xFE #x7C #x38 #x10 #x00 #x00 #x00 #x00
676 #x00 #x00 #x00 #x00 #x10 #x38 #x7C #xFE #x7C #x38 #x10 #x00 #x00 #x00 #x00 #x00
677 #x00 #x00 #x00 #x18 #x3C #x3C #xE7 #xE7 #xE7 #x99 #x18 #x3C #x00 #x00 #x00 #x00
678 #x00 #x00 #x00 #x18 #x3C #x7E #xFF #xFF #x7E #x18 #x18 #x3C #x00 #x00 #x00 #x00
679 #x00 #x00 #x00 #x00 #x00 #x00 #x18 #x3C #x3C #x18 #x00 #x00 #x00 #x00 #x00 #x00
680 #xFF #xFF #xFF #xFF #xFF #xFF #xE7 #xC3 #xC3 #xE7 #xFF #xFF #xFF #xFF #xFF #xFF
681 #x00 #x00 #x00 #x00 #x00 #x3C #x66 #x42 #x42 #x66 #x3C #x00 #x00 #x00 #x00 #x00
682 #xFF #xFF #xFF #xFF #xFF #xC3 #x99 #xBD #xBD #x99 #xC3 #xFF #xFF #xFF #xFF #xFF
683 #x00 #x00 #x1E #x0E #x1A #x32 #x78 #xCC #xCC #xCC #xCC #x78 #x00 #x00 #x00 #x00
684 #x00 #x00 #x3C #x66 #x66 #x66 #x66 #x3C #x18 #x7E #x18 #x18 #x00 #x00 #x00 #x00
685 #x00 #x00 #x3F #x33 #x3F #x30 #x30 #x30 #x30 #x70 #xF0 #xE0 #x00 #x00 #x00 #x00
686 #x00 #x00 #x7F #x63 #x7F #x63 #x63 #x63 #x63 #x67 #xE7 #xE6 #xC0 #x00 #x00 #x00
687 #x00 #x00 #x00 #x18 #x18 #xDB #x3C #xE7 #x3C #xDB #x18 #x18 #x00 #x00 #x00 #x00
688 #x00 #x80 #xC0 #xE0 #xF0 #xF8 #xFE #xF8 #xF0 #xE0 #xC0 #x80 #x00 #x00 #x00 #x00
689 #x00 #x02 #x06 #x0E #x1E #x3E #xFE #x3E #x1E #x0E #x06 #x02 #x00 #x00 #x00 #x00
690 #x00 #x00 #x18 #x3C #x7E #x18 #x18 #x18 #x18 #x7E #x3C #x18 #x00 #x00 #x00 #x00
691 #x00 #x00 #x66 #x66 #x66 #x66 #x66 #x66 #x66 #x00 #x66 #x66 #x00 #x00 #x00 #x00
692 #x00 #x00 #x7F #xDB #xDB #xDB #x7B #x1B #x1B #x1B #x1B #x1B #x00 #x00 #x00 #x00
693 #x00 #x7C #xC6 #x60 #x38 #x6C #xC6 #xC6 #x6C #x38 #x0C #xC6 #x7C #x00 #x00 #x00
694 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xFE #xFE #xFE #xFE #x00 #x00 #x00 #x00
695 #x00 #x00 #x18 #x3C #x7E #x18 #x18 #x18 #x18 #x7E #x3C #x18 #x7E #x00 #x00 #x00
696 #x00 #x00 #x18 #x3C #x7E #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x00 #x00 #x00 #x00
697 #x00 #x00 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x7E #x3C #x18 #x00 #x00 #x00 #x00
698 #x00 #x00 #x00 #x00 #x00 #x18 #x0C #xFE #x0C #x18 #x00 #x00 #x00 #x00 #x00 #x00
699 #x00 #x00 #x00 #x00 #x00 #x30 #x60 #xFE #x60 #x30 #x00 #x00 #x00 #x00 #x00 #x00
700 #x00 #x00 #x00 #x00 #x00 #xC0 #xC0 #xC0 #xC0 #xFE #x00 #x00 #x00 #x00 #x00 #x00
701 #x00 #x00 #x00 #x00 #x00 #x28 #x6C #xFE #x6C #x28 #x00 #x00 #x00 #x00 #x00 #x00
702 #x00 #x00 #x00 #x00 #x10 #x38 #x38 #x7C #x7C #xFE #xFE #x00 #x00 #x00 #x00 #x00
703 #x00 #x00 #x00 #x00 #xFE #xFE #x7C #x7C #x38 #x38 #x10 #x00 #x00 #x00 #x00 #x00
704 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
705 #x00 #x00 #x18 #x3C #x3C #x3C #x18 #x18 #x18 #x00 #x18 #x18 #x00 #x00 #x00 #x00
706 #x00 #x66 #x66 #x66 #x24 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
707 #x00 #x00 #x00 #x6C #x6C #xFE #x6C #x6C #x6C #xFE #x6C #x6C #x00 #x00 #x00 #x00
708 #x18 #x18 #x7C #xC6 #xC2 #xC0 #x7C #x06 #x86 #xC6 #x7C #x18 #x18 #x00 #x00 #x00
709 #x00 #x00 #x00 #x00 #xC2 #xC6 #x0C #x18 #x30 #x60 #xC6 #x86 #x00 #x00 #x00 #x00
710 #x00 #x00 #x38 #x6C #x6C #x38 #x76 #xDC #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
711 #x00 #x30 #x30 #x30 #x60 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
712 #x00 #x00 #x0C #x18 #x30 #x30 #x30 #x30 #x30 #x30 #x18 #x0C #x00 #x00 #x00 #x00
713 #x00 #x00 #x30 #x18 #x0C #x0C #x0C #x0C #x0C #x0C #x18 #x30 #x00 #x00 #x00 #x00
714 #x00 #x00 #x00 #x00 #x00 #x66 #x3C #xFF #x3C #x66 #x00 #x00 #x00 #x00 #x00 #x00
715 #x00 #x00 #x00 #x00 #x00 #x18 #x18 #x7E #x18 #x18 #x00 #x00 #x00 #x00 #x00 #x00
716 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x18 #x18 #x18 #x30 #x00 #x00 #x00
717 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xFE #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
718 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x18 #x18 #x00 #x00 #x00 #x00
719 #x00 #x00 #x00 #x00 #x02 #x06 #x0C #x18 #x30 #x60 #xC0 #x80 #x00 #x00 #x00 #x00
720 #x00 #x00 #x7C #xC6 #xC6 #xCE #xD6 #xD6 #xE6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
721 #x00 #x00 #x18 #x38 #x78 #x18 #x18 #x18 #x18 #x18 #x18 #x7E #x00 #x00 #x00 #x00
722 #x00 #x00 #x7C #xC6 #x06 #x0C #x18 #x30 #x60 #xC0 #xC6 #xFE #x00 #x00 #x00 #x00
723 #x00 #x00 #x7C #xC6 #x06 #x06 #x3C #x06 #x06 #x06 #xC6 #x7C #x00 #x00 #x00 #x00
724 #x00 #x00 #x0C #x1C #x3C #x6C #xCC #xFE #x0C #x0C #x0C #x1E #x00 #x00 #x00 #x00
725 #x00 #x00 #xFE #xC0 #xC0 #xC0 #xFC #x0E #x06 #x06 #xC6 #x7C #x00 #x00 #x00 #x00
726 #x00 #x00 #x38 #x60 #xC0 #xC0 #xFC #xC6 #xC6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
727 #x00 #x00 #xFE #xC6 #x06 #x06 #x0C #x18 #x30 #x30 #x30 #x30 #x00 #x00 #x00 #x00
728 #x00 #x00 #x7C #xC6 #xC6 #xC6 #x7C #xC6 #xC6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
729 #x00 #x00 #x7C #xC6 #xC6 #xC6 #x7E #x06 #x06 #x06 #x0C #x78 #x00 #x00 #x00 #x00
730 #x00 #x00 #x00 #x00 #x18 #x18 #x00 #x00 #x00 #x18 #x18 #x00 #x00 #x00 #x00 #x00
731 #x00 #x00 #x00 #x00 #x18 #x18 #x00 #x00 #x00 #x18 #x18 #x30 #x00 #x00 #x00 #x00
732 #x00 #x00 #x00 #x06 #x0C #x18 #x30 #x60 #x30 #x18 #x0C #x06 #x00 #x00 #x00 #x00
733 #x00 #x00 #x00 #x00 #x00 #x00 #xFE #x00 #x00 #xFE #x00 #x00 #x00 #x00 #x00 #x00
734 #x00 #x00 #x00 #x60 #x30 #x18 #x0C #x06 #x0C #x18 #x30 #x60 #x00 #x00 #x00 #x00
735 #x00 #x00 #x7C #xC6 #xC6 #x0C #x18 #x18 #x18 #x00 #x18 #x18 #x00 #x00 #x00 #x00
736 #x00 #x00 #x00 #x7C #xC6 #xC6 #xDE #xDE #xDE #xDC #xC0 #x7C #x00 #x00 #x00 #x00
737 #x00 #x00 #x10 #x38 #x6C #xC6 #xC6 #xFE #xC6 #xC6 #xC6 #xC6 #x00 #x00 #x00 #x00
738 #x00 #x00 #xFC #x66 #x66 #x66 #x7C #x66 #x66 #x66 #x66 #xFC #x00 #x00 #x00 #x00
739 #x00 #x00 #x3C #x66 #xC2 #xC0 #xC0 #xC0 #xC0 #xC2 #x66 #x3C #x00 #x00 #x00 #x00
740 #x00 #x00 #xF8 #x6C #x66 #x66 #x66 #x66 #x66 #x66 #x6C #xF8 #x00 #x00 #x00 #x00
741 #x00 #x00 #xFE #x66 #x62 #x68 #x78 #x68 #x60 #x62 #x66 #xFE #x00 #x00 #x00 #x00
742 #x00 #x00 #xFE #x66 #x62 #x68 #x78 #x68 #x60 #x60 #x60 #xF0 #x00 #x00 #x00 #x00
743 #x00 #x00 #x3C #x66 #xC2 #xC0 #xC0 #xDE #xC6 #xC6 #x66 #x3A #x00 #x00 #x00 #x00
744 #x00 #x00 #xC6 #xC6 #xC6 #xC6 #xFE #xC6 #xC6 #xC6 #xC6 #xC6 #x00 #x00 #x00 #x00
745 #x00 #x00 #x3C #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x3C #x00 #x00 #x00 #x00
746 #x00 #x00 #x1E #x0C #x0C #x0C #x0C #x0C #xCC #xCC #xCC #x78 #x00 #x00 #x00 #x00
747 #x00 #x00 #xE6 #x66 #x6C #x6C #x78 #x78 #x6C #x66 #x66 #xE6 #x00 #x00 #x00 #x00
748 #x00 #x00 #xF0 #x60 #x60 #x60 #x60 #x60 #x60 #x62 #x66 #xFE #x00 #x00 #x00 #x00
749 #x00 #x00 #xC6 #xEE #xFE #xFE #xD6 #xC6 #xC6 #xC6 #xC6 #xC6 #x00 #x00 #x00 #x00
750 #x00 #x00 #xC6 #xE6 #xF6 #xFE #xDE #xCE #xC6 #xC6 #xC6 #xC6 #x00 #x00 #x00 #x00
751 #x00 #x00 #x38 #x6C #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #x6C #x38 #x00 #x00 #x00 #x00
752 #x00 #x00 #xFC #x66 #x66 #x66 #x7C #x60 #x60 #x60 #x60 #xF0 #x00 #x00 #x00 #x00
753 #x00 #x00 #x7C #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #xD6 #xDE #x7C #x0C #x0E #x00 #x00
754 #x00 #x00 #xFC #x66 #x66 #x66 #x7C #x6C #x66 #x66 #x66 #xE6 #x00 #x00 #x00 #x00
755 #x00 #x00 #x7C #xC6 #xC6 #x60 #x38 #x0C #x06 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
756 #x00 #x00 #x7E #x7E #x5A #x18 #x18 #x18 #x18 #x18 #x18 #x3C #x00 #x00 #x00 #x00
757 #x00 #x00 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
758 #x00 #x00 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #x6C #x38 #x10 #x00 #x00 #x00 #x00
759 #x00 #x00 #xC6 #xC6 #xC6 #xC6 #xC6 #xD6 #xD6 #xFE #x6C #x6C #x00 #x00 #x00 #x00
760 #x00 #x00 #xC6 #xC6 #x6C #x6C #x38 #x38 #x6C #x6C #xC6 #xC6 #x00 #x00 #x00 #x00
761 #x00 #x00 #x66 #x66 #x66 #x66 #x3C #x18 #x18 #x18 #x18 #x3C #x00 #x00 #x00 #x00
762 #x00 #x00 #xFE #xC6 #x86 #x0C #x18 #x30 #x60 #xC2 #xC6 #xFE #x00 #x00 #x00 #x00
763 #x00 #x00 #x3C #x30 #x30 #x30 #x30 #x30 #x30 #x30 #x30 #x3C #x00 #x00 #x00 #x00
764 #x00 #x00 #x00 #x80 #xC0 #xE0 #x70 #x38 #x1C #x0E #x06 #x02 #x00 #x00 #x00 #x00
765 #x00 #x00 #x3C #x0C #x0C #x0C #x0C #x0C #x0C #x0C #x0C #x3C #x00 #x00 #x00 #x00
766 #x10 #x38 #x6C #xC6 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
767 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xFF #x00 #x00
768 #x30 #x30 #x18 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
769 #x00 #x00 #x00 #x00 #x00 #x78 #x0C #x7C #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
770 #x00 #x00 #xE0 #x60 #x60 #x78 #x6C #x66 #x66 #x66 #x66 #xDC #x00 #x00 #x00 #x00
771 #x00 #x00 #x00 #x00 #x00 #x7C #xC6 #xC0 #xC0 #xC0 #xC6 #x7C #x00 #x00 #x00 #x00
772 #x00 #x00 #x1C #x0C #x0C #x3C #x6C #xCC #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
773 #x00 #x00 #x00 #x00 #x00 #x7C #xC6 #xFE #xC0 #xC0 #xC6 #x7C #x00 #x00 #x00 #x00
774 #x00 #x00 #x38 #x6C #x64 #x60 #xF0 #x60 #x60 #x60 #x60 #xF0 #x00 #x00 #x00 #x00
775 #x00 #x00 #x00 #x00 #x00 #x76 #xCC #xCC #xCC #xCC #xCC #x7C #x0C #xCC #x78 #x00
776 #x00 #x00 #xE0 #x60 #x60 #x6C #x76 #x66 #x66 #x66 #x66 #xE6 #x00 #x00 #x00 #x00
777 #x00 #x00 #x18 #x18 #x00 #x38 #x18 #x18 #x18 #x18 #x18 #x3C #x00 #x00 #x00 #x00
778 #x00 #x00 #x06 #x06 #x00 #x0E #x06 #x06 #x06 #x06 #x06 #x06 #x66 #x66 #x3C #x00
779 #x00 #x00 #xE0 #x60 #x60 #x66 #x6C #x78 #x78 #x6C #x66 #xE6 #x00 #x00 #x00 #x00
780 #x00 #x00 #x38 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x3C #x00 #x00 #x00 #x00
781 #x00 #x00 #x00 #x00 #x00 #xEC #xFE #xD6 #xD6 #xD6 #xD6 #xD6 #x00 #x00 #x00 #x00
782 #x00 #x00 #x00 #x00 #x00 #xDC #x66 #x66 #x66 #x66 #x66 #x66 #x00 #x00 #x00 #x00
783 #x00 #x00 #x00 #x00 #x00 #x7C #xC6 #xC6 #xC6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
784 #x00 #x00 #x00 #x00 #x00 #xDC #x66 #x66 #x66 #x66 #x66 #x7C #x60 #x60 #xF0 #x00
785 #x00 #x00 #x00 #x00 #x00 #x76 #xCC #xCC #xCC #xCC #xCC #x7C #x0C #x0C #x1E #x00
786 #x00 #x00 #x00 #x00 #x00 #xDC #x76 #x62 #x60 #x60 #x60 #xF0 #x00 #x00 #x00 #x00
787 #x00 #x00 #x00 #x00 #x00 #x7C #xC6 #x60 #x38 #x0C #xC6 #x7C #x00 #x00 #x00 #x00
788 #x00 #x00 #x10 #x30 #x30 #xFC #x30 #x30 #x30 #x30 #x36 #x1C #x00 #x00 #x00 #x00
789 #x00 #x00 #x00 #x00 #x00 #xCC #xCC #xCC #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
790 #x00 #x00 #x00 #x00 #x00 #x66 #x66 #x66 #x66 #x66 #x3C #x18 #x00 #x00 #x00 #x00
791 #x00 #x00 #x00 #x00 #x00 #xC6 #xC6 #xC6 #xD6 #xD6 #xFE #x6C #x00 #x00 #x00 #x00
792 #x00 #x00 #x00 #x00 #x00 #xC6 #x6C #x38 #x38 #x38 #x6C #xC6 #x00 #x00 #x00 #x00
793 #x00 #x00 #x00 #x00 #x00 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #x7E #x06 #x0C #xF8 #x00
794 #x00 #x00 #x00 #x00 #x00 #xFE #xCC #x18 #x30 #x60 #xC6 #xFE #x00 #x00 #x00 #x00
795 #x00 #x00 #x0E #x18 #x18 #x18 #x70 #x18 #x18 #x18 #x18 #x0E #x00 #x00 #x00 #x00
796 #x00 #x00 #x18 #x18 #x18 #x18 #x00 #x18 #x18 #x18 #x18 #x18 #x00 #x00 #x00 #x00
797 #x00 #x00 #x70 #x18 #x18 #x18 #x0E #x18 #x18 #x18 #x18 #x70 #x00 #x00 #x00 #x00
798 #x00 #x00 #x76 #xDC #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
799 #x00 #x00 #x00 #x00 #x10 #x38 #x6C #xC6 #xC6 #xC6 #xFE #x00 #x00 #x00 #x00 #x00
800 #x00 #x00 #x3C #x66 #xC2 #xC0 #xC0 #xC0 #xC2 #x66 #x3C #x0C #x06 #x7C #x00 #x00
801 #x00 #x00 #xCC #xCC #x00 #xCC #xCC #xCC #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
802 #x00 #x0C #x18 #x30 #x00 #x7C #xC6 #xFE #xC0 #xC0 #xC6 #x7C #x00 #x00 #x00 #x00
803 #x00 #x10 #x38 #x6C #x00 #x78 #x0C #x7C #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
804 #x00 #x00 #xCC #xCC #x00 #x78 #x0C #x7C #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
805 #x00 #x60 #x30 #x18 #x00 #x78 #x0C #x7C #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
806 #x00 #x38 #x6C #x38 #x00 #x78 #x0C #x7C #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
807 #x00 #x00 #x00 #x00 #x3C #x66 #x60 #x60 #x66 #x3C #x0C #x06 #x3C #x00 #x00 #x00
808 #x00 #x10 #x38 #x6C #x00 #x7C #xC6 #xFE #xC0 #xC0 #xC6 #x7C #x00 #x00 #x00 #x00
809 #x00 #x00 #xC6 #xC6 #x00 #x7C #xC6 #xFE #xC0 #xC0 #xC6 #x7C #x00 #x00 #x00 #x00
810 #x00 #x60 #x30 #x18 #x00 #x7C #xC6 #xFE #xC0 #xC0 #xC6 #x7C #x00 #x00 #x00 #x00
811 #x00 #x00 #x66 #x66 #x00 #x38 #x18 #x18 #x18 #x18 #x18 #x3C #x00 #x00 #x00 #x00
812 #x00 #x18 #x3C #x66 #x00 #x38 #x18 #x18 #x18 #x18 #x18 #x3C #x00 #x00 #x00 #x00
813 #x00 #x60 #x30 #x18 #x00 #x38 #x18 #x18 #x18 #x18 #x18 #x3C #x00 #x00 #x00 #x00
814 #x00 #xC6 #xC6 #x10 #x38 #x6C #xC6 #xC6 #xFE #xC6 #xC6 #xC6 #x00 #x00 #x00 #x00
815 #x38 #x6C #x38 #x00 #x38 #x6C #xC6 #xC6 #xFE #xC6 #xC6 #xC6 #x00 #x00 #x00 #x00
816 #x18 #x30 #x60 #x00 #xFE #x66 #x60 #x7C #x60 #x60 #x66 #xFE #x00 #x00 #x00 #x00
817 #x00 #x00 #x00 #x00 #x00 #xCC #x76 #x36 #x7E #xD8 #xD8 #x6E #x00 #x00 #x00 #x00
818 #x00 #x00 #x3E #x6C #xCC #xCC #xFE #xCC #xCC #xCC #xCC #xCE #x00 #x00 #x00 #x00
819 #x00 #x10 #x38 #x6C #x00 #x7C #xC6 #xC6 #xC6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
820 #x00 #x00 #xC6 #xC6 #x00 #x7C #xC6 #xC6 #xC6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
821 #x00 #x60 #x30 #x18 #x00 #x7C #xC6 #xC6 #xC6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
822 #x00 #x30 #x78 #xCC #x00 #xCC #xCC #xCC #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
823 #x00 #x60 #x30 #x18 #x00 #xCC #xCC #xCC #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
824 #x00 #x00 #xC6 #xC6 #x00 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #x7E #x06 #x0C #x78 #x00
825 #x00 #xC6 #xC6 #x00 #x38 #x6C #xC6 #xC6 #xC6 #xC6 #x6C #x38 #x00 #x00 #x00 #x00
826 #x00 #xC6 #xC6 #x00 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
827 #x00 #x18 #x18 #x3C #x66 #x60 #x60 #x60 #x66 #x3C #x18 #x18 #x00 #x00 #x00 #x00
828 #x00 #x38 #x6C #x64 #x60 #xF0 #x60 #x60 #x60 #x60 #xE6 #xFC #x00 #x00 #x00 #x00
829 #x00 #x00 #x66 #x66 #x3C #x18 #x7E #x18 #x7E #x18 #x18 #x18 #x00 #x00 #x00 #x00
830 #x00 #xF8 #xCC #xCC #xF8 #xC4 #xCC #xDE #xCC #xCC #xCC #xC6 #x00 #x00 #x00 #x00
831 #x00 #x0E #x1B #x18 #x18 #x18 #x7E #x18 #x18 #x18 #x18 #x18 #xD8 #x70 #x00 #x00
832 #x00 #x18 #x30 #x60 #x00 #x78 #x0C #x7C #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
833 #x00 #x0C #x18 #x30 #x00 #x38 #x18 #x18 #x18 #x18 #x18 #x3C #x00 #x00 #x00 #x00
834 #x00 #x18 #x30 #x60 #x00 #x7C #xC6 #xC6 #xC6 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
835 #x00 #x18 #x30 #x60 #x00 #xCC #xCC #xCC #xCC #xCC #xCC #x76 #x00 #x00 #x00 #x00
836 #x00 #x00 #x76 #xDC #x00 #xDC #x66 #x66 #x66 #x66 #x66 #x66 #x00 #x00 #x00 #x00
837 #x76 #xDC #x00 #xC6 #xE6 #xF6 #xFE #xDE #xCE #xC6 #xC6 #xC6 #x00 #x00 #x00 #x00
838 #x00 #x3C #x6C #x6C #x3E #x00 #x7E #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
839 #x00 #x38 #x6C #x6C #x38 #x00 #x7C #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
840 #x00 #x00 #x30 #x30 #x00 #x30 #x30 #x60 #xC0 #xC6 #xC6 #x7C #x00 #x00 #x00 #x00
841 #x00 #x00 #x00 #x00 #x00 #x00 #xFE #xC0 #xC0 #xC0 #xC0 #x00 #x00 #x00 #x00 #x00
842 #x00 #x00 #x00 #x00 #x00 #x00 #xFE #x06 #x06 #x06 #x06 #x00 #x00 #x00 #x00 #x00
843 #x00 #xC0 #xC0 #xC2 #xC6 #xCC #x18 #x30 #x60 #xCE #x93 #x06 #x0C #x1F #x00 #x00
844 #x00 #xC0 #xC0 #xC2 #xC6 #xCC #x18 #x30 #x66 #xCE #x9A #x3F #x06 #x0F #x00 #x00
845 #x00 #x00 #x18 #x18 #x00 #x18 #x18 #x18 #x3C #x3C #x3C #x18 #x00 #x00 #x00 #x00
846 #x00 #x00 #x00 #x00 #x00 #x33 #x66 #xCC #x66 #x33 #x00 #x00 #x00 #x00 #x00 #x00
847 #x00 #x00 #x00 #x00 #x00 #xCC #x66 #x33 #x66 #xCC #x00 #x00 #x00 #x00 #x00 #x00
848 #x11 #x44 #x11 #x44 #x11 #x44 #x11 #x44 #x11 #x44 #x11 #x44 #x11 #x44 #x11 #x44
849 #x55 #xAA #x55 #xAA #x55 #xAA #x55 #xAA #x55 #xAA #x55 #xAA #x55 #xAA #x55 #xAA
850 #xDD #x77 #xDD #x77 #xDD #x77 #xDD #x77 #xDD #x77 #xDD #x77 #xDD #x77 #xDD #x77
851 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
852 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #xF8 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
853 #x18 #x18 #x18 #x18 #x18 #xF8 #x18 #xF8 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
854 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #xF6 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
855 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xFE #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
856 #x00 #x00 #x00 #x00 #x00 #xF8 #x18 #xF8 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
857 #x36 #x36 #x36 #x36 #x36 #xF6 #x06 #xF6 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
858 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
859 #x00 #x00 #x00 #x00 #x00 #xFE #x06 #xF6 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
860 #x36 #x36 #x36 #x36 #x36 #xF6 #x06 #xFE #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
861 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #xFE #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
862 #x18 #x18 #x18 #x18 #x18 #xF8 #x18 #xF8 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
863 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xF8 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
864 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x1F #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
865 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #xFF #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
866 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xFF #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
867 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x1F #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
868 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xFF #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
869 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #xFF #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
870 #x18 #x18 #x18 #x18 #x18 #x1F #x18 #x1F #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
871 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x37 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
872 #x36 #x36 #x36 #x36 #x36 #x37 #x30 #x3F #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
873 #x00 #x00 #x00 #x00 #x00 #x3F #x30 #x37 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
874 #x36 #x36 #x36 #x36 #x36 #xF7 #x00 #xFF #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
875 #x00 #x00 #x00 #x00 #x00 #xFF #x00 #xF7 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
876 #x36 #x36 #x36 #x36 #x36 #x37 #x30 #x37 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
877 #x00 #x00 #x00 #x00 #x00 #xFF #x00 #xFF #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
878 #x36 #x36 #x36 #x36 #x36 #xF7 #x00 #xF7 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
879 #x18 #x18 #x18 #x18 #x18 #xFF #x00 #xFF #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
880 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #xFF #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
881 #x00 #x00 #x00 #x00 #x00 #xFF #x00 #xFF #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
882 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xFF #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
883 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x3F #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
884 #x18 #x18 #x18 #x18 #x18 #x1F #x18 #x1F #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
885 #x00 #x00 #x00 #x00 #x00 #x1F #x18 #x1F #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
886 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x3F #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
887 #x36 #x36 #x36 #x36 #x36 #x36 #x36 #xFF #x36 #x36 #x36 #x36 #x36 #x36 #x36 #x36
888 #x18 #x18 #x18 #x18 #x18 #xFF #x18 #xFF #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
889 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #xF8 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
890 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x1F #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
891 #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF
892 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF #xFF
893 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0 #xF0
894 #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F #x0F
895 #xFF #xFF #xFF #xFF #xFF #xFF #xFF #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
896 #x00 #x00 #x00 #x00 #x00 #x76 #xDC #xD8 #xD8 #xD8 #xDC #x76 #x00 #x00 #x00 #x00
897 #x00 #x00 #x00 #x00 #x00 #xFC #xC6 #xFC #xC6 #xC6 #xFC #xC0 #xC0 #xC0 #x00 #x00
898 #x00 #x00 #xFE #xC6 #xC6 #xC0 #xC0 #xC0 #xC0 #xC0 #xC0 #xC0 #x00 #x00 #x00 #x00
899 #x00 #x00 #x00 #x00 #x80 #xFE #x6C #x6C #x6C #x6C #x6C #x6C #x00 #x00 #x00 #x00
900 #x00 #x00 #x00 #xFE #xC6 #x60 #x30 #x18 #x30 #x60 #xC6 #xFE #x00 #x00 #x00 #x00
901 #x00 #x00 #x00 #x00 #x00 #x7E #xD8 #xD8 #xD8 #xD8 #xD8 #x70 #x00 #x00 #x00 #x00
902 #x00 #x00 #x00 #x00 #x66 #x66 #x66 #x66 #x66 #x7C #x60 #x60 #xC0 #x00 #x00 #x00
903 #x00 #x00 #x00 #x00 #x76 #xDC #x18 #x18 #x18 #x18 #x18 #x18 #x00 #x00 #x00 #x00
904 #x00 #x00 #x00 #x7E #x18 #x3C #x66 #x66 #x66 #x3C #x18 #x7E #x00 #x00 #x00 #x00
905 #x00 #x00 #x00 #x38 #x6C #xC6 #xC6 #xFE #xC6 #xC6 #x6C #x38 #x00 #x00 #x00 #x00
906 #x00 #x00 #x38 #x6C #xC6 #xC6 #xC6 #x6C #x6C #x6C #x6C #xEE #x00 #x00 #x00 #x00
907 #x00 #x00 #x1E #x30 #x18 #x0C #x3E #x66 #x66 #x66 #x66 #x3C #x00 #x00 #x00 #x00
908 #x00 #x00 #x00 #x00 #x00 #x7E #xDB #xDB #xDB #x7E #x00 #x00 #x00 #x00 #x00 #x00
909 #x00 #x00 #x00 #x03 #x06 #x7E #xCF #xDB #xF3 #x7E #x60 #xC0 #x00 #x00 #x00 #x00
910 #x00 #x00 #x1C #x30 #x60 #x60 #x7C #x60 #x60 #x60 #x30 #x1C #x00 #x00 #x00 #x00
911 #x00 #x00 #x00 #x7C #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #xC6 #x00 #x00 #x00 #x00
912 #x00 #x00 #x00 #x00 #xFE #x00 #x00 #xFE #x00 #x00 #xFE #x00 #x00 #x00 #x00 #x00
913 #x00 #x00 #x00 #x00 #x18 #x18 #x7E #x18 #x18 #x00 #x00 #xFF #x00 #x00 #x00 #x00
914 #x00 #x00 #x00 #x30 #x18 #x0C #x06 #x0C #x18 #x30 #x00 #x7E #x00 #x00 #x00 #x00
915 #x00 #x00 #x00 #x0C #x18 #x30 #x60 #x30 #x18 #x0C #x00 #x7E #x00 #x00 #x00 #x00
916 #x00 #x00 #x0E #x1B #x1B #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18
917 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #x18 #xD8 #xD8 #xD8 #x70 #x00 #x00 #x00 #x00
918 #x00 #x00 #x00 #x00 #x18 #x18 #x00 #x7E #x00 #x18 #x18 #x00 #x00 #x00 #x00 #x00
919 #x00 #x00 #x00 #x00 #x00 #x76 #xDC #x00 #x76 #xDC #x00 #x00 #x00 #x00 #x00 #x00
920 #x00 #x38 #x6C #x6C #x38 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
921 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x18 #x18 #x00 #x00 #x00 #x00 #x00 #x00 #x00
922 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x18 #x00 #x00 #x00 #x00 #x00 #x00 #x00
923 #x00 #x0F #x0C #x0C #x0C #x0C #x0C #xEC #x6C #x6C #x3C #x1C #x00 #x00 #x00 #x00
924 #x00 #xD8 #x6C #x6C #x6C #x6C #x6C #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
925 #x00 #x70 #x98 #x30 #x60 #xC8 #xF8 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
926 #x00 #x00 #x00 #x00 #x7C #x7C #x7C #x7C #x7C #x7C #x7C #x00 #x00 #x00 #x00 #x00
927 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 })
930 ;; run-length compressed: color count color count ...
931 (defvar *vga-g-splash*
932 #{7 255 7 255 7 255 7 255 7 255 7 255 7 255 7 35 0 3 7 255 7 58 0 4 7 255 7 58 0
933 1 4 1 0 0 7 255 7 57 0 1 4 2 0 0 7 255 7 57 0 1 4 2 0 0 1 6 7 255 7 50 0 1 4 2
934 0 0 1 16 7 255 7 40 0 0 4 2 0 0 1 21 7 255 7 35 0 1 4 2 0 0 1 2 7 1 1 8 7 1 1
935 9 7 255 7 31 0 1 4 2 0 0 1 2 7 1 1 8 7 1 1 11 7 255 7 29 0 1 4 1 0 1 1 1 7 2 1
936 8 7 1 1 2 7 4 1 5 7 255 7 26 0 1 4 2 0 0 1 2 7 1 1 8 7 2 1 1 7 7 1 5 7 255 7
937 24 0 1 4 2 0 0 1 2 7 1 1 8 7 2 1 1 7 2 1 0 7 4 1 5 7 255 7 23 0 1 4 1 0 1 1 2
938 7 1 1 8 7 1 1 1 7 2 1 3 7 3 1 5 7 255 7 22 0 0 4 2 0 0 1 2 7 2 1 8 7 1 1 1 7 2
939 1 5 7 2 1 5 7 255 7 20 0 1 4 2 0 0 1 2 7 1 1 9 7 1 1 2 7 1 1 6 7 1 1 6 7 255 7
940 19 0 1 4 2 0 0 1 2 7 1 1 8 7 2 1 2 7 2 1 15 7 255 7 18 0 1 4 1 0 1 1 1 7 2 1 8
941 7 2 1 3 7 3 1 7 7 2 1 2 7 255 7 17 0 1 4 2 0 0 1 2 7 1 1 9 7 1 1 5 7 4 1 4 7 4
942 1 2 7 255 7 16 0 1 4 2 0 0 1 2 7 1 1 9 7 1 1 6 7 4 1 3 7 5 1 2 7 255 7 15 0 1
943 4 1 0 1 1 2 7 1 1 9 7 1 1 8 7 3 1 2 7 1 1 0 7 3 1 2 7 255 7 14 0 0 4 2 0 0 1 2
944 7 2 1 9 7 1 1 10 7 2 1 1 7 1 1 1 7 2 1 3 7 255 7 12 0 1 4 2 0 0 1 2 7 1 1 9 7
945 2 1 1 7 1 1 6 7 2 1 0 7 2 1 2 7 2 1 2 7 255 7 12 0 1 4 2 0 0 1 2 7 1 1 4 7 1 1
946 2 7 2 1 1 7 2 1 5 7 2 1 0 7 2 1 3 7 1 1 4 7 255 7 10 0 1 4 1 0 1 1 2 7 9 1 1 7
947 1 1 3 7 3 1 3 7 2 1 0 7 2 1 3 7 2 1 4 7 255 7 8 0 1 4 2 0 0 1 2 7 9 1 9 7 4 1
948 0 7 2 1 1 7 3 1 2 7 2 1 5 7 255 7 7 0 1 4 2 0 0 1 23 7 7 1 1 7 8 1 8 7 255 7 5
949 0 1 4 1 0 1 1 25 7 4 1 1 7 2 1 0 7 5 1 9 7 255 7 4 0 0 4 2 0 1 1 13 7 7 1 10 7
950 2 1 2 7 2 1 12 7 255 7 1 0 1 4 2 0 1 7 1 1 4 7 16 1 8 7 2 1 20 7 255 0 1 4 2 0
951 0 7 25 1 7 7 1 1 23 7 253 0 1 4 1 0 1 7 27 1 5 7 1 1 25 7 251 0 0 4 2 0 1 7 28
952 1 4 7 1 1 23 7 157 0 7 7 86 0 1 4 2 0 1 7 30 1 25 7 159 0 1 7 6 0 0 7 85 0 1 4
953 1 0 1 7 33 1 20 7 157 0 6 7 2 0 2 7 0 0 6 7 79 0 0 4 2 0 1 7 35 1 14 7 159 0 2
954 7 3 0 1 7 1 0 8 7 2 0 3 7 71 2 4 4 2 0 1 7 39 1 4 7 164 0 1 7 7 0 0 7 1 0 4 7
955 8 0 1 7 68 2 6 4 2 0 0 7 210 0 0 7 3 0 1 7 3 0 0 7 1 0 1 7 7 0 3 7 0 0 0 7 65
956 2 8 4 1 0 1 7 209 0 1 7 1 0 11 7 7 0 4 7 0 0 0 7 64 2 10 4 0 0 0 2 0 7 209 0 0
957 7 2 0 4 7 4 0 2 7 7 0 3 7 1 0 0 7 62 2 14 7 208 0 1 7 2 0 3 7 7 0 1 7 0 0 9 7
958 1 0 0 7 61 2 17 7 206 0 0 7 4 0 1 7 3 0 2 7 2 0 1 7 5 0 1 7 3 0 0 7 61 2 17 7
959 206 0 1 7 4 0 0 7 3 0 3 7 0 0 1 7 3 0 2 7 0 0 0 7 3 0 0 7 60 2 19 7 198 2 7 0
960 1 7 3 0 0 7 3 0 3 7 0 0 0 7 4 0 5 7 0 0 2 7 60 2 9 0 0 2 8 7 193 2 13 0 5 7 3
961 0 3 7 0 0 0 7 5 0 1 7 1 0 2 2 0 7 61 2 8 0 1 4 1 2 7 7 187 2 23 0 0 7 3 0 2 7
962 1 0 1 7 7 0 1 2 5 7 57 2 9 0 0 4 2 0 0 2 5 7 184 2 27 0 0 7 9 0 0 7 6 0 1 2 8
963 7 55 2 9 0 0 4 2 0 0 2 5 7 181 2 30 0 1 7 8 0 7 2 11 7 53 2 21 7 178 2 34 0 1
964 7 5 0 1 2 21 7 49 2 22 7 176 2 39 0 6 2 23 7 46 2 23 7 174 2 74 7 43 2 25 7
965 171 2 78 7 40 2 16 0 0 2 10 7 168 2 81 7 37 2 18 0 0 4 2 2 7 7 166 2 83 7 35 2
966 20 0 0 4 2 0 0 2 6 7 164 2 86 7 33 2 20 0 1 4 1 0 1 2 6 7 162 2 88 7 31 2 22 0
967 0 4 2 0 0 2 6 7 161 2 91 7 28 2 24 0 0 4 2 0 0 2 3 7 162 2 94 7 26 2 15 7 9 0
968 0 4 2 0 0 7 165 2 95 7 24 2 15 7 10 0 1 4 1 0 0 7 164 2 98 7 22 2 14 7 12 0 0
969 4 2 0 0 7 163 2 100 7 19 2 14 7 14 0 0 4 2 0 0 7 161 2 61 0 1 2 39 7 17 2 14 7
970 15 0 3 7 161 2 61 0 5 2 38 7 13 2 14 7 182 2 62 0 0 7 0 0 0 7 1 0 3 2 38 7 7 2
971 16 7 182 2 63 0 0 7 0 0 0 7 1 0 0 7 1 0 2 2 60 7 181 2 64 0 3 7 1 0 0 7 1 0 0
972 7 0 0 2 2 57 7 182 2 64 0 0 7 0 0 4 7 0 0 1 7 0 0 0 7 0 0 4 2 51 7 183 2 65 0
973 0 7 0 0 0 7 0 0 2 7 0 0 0 7 1 0 0 7 1 0 0 7 1 0 2 2 48 7 183 2 67 0 1 7 1 0 4
974 7 0 0 0 7 1 0 0 7 1 0 3 2 46 7 183 2 69 0 1 7 0 0 0 7 1 0 4 7 0 0 0 7 1 0 0 7
975 1 0 1 2 44 7 183 2 71 0 2 7 1 0 0 7 1 0 6 7 1 0 0 2 43 7 185 2 72 0 4 7 0 0 1
976 7 0 0 1 7 0 0 4 2 42 7 185 2 76 0 3 7 1 0 0 7 1 0 0 7 1 0 0 2 15 7 1 2 23 7
977 187 2 78 0 4 7 1 0 0 7 0 0 0 2 16 7 6 2 16 7 189 2 82 0 4 2 17 7 15 2 2 7 193
978 2 106 7 212 2 105 7 213 2 105 7 212 2 106 7 212 2 105 7 213 2 105 7 213 2 105
979 7 212 2 105 7 213 2 105 7 213 2 104 7 214 2 103 7 215 2 103 7 214 2 103 7 215
980 2 103 7 215 2 104 7 214 2 104 7 214 2 82 7 10 2 10 7 213 2 81 7 13 2 9 7 213 2
981 36 7 33 2 10 7 13 2 9 7 213 2 26 7 44 2 9 7 13 2 9 7 213 2 13 7 4 2 7 7 44 2 8
982 7 14 2 9 7 213 2 8 7 9 2 7 7 44 2 8 7 14 2 9 7 212 2 8 7 10 2 7 7 44 2 8 7 15
983 2 8 7 212 2 7 7 11 2 7 7 44 2 8 7 15 2 8 7 212 2 7 7 11 2 6 7 45 2 8 7 15 2 8
984 7 212 2 7 7 11 2 6 7 45 2 7 7 16 2 8 7 212 2 6 7 11 2 7 7 45 2 7 7 16 2 8 7
985 211 2 7 7 11 2 7 7 45 2 7 7 16 2 8 7 211 2 7 7 11 2 7 7 45 2 7 7 17 2 8 7 210
986 2 7 7 11 2 7 7 45 2 7 7 17 2 8 7 210 2 6 7 12 2 7 7 45 2 7 7 17 2 8 7 210 2 6
987 7 12 2 6 7 46 2 6 7 18 2 8 7 210 2 6 7 12 2 6 7 46 2 6 7 18 2 8 7 209 2 7 7 12
988 2 6 7 45 2 7 7 18 2 8 7 209 2 6 7 12 2 7 7 45 2 7 7 18 2 8 7 209 2 6 7 12 2 7
989 7 45 2 7 7 19 2 7 7 209 2 6 7 12 2 7 7 45 2 7 7 19 2 7 7 209 2 6 7 12 2 6 7 46
990 2 7 7 19 2 7 7 208 2 7 7 12 2 6 7 46 2 6 7 20 2 7 7 208 2 6 7 13 2 6 7 46 2 6
991 7 20 2 7 7 208 2 6 7 13 2 6 7 46 2 6 7 20 2 7 7 208 2 6 7 13 2 6 7 46 2 6 7 20
992 2 7 7 208 2 6 7 12 2 7 7 46 2 6 7 21 2 7 7 207 2 6 7 12 2 7 7 45 2 7 7 21 2 7
993 7 206 2 6 7 13 2 6 7 46 2 7 7 21 2 7 7 206 2 6 7 13 2 6 7 46 2 6 7 22 2 7 7
994 206 2 6 7 13 2 6 7 46 2 6 7 22 2 7 7 206 2 6 7 13 2 6 7 46 2 6 7 22 2 7 7 206
995 2 6 7 13 2 6 7 46 2 6 7 22 2 7 7 205 2 6 7 14 2 6 7 46 2 6 7 23 2 6 7 205 2 6
996 7 13 2 6 7 47 2 6 7 23 2 6 7 205 2 6 7 13 2 6 7 47 2 6 7 23 2 6 7 205 2 6 7 13
997 2 6 7 47 2 6 7 23 2 6 7 205 2 6 7 13 2 6 7 46 2 7 7 23 2 6 7 205 2 6 7 13 2 6
998 7 46 2 6 7 24 2 6 7 204 2 6 7 14 2 6 7 46 2 6 7 24 2 6 7 201 2 10 7 13 2 6 7
999 46 2 6 7 24 2 6 7 200 2 12 7 9 2 10 7 45 2 6 7 24 2 6 7 200 2 13 7 7 2 12 7 44
1000 2 6 7 24 2 7 7 198 2 15 7 5 2 14 7 43 2 6 7 21 2 11 7 197 2 15 7 5 2 14 7 41 2
1001 9 7 19 2 14 7 195 2 15 7 5 2 14 7 40 2 12 7 17 2 14 7 196 2 14 7 5 2 14 7 39 2
1002 14 7 15 2 16 7 195 2 13 7 6 2 14 7 39 2 14 7 15 2 16 7 197 2 3 7 1 2 4 7 8 2
1003 12 7 40 2 14 7 15 2 16 7 218 2 3 7 2 2 3 7 41 2 14 7 16 2 6 7 1 2 5 7 255 7 16
1004 2 14 7 17 2 4 7 3 2 2 7 255 7 19 2 12 7 255 7 51 2 3 7 1 2 4 7 255 7 255 7 255
1005 7 255 7 255 7 255 7 255 7 255 7 255 7 255 7 255 7 255 7 255 7 208 0 2 7 255 7
1006 50 0 1 7 6 0 3 7 72 0 1 7 230 0 2 7 5 0 4 7 72 0 1 7 1 0 4 7 222 0 3 7 4 0 4 7
1007 72 0 10 7 220 0 3 7 5 0 4 7 71 0 12 7 82 0 1 7 133 0 4 7 4 0 4 7 70 0 6 7 5 0
1008 2 7 80 0 2 7 132 0 4 7 4 0 5 7 69 0 5 7 8 0 1 7 79 0 2 7 132 0 5 7 3 0 2 7 0 0
1009 1 7 70 0 5 7 8 0 1 7 79 0 2 7 132 0 1 7 0 0 1 7 4 0 1 7 0 0 2 7 30 0 1 7 5 0 1
1010 7 29 0 1 7 0 0 1 7 9 0 1 7 78 0 2 7 132 0 1 7 0 0 1 7 4 0 1 7 1 0 1 7 30 0 2 7
1011 4 0 2 7 31 0 2 7 9 0 1 7 78 0 1 7 132 0 1 7 1 0 1 7 3 0 2 7 0 0 1 7 30 0 3 7 4
1012 0 1 7 32 0 1 7 9 0 1 7 78 0 2 7 131 0 2 7 0 0 1 7 4 0 1 7 0 0 2 7 30 0 2 7 4 0
1013 1 7 32 0 2 7 8 0 2 7 77 0 2 7 132 0 1 7 1 0 1 7 3 0 1 7 1 0 1 7 31 0 1 7 4 0 2
1014 7 32 0 2 7 8 0 2 7 77 0 2 7 131 0 1 7 1 0 2 7 2 0 1 7 1 0 2 7 38 0 6 7 27 0 2
1015 7 8 0 2 7 77 0 2 7 131 0 2 7 1 0 1 7 2 0 2 7 1 0 1 7 38 0 7 7 27 0 2 7 6 0 3 7
1016 78 0 2 7 130 0 2 7 1 0 2 7 2 0 1 7 1 0 2 7 36 0 5 7 30 0 2 7 6 0 3 7 78 0 2 7
1017 131 0 1 7 2 0 1 7 2 0 1 7 2 0 1 7 8 0 2 7 23 0 4 7 33 0 2 7 4 0 4 7 5 0 2 7 17
1018 0 1 7 50 0 2 7 130 0 2 7 2 0 1 7 1 0 2 7 2 0 1 7 7 0 4 7 4 0 1 7 2 0 1 7 5 0 1
1019 7 2 0 4 7 4 0 9 7 15 0 5 7 1 0 6 7 5 0 4 7 15 0 2 7 5 0 3 7 7 0 1 7 3 0 2 7 6
1020 0 3 7 7 0 6 7 131 0 1 7 2 0 2 7 1 0 1 7 2 0 2 7 6 0 5 7 4 0 1 7 1 0 2 7 5 0 1
1021 7 4 0 1 7 5 0 9 7 16 0 11 7 6 0 5 7 5 0 1 7 7 0 2 7 4 0 4 7 6 0 2 7 1 0 4 7 5
1022 0 4 7 6 0 6 7 131 0 1 7 3 0 1 7 1 0 1 7 3 0 1 7 6 0 2 7 1 0 1 7 3 0 2 7 1 0 2
1023 7 4 0 1 7 4 0 1 7 11 0 3 7 17 0 9 7 7 0 2 7 1 0 1 7 4 0 2 7 2 0 1 7 2 0 1 7 3
1024 0 2 7 1 0 1 7 6 0 1 7 1 0 3 7 5 0 2 7 1 0 1 7 5 0 1 7 2 0 2 7 130 0 2 7 3 0 1
1025 7 1 0 1 7 2 0 2 7 5 0 2 7 2 0 1 7 3 0 1 7 1 0 2 7 4 0 2 7 3 0 2 7 10 0 3 7 18
1026 0 6 7 9 0 2 7 2 0 1 7 3 0 2 7 2 0 2 7 1 0 2 7 2 0 2 7 2 0 0 7 6 0 1 7 0 0 3 7
1027 4 0 0 7 0 0 2 7 2 0 0 7 5 0 1 7 3 0 1 7 131 0 1 7 3 0 2 7 0 0 1 7 3 0 1 7 5 0
1028 2 7 2 0 1 7 3 0 2 7 1 0 2 7 2 0 0 7 0 0 1 7 4 0 1 7 10 0 2 7 19 0 2 7 13 0 2 7
1029 2 0 1 7 3 0 2 7 2 0 2 7 2 0 2 7 1 0 2 7 2 0 1 7 6 0 0 7 0 0 3 7 2 0 6 7 2 0 1
1030 7 4 0 1 7 3 0 2 7 130 0 2 7 3 0 5 7 2 0 2 7 5 0 1 7 2 0 2 7 3 0 1 7 2 0 2 7 0
1031 0 5 7 3 0 2 7 9 0 2 7 20 0 2 7 13 0 1 7 2 0 2 7 3 0 2 7 2 0 1 7 2 0 2 7 2 0 1
1032 7 2 0 1 7 6 0 12 7 0 0 1 7 2 0 1 7 5 0 1 7 3 0 1 7 131 0 1 7 4 0 1 7 0 0 1 7 3
1033 0 2 7 4 0 1 7 2 0 3 7 2 0 1 7 3 0 5 7 0 0 1 7 4 0 1 7 5 0 0 7 2 0 2 7 20 0 2 7
1034 13 0 1 7 2 0 3 7 2 0 2 7 2 0 2 7 2 0 2 7 1 0 2 7 1 0 1 7 7 0 3 7 0 0 5 7 1 0 2
1035 7 1 0 1 7 5 0 1 7 3 0 2 7 130 0 2 7 4 0 3 7 4 0 1 7 5 0 1 7 3 0 1 7 3 0 1 7 2
1036 0 5 7 0 0 2 7 4 0 1 7 4 0 1 7 1 0 2 7 21 0 2 7 13 0 1 7 3 0 1 7 2 0 2 7 2 0 2
1037 7 2 0 2 7 2 0 1 7 0 0 2 7 3 0 1 7 1 0 3 7 1 0 4 7 2 0 1 7 0 0 2 7 3 0 1 7 0 0
1038 1 7 3 0 2 7 130 0 1 7 5 0 3 7 3 0 2 7 4 0 1 7 3 0 1 7 4 0 0 7 3 0 1 7 4 0 1 7
1039 4 0 1 7 4 0 1 7 1 0 2 7 21 0 2 7 13 0 1 7 3 0 1 7 3 0 2 7 1 0 3 7 2 0 1 7 2 0
1040 5 7 3 0 1 7 2 0 2 7 9 0 5 7 3 0 1 7 0 0 1 7 3 0 2 7 130 0 2 7 5 0 2 7 4 0 2 7
1041 4 0 1 7 2 0 2 7 3 0 1 7 2 0 1 7 4 0 2 7 4 0 1 7 3 0 2 7 0 0 2 7 22 0 2 7 13 0
1042 1 7 2 0 2 7 2 0 2 7 1 0 3 7 2 0 2 7 2 0 3 7 4 0 1 7 2 0 3 7 9 0 3 7 4 0 1 7 1
1043 0 1 7 3 0 2 7 130 0 1 7 14 0 1 7 5 0 1 7 1 0 2 7 4 0 1 7 1 0 1 7 5 0 1 7 5 0 1
1044 7 2 0 2 7 0 0 2 7 22 0 2 7 14 0 1 7 1 0 2 7 3 0 2 7 0 0 1 7 0 0 1 7 1 0 2 7 3
1045 0 1 7 5 0 1 7 3 0 2 7 10 0 1 7 5 0 1 7 2 0 1 7 2 0 3 7 129 0 2 7 13 0 2 7 5 0
1046 5 7 5 0 5 7 5 0 1 7 5 0 1 7 1 0 2 7 1 0 1 7 0 0 5 7 16 0 2 7 14 0 5 7 4 0 4 7
1047 1 0 5 7 4 0 2 7 2 0 2 7 4 0 1 7 11 0 2 7 2 0 2 7 3 0 1 7 1 0 1 7 0 0 1 7 129 0
1048 1 7 14 0 2 7 5 0 4 7 6 0 4 7 5 0 2 7 5 0 5 7 1 0 9 7 16 0 1 7 15 0 4 7 5 0 3 7
1049 2 0 4 7 5 0 7 7 4 0 2 7 11 0 7 7 4 0 5 7 0 0 1 7 128 0 2 7 14 0 2 7 6 0 2 7 8
1050 0 1 7 7 0 1 7 7 0 2 7 3 0 2 7 22 0 2 7 16 0 2 7 7 0 1 7 3 0 3 7 7 0 4 7 6 0 1
1051 7 13 0 4 7 6 0 4 7 1 0 2 7 127 0 1 7 15 0 2 7 28 0 1 7 40 0 2 7 57 0 1 7 26 0
1052 2 7 3 0 1 7 126 0 2 7 15 0 2 7 71 0 1 7 223 0 1 7 17 0 0 7 255 7 255 7 255 7
1053 255 7 255 7 255 7 255 7 255 7 255 7 127
1058 (defun restore-textmode (textmode-state)
1059 (setf (vga-state) textmode-state)
1060 (ecase (vga-character-height)
1061 (8 (write-font +vga-font-8x8+ 8))
1062 (16 (write-font +vga-font-8x16+ 16)))
1063 nil)
1065 (defun invoke-debugger-with-textmode (debugger textmode-state condition)
1066 (let ((interrupted-vga-state (vga-state))
1067 (muerte::*debugger-function* debugger))
1068 (restore-textmode textmode-state)
1069 (unwind-protect
1070 (invoke-debugger condition)
1071 (setf (vga-state) interrupted-vga-state)
1072 (g-clear))))
1074 (defmacro with-textmode-restored (options &body body)
1075 "Reset current VGA textmode after body completes, or debugger is entered."
1076 (declare (ignore options))
1077 (let ((real-debugger-var (gensym "real-debugger-"))
1078 (vga-state-var (gensym "vga-state-")))
1079 `(let* ((,vga-state-var
1080 (vga-state))
1081 (,real-debugger-var
1082 muerte::*debugger-function*)
1083 (muerte::*debugger-function*
1084 (lambda (c)
1085 (invoke-debugger-with-textmode ,real-debugger-var ,vga-state-var c))))
1086 (unwind-protect
1087 (progn ,@body)
1088 (restore-textmode ,vga-state-var)))))
1090 ;; graphics functions below
1095 ;; TODO: This can be optimised through two methods
1096 ;; 1. Either write all of plane 1, then plane 2 etc (plane switches are slow)
1097 ;; 2. Use multiple plane writes at once (see g-clear for idea)
1098 ;; - Probably better because of large areas of the same colour
1099 (defun rle-blit-splash (splash)
1100 (loop with index = 0
1101 for i from 0 below (length splash) by 2
1102 for value = (aref splash i)
1103 for count = (1+ (aref splash (1+ i)))
1104 do (loop repeat count
1105 do (setf (pixel (mod index *vga-width*) ; ugly hackitude :(
1106 (truncate index *vga-width*))
1107 value)
1108 (incf index)))
1109 nil)
1111 ;; show the splash screen
1112 (defun g-show-splash ()
1113 (with-textmode-restored ()
1114 (g-start)
1115 (rle-blit-splash *vga-g-splash*)
1116 (page-flip)
1117 (read-char)
1118 (g-clear))
1119 (values))
1121 ;; read a pixel from the DISPLAYED page
1122 (defun pixel (x y)
1123 (memref-int (vga-memory-map)
1124 :index (+ (* (truncate *vga-width* 4) y)
1125 (truncate x y)
1126 (* (truncate *vga-width* 2)
1127 *vga-height*
1128 (mod (1+ *vga-current-page*)
1129 *vga-page-count*)))
1130 :type :unsigned-byte8))
1132 ;; set a pixel to a colour of our choice
1133 ;; write to the NEXT page
1134 (defun (setf pixel) (color x y)
1135 (cond
1136 ((< x (nth 0 (viewport))))
1137 ((>= x (nth 1 (viewport))))
1138 ((< y (nth 2 (viewport))))
1139 ((>= y (nth 3 (viewport))))
1140 (t (set-plane (logand x 3))
1141 (setf (memref-int (vga-memory-map)
1142 :index (+ (* (truncate *vga-width* 4) y) ; pixel
1143 (truncate x 4)
1144 (* (truncate *vga-width* 2) ; page
1145 *vga-height*
1146 *vga-current-page*))
1147 :type :unsigned-byte8)
1148 color)))
1149 color)
1153 ; return the current viewport as a list
1154 (defun viewport ()
1155 *vga-viewport*)
1158 ; sets the viewport
1159 ; rectangle is a list of left-bound, right-bound, top-bound, bottom-bound
1160 (defun (setf viewport) (rectangle)
1161 (setf *vga-viewport* rectangle))
1164 ;; clear the screen
1165 (defun g-clear ()
1166 ;; set read plane to all (bitmask 1111)
1167 (set-plane-by-bitmask 15)
1168 ;; writing to all 4 planes here thus 1/4 of the bytes
1169 ;; and by writing 16 bits a time we get double plus good optimisation :)
1170 ;; However, we wish to cover four planes, thus four times the memory
1171 (loop for x from 0 below (* *vga-width* *vga-height*)
1172 do (setf (memref-int (vga-memory-map)
1173 :index x
1174 :type :unsigned-byte16)
1175 #x0000)))
1178 (defun unchain-video-mode ()
1179 ;; disable chain-4
1180 (setf (io-port VGA-SEQ-INDEX :unsigned-byte8) #x04)
1181 (setf (io-port VGA-SEQ-DATA :unsigned-byte8) #x06)
1182 ;; disable long mode
1183 (setf (io-port VGA-CRTC-INDEX :unsigned-byte8) #x14)
1184 (setf (io-port VGA-CRTC-DATA :unsigned-byte8) #x00)
1185 ;; enable byte mode
1186 (setf (io-port VGA-CRTC-INDEX :unsigned-byte8) #x17)
1187 (setf (io-port VGA-CRTC-DATA :unsigned-byte8) #xE3))
1190 (defun set-page (page)
1191 (setf (io-port VGA-CRTC-INDEX :unsigned-byte8) #x0C)
1192 (setf (io-port VGA-CRTC-DATA :unsigned-byte8) (ldb (byte 8 8)
1193 (* page
1194 (truncate *vga-width* 2)
1195 *vga-height*)))
1196 (setf (io-port VGA-CRTC-INDEX :unsigned-byte8) #x00)
1197 (setf (io-port VGA-CRTC-DATA :unsigned-byte8) (ldb (byte 8 0)
1198 (* page
1199 (truncate *vga-width* 2)
1200 *vga-height*))))
1203 ;; Simple wrapper to swap pages
1204 (defun page-flip ()
1205 (set-page *vga-current-page*)
1206 (setf *vga-current-page*
1207 (mod (1+ *vga-current-page*)
1208 *vga-page-count*)))
1211 ;; easy way to get into graphics mode
1212 (defun g-start ()
1213 (setf (vga-state) +vga-state-320x200x256-modex+)
1214 (setf *vga-width* 320)
1215 (setf *vga-height* 200)
1216 (setf *vga-page-count* 2)
1217 (setf *vga-current-page* 0) ; writing page
1218 (setf (viewport) `(0 ,(1- *vga-width*) 0 ,(1- *vga-height*)))
1219 (unchain-video-mode)
1220 (g-clear)
1221 (page-flip))
1224 ;; draw-line from ch-image
1225 ;; originally written by Cyrus Harmon
1226 ;; modified for movitz by Martin Bealby
1227 (defun draw-line (y0 x0 y1 x1 col)
1228 (let ((dx (- x1 x0))
1229 (dy (- y1 y0)))
1230 (declare (type fixnum dx dy))
1231 (let ((absdx (abs dx))
1232 (absdy (abs dy)))
1233 (declare (type fixnum absdx absdy))
1234 (let ((xstep (if (minusp dx) -1 1))
1235 (ystep (if (minusp dy) -1 1)))
1236 (if (>= absdx absdy)
1237 (let ((d (- (* 2 absdy) absdx))
1238 (incr-e (* 2 absdy))
1239 (incr-ne (* 2 (- absdy absdx)))
1240 (x x0)
1241 (y y0))
1242 (declare (type fixnum d incr-e incr-ne x y))
1243 (setf (pixel y x) col)
1244 (dotimes (i absdx)
1245 (cond
1246 ((<= d 0)
1247 (incf d incr-e)
1248 (incf x xstep))
1250 (incf d incr-ne)
1251 (incf x xstep)
1252 (incf y ystep)))
1253 (setf (pixel y x) col)))
1254 (let ((d (- (* 2 absdy) absdx))
1255 (incr-n (* 2 absdx))
1256 (incr-ne (* 2 (- absdx absdy)))
1257 (x x0)
1258 (y y0))
1259 (declare (type fixnum d incr-n incr-ne x y))
1260 (setf (pixel y x) col)
1261 (dotimes (i absdy)
1262 (cond
1263 ((<= d 0)
1264 (incf d incr-n)
1265 (incf y ystep))
1267 (incf d incr-ne)
1268 (incf y ystep)
1269 (incf x xstep)))
1270 (setf (pixel y x) col))))))))
1272 ;; draw-circle from ch-image
1273 ;; originally written by Cyrus Harmon
1274 ;; modified for movitz by Martin Bealby
1275 (defmethod draw-circle (center-y center-x radius col)
1276 (declare (type fixnum center-y center-x radius))
1277 (flet ((circle-points (y x col)
1278 (setf (pixel (+ center-y y) (+ center-x x)) col)
1279 (setf (pixel (+ center-y x) (+ center-x y)) col)
1280 (setf (pixel (- center-y x) (+ center-x y)) col)
1281 (setf (pixel (- center-y y) (+ center-x x)) col)
1282 (setf (pixel (- center-y y) (- center-x x)) col)
1283 (setf (pixel (- center-y x) (- center-x y)) col)
1284 (setf (pixel (+ center-y x) (- center-x y)) col)
1285 (setf (pixel (+ center-y y) (- center-x x)) col)))
1286 (let ((x 0)
1287 (y radius)
1288 (d (- 1 radius))
1289 (delta-e 3)
1290 (delta-se (+ (* -2 radius) 5)))
1291 (declare (type fixnum x y d delta-e delta-se))
1292 (circle-points y x col)
1293 (do () ((>= x y))
1294 (if (< d 0)
1295 (progn
1296 (incf d delta-e)
1297 (incf delta-e 2)
1298 (incf delta-se 2))
1299 (progn
1300 (incf d delta-se)
1301 (incf delta-e 2)
1302 (incf delta-se 4)
1303 (decf y)))
1304 (incf x)
1305 (circle-points y x col)))))
1307 ;; additional drawing functions (rectangle / triangle)
1308 (defmethod draw-rectangle (x1 y1 x2 y2 col)
1309 (draw-line x1 y1 x1 y2 col)
1310 (draw-line x1 y1 x2 y1 col)
1311 (draw-line x1 y2 x2 y2 col)
1312 (draw-line x2 y1 x2 y2 col))
1315 (defmethod draw-triangle (x1 y1 x2 y2 x3 y3 col)
1316 (draw-line x1 y1 x2 y2 col)
1317 (draw-line x2 y2 x3 y3 col)
1318 (draw-line x3 y3 x1 y1 col))