vtac-terminal 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1188 @@
1
+ import sdl, { Sdl } from '@kmamal/sdl'
2
+ import { SerialPort } from 'serialport'
3
+
4
+ export class VTAC {
5
+
6
+ static COLUMNS: number = 40
7
+ static ROWS: number = 30
8
+ static WIDTH: number = VTAC.COLUMNS * 8
9
+ static HEIGHT: number = VTAC.ROWS * 8
10
+
11
+ port?: SerialPort
12
+ path?: string
13
+ baudRate: number = 9600
14
+ parity: 'odd' | 'even' | 'none' = 'none'
15
+ dataBits: 5 | 6 | 7 | 8 | undefined = 8
16
+ stopBits: 1 | 1.5 | 2 | undefined = 1
17
+
18
+ window?: Sdl.Video.Window
19
+ scale: number = 2
20
+ fullscreen: boolean = false
21
+
22
+ buffer: Buffer<ArrayBuffer> = Buffer.alloc(VTAC.WIDTH * VTAC.HEIGHT).fill(0x00)
23
+
24
+ mode: 'text' | 'graphics' = 'text'
25
+
26
+ column: number = 0
27
+ row: number = 0
28
+ offset: number = 0
29
+ columnNextByte: boolean = false
30
+ rowNextByte: boolean = false
31
+
32
+ cursorChar: number = 0x00 // OFF
33
+ cursorMode: 'solid' | 'blinking' = 'solid'
34
+ cursorCharNextByte: boolean = false
35
+ cursorBlinkTime: number = 0
36
+ cursorVisible: boolean = true
37
+ cursorBlinkInterval: number = 500 // Blink every 500ms (twice per second)
38
+
39
+ dataNextByte: boolean = false
40
+
41
+ foregroundColor: number = 0xFF // White
42
+ backgroundColor: number = 0x00 // Black
43
+ foregroundColorNextByte: boolean = false
44
+ backgroundColorNextByte: boolean = false
45
+
46
+ lastRenderTime: number = 0
47
+ targetFrameTime: number = 1000 / 60 // 60fps = ~16.67ms per frame
48
+
49
+ //
50
+ // MAIN
51
+ //
52
+
53
+ launch = () => {
54
+ if (this.path) {
55
+ this.port = new SerialPort({
56
+ path: this.path,
57
+ baudRate: this.baudRate,
58
+ parity: this.parity,
59
+ dataBits: this.dataBits,
60
+ stopBits: this.stopBits
61
+ }, (err) => {
62
+ if (err) {
63
+ console.log('Error: ', err.message)
64
+ }
65
+ })
66
+
67
+ this.port.on('data', this.receive)
68
+ }
69
+
70
+ this.window = sdl.video.createWindow({
71
+ title: "VT-AC",
72
+ width: VTAC.WIDTH * this.scale,
73
+ height: VTAC.HEIGHT * this.scale,
74
+ fullscreen: this.fullscreen,
75
+ resizable: false
76
+ })
77
+ this.window.on('keyDown', this.onKey)
78
+ this.window.on('textInput', this.onText)
79
+ this.window.on('close', (event) => {
80
+ if (this.port && this.port.isOpen) {
81
+ this.port.close()
82
+ }
83
+ })
84
+
85
+ // Start the render loop
86
+ this.render()
87
+ }
88
+
89
+ render = () => {
90
+ if (!this.window) { return }
91
+ if (this.window.destroyed) { return }
92
+
93
+ const now = Date.now()
94
+ const elapsed = now - this.lastRenderTime
95
+
96
+ // Update cursor blink state
97
+ if (this.cursorMode === 'blinking') {
98
+ this.cursorBlinkTime += elapsed
99
+ if (this.cursorBlinkTime >= this.cursorBlinkInterval) {
100
+ this.cursorVisible = !this.cursorVisible
101
+ this.cursorBlinkTime = 0
102
+ }
103
+ } else {
104
+ this.cursorVisible = true
105
+ }
106
+
107
+ // Create temporary render buffer
108
+ const renderBuffer = Buffer.from(this.buffer)
109
+
110
+ // Draw cursor if visible and cursorChar is not 0x00 (OFF)
111
+ if (this.cursorVisible && this.cursorChar !== 0x00) {
112
+ this.drawCursor(renderBuffer)
113
+ }
114
+
115
+ this.window.render(VTAC.WIDTH, VTAC.HEIGHT, VTAC.WIDTH, 'rgb332', renderBuffer)
116
+
117
+ this.lastRenderTime = now
118
+
119
+ // Calculate delay to maintain target frame rate
120
+ const renderTime = Date.now() - now
121
+ const delay = Math.max(0, this.targetFrameTime - renderTime)
122
+
123
+ setTimeout(this.render, delay)
124
+ }
125
+
126
+ drawCursor = (renderBuffer: Buffer<ArrayBuffer>) => {
127
+ const character = VTAC.CHARACTERS[this.cursorChar]
128
+ const startRow = this.row * 8
129
+ const startColumn = this.column * 8
130
+
131
+ // Draw cursor character with inverted colors
132
+ for (let y = 0; y < 8; y++) {
133
+ const rowByte = character[y]
134
+ const bufferRowStart = (startRow + y) * VTAC.WIDTH
135
+
136
+ for (let x = 0; x < 8; x++) {
137
+ const bit = (rowByte >> (7 - x)) & 1
138
+ // Invert the colors: if bit is 1, use background; if 0, use foreground
139
+ const color = bit ? this.backgroundColor : this.foregroundColor
140
+ renderBuffer[bufferRowStart + startColumn + x] = color
141
+ }
142
+ }
143
+ }
144
+
145
+ //
146
+ // METHODS
147
+ //
148
+
149
+ reset = () => {
150
+ this.column = 0
151
+ this.row = 0
152
+ this.offset = 0
153
+ this.mode = 'text'
154
+ this.cursorChar = 0x00
155
+ this.cursorMode = 'solid'
156
+ this.backgroundColor = 0x00
157
+ this.foregroundColor = 0xFF
158
+ this.columnNextByte = false
159
+ this.rowNextByte = false
160
+ this.cursorCharNextByte = false
161
+ this.foregroundColorNextByte = false
162
+ this.backgroundColorNextByte = false
163
+ this.buffer.fill(0x00)
164
+ }
165
+
166
+ bell = () => {
167
+ process.stdout.write('\u0007')
168
+ }
169
+
170
+ backspace = () => {
171
+ if (this.column > 0) {
172
+ this.column--
173
+ }
174
+ this.offset = 0
175
+ }
176
+
177
+ tab = () => {
178
+ this.column = Math.min((Math.floor(this.column / 4) + 1) * 4, VTAC.COLUMNS - 1)
179
+ this.offset = 0
180
+ }
181
+
182
+ lineFeed = () => {
183
+ let nextRow = this.row + 1
184
+
185
+ if (nextRow >= VTAC.ROWS) {
186
+ nextRow = VTAC.ROWS - 1
187
+ this.scroll('up')
188
+ }
189
+
190
+ this.row = nextRow
191
+ this.offset = 0
192
+ }
193
+
194
+ carriageReturn = () => {
195
+ this.column = 0
196
+ this.offset = 0
197
+ }
198
+
199
+ deleteTo = (destination: 'startOfLine' | 'endOfLine' | 'startOfScreen' | 'endOfScreen') => {
200
+ switch (destination) {
201
+ case 'startOfLine':
202
+ // Clear from start of current line to current cursor position
203
+ for (let col = 0; col <= this.column; col++) {
204
+ this.clearCharacterCell(col, this.row)
205
+ }
206
+ break
207
+ case 'endOfLine':
208
+ // Clear from current cursor position to end of current line
209
+ for (let col = this.column; col < VTAC.COLUMNS; col++) {
210
+ this.clearCharacterCell(col, this.row)
211
+ }
212
+ break
213
+ case 'startOfScreen':
214
+ // Clear from start of screen to current cursor position
215
+ for (let row = 0; row < this.row; row++) {
216
+ for (let col = 0; col < VTAC.COLUMNS; col++) {
217
+ this.clearCharacterCell(col, row)
218
+ }
219
+ }
220
+ // Clear partial line up to and including cursor
221
+ for (let col = 0; col <= this.column; col++) {
222
+ this.clearCharacterCell(col, this.row)
223
+ }
224
+ break
225
+ case 'endOfScreen':
226
+ // Clear from current cursor position to end of screen
227
+ for (let col = this.column; col < VTAC.COLUMNS; col++) {
228
+ this.clearCharacterCell(col, this.row)
229
+ }
230
+ // Clear remaining lines
231
+ for (let row = this.row + 1; row < VTAC.ROWS; row++) {
232
+ for (let col = 0; col < VTAC.COLUMNS; col++) {
233
+ this.clearCharacterCell(col, row)
234
+ }
235
+ }
236
+ break
237
+ }
238
+ }
239
+
240
+ scroll = (direction: 'left' | 'right' | 'up' | 'down') => {
241
+ switch (direction) {
242
+ case 'left':
243
+ // Shift all character cells one position to the left
244
+ for (let row = 0; row < VTAC.ROWS; row++) {
245
+ for (let col = 0; col < VTAC.COLUMNS - 1; col++) {
246
+ this.copyCharacterCell(col + 1, row, col, row)
247
+ }
248
+ // Fill rightmost column with background color
249
+ this.clearCharacterCell(VTAC.COLUMNS - 1, row)
250
+ }
251
+ break
252
+ case 'right':
253
+ // Shift all character cells one position to the right
254
+ for (let row = 0; row < VTAC.ROWS; row++) {
255
+ for (let col = VTAC.COLUMNS - 1; col > 0; col--) {
256
+ this.copyCharacterCell(col - 1, row, col, row)
257
+ }
258
+ // Fill leftmost column with background color
259
+ this.clearCharacterCell(0, row)
260
+ }
261
+ break
262
+ case 'up':
263
+ // Shift all character cells one position up
264
+ for (let row = 0; row < VTAC.ROWS - 1; row++) {
265
+ for (let col = 0; col < VTAC.COLUMNS; col++) {
266
+ this.copyCharacterCell(col, row + 1, col, row)
267
+ }
268
+ }
269
+ // Fill bottom row with background color
270
+ for (let col = 0; col < VTAC.COLUMNS; col++) {
271
+ this.clearCharacterCell(col, VTAC.ROWS - 1)
272
+ }
273
+ break
274
+ case 'down':
275
+ // Shift all character cells one position down
276
+ for (let row = VTAC.ROWS - 1; row > 0; row--) {
277
+ for (let col = 0; col < VTAC.COLUMNS; col++) {
278
+ this.copyCharacterCell(col, row - 1, col, row)
279
+ }
280
+ }
281
+ // Fill top row with background color
282
+ for (let col = 0; col < VTAC.COLUMNS; col++) {
283
+ this.clearCharacterCell(col, 0)
284
+ }
285
+ break
286
+ }
287
+ }
288
+
289
+ cursor = (direction: 'left' | 'right' | 'up' | 'down') => {
290
+ switch (direction) {
291
+ case 'left':
292
+ if (this.column > 0) {
293
+ this.column--
294
+ }
295
+ break
296
+ case 'right':
297
+ if (this.column < VTAC.COLUMNS - 1) {
298
+ this.column++
299
+ }
300
+ break
301
+ case 'up':
302
+ if (this.row > 0) {
303
+ this.row--
304
+ }
305
+ break
306
+ case 'down':
307
+ if (this.row < VTAC.ROWS - 1) {
308
+ this.row++
309
+ }
310
+ break
311
+ }
312
+ this.offset = 0
313
+ }
314
+
315
+ delete = () => {
316
+ const startRow = this.row * 8
317
+ const startColumn = this.column * 8
318
+
319
+ // Clear 8x8 pixel block with background color
320
+ for (let y = 0; y < 8; y++) {
321
+ const bufferRowStart = (startRow + y) * VTAC.WIDTH
322
+ for (let x = 0; x < 8; x++) {
323
+ this.buffer[bufferRowStart + startColumn + x] = this.backgroundColor
324
+ }
325
+ }
326
+ }
327
+
328
+ data = (data: number) => {
329
+ switch (this.mode) {
330
+ case 'text':
331
+ this.insertTextData(data)
332
+ break
333
+ case 'graphics':
334
+ this.insertGraphicsData(data)
335
+ break
336
+ }
337
+ }
338
+
339
+ //
340
+ // INSERT
341
+ //
342
+
343
+ insertTextData = (data: number) => {
344
+ const character = VTAC.CHARACTERS[data]
345
+ const startRow = this.row * 8
346
+ const startColumn = this.column * 8
347
+
348
+ // Render 8x8 character bitmap
349
+ for (let y = 0; y < 8; y++) {
350
+ const rowByte = character[y]
351
+ const bufferRowStart = (startRow + y) * VTAC.WIDTH
352
+
353
+ for (let x = 0; x < 8; x++) {
354
+ const bit = (rowByte >> (7 - x)) & 1
355
+ const color = bit ? this.foregroundColor : this.backgroundColor
356
+ this.buffer[bufferRowStart + startColumn + x] = color
357
+ }
358
+ }
359
+
360
+ // Move to next character position
361
+ this.column++
362
+ if (this.column >= VTAC.COLUMNS) {
363
+ this.column = 0
364
+ this.row++
365
+ if (this.row >= VTAC.ROWS) {
366
+ this.row = VTAC.ROWS - 1
367
+ }
368
+ }
369
+ this.offset = 0
370
+ }
371
+
372
+ insertGraphicsData = (data: number) => {
373
+ // Calculate starting pixel position (offset is the row within the 8x8 block)
374
+ const pixelRow = this.row * 8 + this.offset
375
+ const startColumn = this.column * 8
376
+ const bufferRowStart = pixelRow * VTAC.WIDTH
377
+
378
+ // Write 8 pixels horizontally - each bit in data represents one pixel
379
+ // Bit 7 (MSB) is leftmost pixel, bit 0 (LSB) is rightmost pixel
380
+ for (let i = 0; i < 8; i++) {
381
+ const bit = (data >> (7 - i)) & 1
382
+ const color = bit ? this.foregroundColor : this.backgroundColor
383
+ this.buffer[bufferRowStart + startColumn + i] = color
384
+ }
385
+
386
+ // Move to next location in pixel array
387
+ this.offset++
388
+ if (this.offset >= 8) {
389
+ this.offset = 0
390
+ this.column++
391
+ if (this.column >= VTAC.COLUMNS) {
392
+ this.column = 0
393
+ this.row++
394
+ if (this.row >= VTAC.ROWS) {
395
+ this.row = 0
396
+ }
397
+ }
398
+ }
399
+ }
400
+
401
+ //
402
+ // HELPERS
403
+ //
404
+
405
+ copyCharacterCell = (sourceCol: number, sourceRow: number, destCol: number, destRow: number) => {
406
+ const sourceStartRow = sourceRow * 8
407
+ const sourceStartColumn = sourceCol * 8
408
+ const destStartRow = destRow * 8
409
+ const destStartColumn = destCol * 8
410
+
411
+ // Copy 8x8 pixel block
412
+ for (let y = 0; y < 8; y++) {
413
+ const sourceBufferRowStart = (sourceStartRow + y) * VTAC.WIDTH
414
+ const destBufferRowStart = (destStartRow + y) * VTAC.WIDTH
415
+ for (let x = 0; x < 8; x++) {
416
+ this.buffer[destBufferRowStart + destStartColumn + x] =
417
+ this.buffer[sourceBufferRowStart + sourceStartColumn + x]
418
+ }
419
+ }
420
+ }
421
+
422
+ clearCharacterCell = (col: number, row: number) => {
423
+ const startRow = row * 8
424
+ const startColumn = col * 8
425
+
426
+ // Clear 8x8 pixel block with background color
427
+ for (let y = 0; y < 8; y++) {
428
+ const bufferRowStart = (startRow + y) * VTAC.WIDTH
429
+ for (let x = 0; x < 8; x++) {
430
+ this.buffer[bufferRowStart + startColumn + x] = this.backgroundColor
431
+ }
432
+ }
433
+ }
434
+
435
+ //
436
+ // EVENTS
437
+ //
438
+
439
+ parse = (data: number) => {
440
+ if (this.cursorCharNextByte) {
441
+ this.cursorChar = data
442
+ this.cursorCharNextByte = false
443
+ return
444
+ }
445
+ if (this.columnNextByte) {
446
+ this.column = data % VTAC.COLUMNS // 0 to COLUMNS-1
447
+ this.offset = 0
448
+ this.columnNextByte = false
449
+ return
450
+ }
451
+ if (this.rowNextByte) {
452
+ this.row = data % VTAC.ROWS // 0 to ROWS-1
453
+ this.offset = 0
454
+ this.rowNextByte = false
455
+ return
456
+ }
457
+
458
+ if (this.foregroundColorNextByte) {
459
+ this.foregroundColor = data
460
+ this.foregroundColorNextByte = false
461
+ return
462
+ }
463
+ if (this.backgroundColorNextByte) {
464
+ this.backgroundColor = data
465
+ this.backgroundColorNextByte = false
466
+ return
467
+ }
468
+
469
+ if (this.dataNextByte) {
470
+ this.data(data)
471
+ this.dataNextByte = false
472
+ return
473
+ }
474
+
475
+ switch(true) {
476
+ case (data == 0x00): // NULL
477
+ break
478
+ case (data == 0x01): // CURSOR HOME
479
+ this.column = 0
480
+ this.row = 0
481
+ this.offset = 0
482
+ break
483
+ case (data == 0x02): // CURSOR CHARACTER
484
+ this.cursorCharNextByte = true
485
+ break
486
+ case (data == 0x03): // CURSOR BLINKING
487
+ this.cursorMode == 'solid' ? this.cursorMode = 'blinking' : this.cursorMode = 'solid'
488
+ break
489
+ case (data == 0x04): // RESET
490
+ this.reset()
491
+ break
492
+ case (data == 0x05): // RESERVED
493
+ // Reserved for future use
494
+ break
495
+ case (data == 0x06): // RESERVED
496
+ // Reserved for future use
497
+ break
498
+ case (data == 0x07): // BELL
499
+ this.bell()
500
+ break
501
+ case (data == 0x08): // BACKSPACE
502
+ this.backspace()
503
+ break
504
+ case (data == 0x09): // TAB
505
+ this.tab()
506
+ break
507
+ case (data == 0x0A): // LINE FEED
508
+ this.lineFeed()
509
+ break
510
+ case (data == 0x0B): // SCREEN MODE
511
+ this.mode == 'text' ? this.mode = 'graphics' : this.mode = 'text'
512
+ break
513
+ case (data == 0x0C): // CLEAR SCREEN
514
+ this.buffer.fill(this.backgroundColor)
515
+ break
516
+ case (data == 0x0D): // CARRIAGE RETURN
517
+ this.carriageReturn()
518
+ break
519
+ case (data == 0x0E): // SET COLUMN
520
+ this.columnNextByte = true
521
+ break
522
+ case (data == 0x0F): // SET ROW
523
+ this.rowNextByte = true
524
+ break
525
+ case (data == 0x10): // DELETE TO START OF LINE
526
+ this.deleteTo('startOfLine')
527
+ break
528
+ case (data == 0x11): // DELETE TO END OF LINE
529
+ this.deleteTo('endOfLine')
530
+ break
531
+ case (data == 0x12): // DELETE TO START OF SCREEN
532
+ this.deleteTo('startOfScreen')
533
+ break
534
+ case (data == 0x13): // DELETE TO END OF SCREEN
535
+ this.deleteTo('endOfScreen')
536
+ break
537
+ case (data == 0x14): // SCROLL LEFT
538
+ this.scroll('left')
539
+ break
540
+ case (data == 0x15): // SCROLL RIGHT
541
+ this.scroll('right')
542
+ break
543
+ case (data == 0x16): // SCROLL UP
544
+ this.scroll('up')
545
+ break
546
+ case (data == 0x17): // SCROLL DOWN
547
+ this.scroll('down')
548
+ break
549
+ case (data == 0x18): // FOREGROUND COLOR
550
+ this.foregroundColorNextByte = true
551
+ break
552
+ case (data == 0x19): // BACKGROUND COLOR
553
+ this.backgroundColorNextByte = true
554
+ break
555
+ case (data == 0x1A): // NEXT BYTE AS DATA
556
+ this.dataNextByte = true
557
+ break
558
+ case (data == 0x1B): // ESCAPE
559
+ // Reserved for future ANSI escape code handling
560
+ break
561
+ case (data == 0x1C): // CURSOR LEFT
562
+ this.cursor('left')
563
+ break
564
+ case (data == 0x1D): // CURSOR RIGHT
565
+ this.cursor('right')
566
+ break
567
+ case (data == 0x1E): // CURSOR UP
568
+ this.cursor('up')
569
+ break
570
+ case (data == 0x1F): // CURSOR DOWN
571
+ this.cursor('down')
572
+ break
573
+ case (data >= 0x20 && data <= 0x7E): // ASCII CHARACTERS
574
+ this.data(data)
575
+ break
576
+ case (data == 0x7F): // DELETE
577
+ this.delete()
578
+ break
579
+ case (data >= 0x80 && data <= 0xFF): // EXTENDED CHARACTERS
580
+ this.data(data)
581
+ break
582
+ default:
583
+ break
584
+ }
585
+ }
586
+
587
+ transmit = (data: number) => {
588
+ this.port?.write([data], 'hex', (err) => {
589
+ if (err) {
590
+ console.log('Error: ', err.message)
591
+ }
592
+ })
593
+ }
594
+
595
+ receive = (data: Buffer<ArrayBuffer>) => {
596
+ for (let i = 0; i < data.length; i++) {
597
+ this.parse(data[i])
598
+ }
599
+ }
600
+
601
+ onKey = (event: sdl.Events.Window.KeyDown) => {
602
+ switch (event.key) {
603
+ case 'backspace':
604
+ this.transmit(0x08)
605
+ break
606
+ case 'tab':
607
+ this.transmit(0x09)
608
+ break
609
+ case 'enter':
610
+ case 'return':
611
+ this.transmit(0x0D)
612
+ this.transmit(0x0A)
613
+ break
614
+ case 'escape':
615
+ this.transmit(0x1B)
616
+ break
617
+ case 'left':
618
+ this.transmit(0x1C)
619
+ break
620
+ case 'right':
621
+ this.transmit(0x1D)
622
+ break
623
+ case 'up':
624
+ this.transmit(0x1E)
625
+ break
626
+ case 'down':
627
+ this.transmit(0x1F)
628
+ break
629
+ case 'delete':
630
+ this.transmit(0x7F)
631
+ break
632
+ default:
633
+ break
634
+ }
635
+ }
636
+
637
+ onText = (event: sdl.Events.Window.TextInput) => {
638
+ switch (event.text) {
639
+ case ' ':
640
+ this.transmit(0x20)
641
+ break
642
+ case '!':
643
+ this.transmit(0x21)
644
+ break
645
+ case '"':
646
+ this.transmit(0x22)
647
+ break
648
+ case '#':
649
+ this.transmit(0x23)
650
+ break
651
+ case '$':
652
+ this.transmit(0x24)
653
+ break
654
+ case '%':
655
+ this.transmit(0x25)
656
+ break
657
+ case '&':
658
+ this.transmit(0x26)
659
+ break
660
+ case '\'':
661
+ this.transmit(0x27)
662
+ break
663
+ case '(':
664
+ this.transmit(0x28)
665
+ break
666
+ case ')':
667
+ this.transmit(0x29)
668
+ break
669
+ case '*':
670
+ this.transmit(0x2A)
671
+ break
672
+ case '+':
673
+ this.transmit(0x2B)
674
+ break
675
+ case ',':
676
+ this.transmit(0x2C)
677
+ break
678
+ case '-':
679
+ this.transmit(0x2D)
680
+ break
681
+ case '.':
682
+ this.transmit(0x2E)
683
+ break
684
+ case '/':
685
+ this.transmit(0x2F)
686
+ break
687
+ case '0':
688
+ this.transmit(0x30)
689
+ break
690
+ case '1':
691
+ this.transmit(0x31)
692
+ break
693
+ case '2':
694
+ this.transmit(0x32)
695
+ break
696
+ case '3':
697
+ this.transmit(0x33)
698
+ break
699
+ case '4':
700
+ this.transmit(0x34)
701
+ break
702
+ case '5':
703
+ this.transmit(0x35)
704
+ break
705
+ case '6':
706
+ this.transmit(0x36)
707
+ break
708
+ case '7':
709
+ this.transmit(0x37)
710
+ break
711
+ case '8':
712
+ this.transmit(0x38)
713
+ break
714
+ case '9':
715
+ this.transmit(0x39)
716
+ break
717
+ case ':':
718
+ this.transmit(0x3A)
719
+ break
720
+ case ';':
721
+ this.transmit(0x3B)
722
+ break
723
+ case '<':
724
+ this.transmit(0x3C)
725
+ break
726
+ case '=':
727
+ this.transmit(0x3D)
728
+ break
729
+ case '>':
730
+ this.transmit(0x3E)
731
+ break
732
+ case '?':
733
+ this.transmit(0x3F)
734
+ break
735
+ case '@':
736
+ this.transmit(0x40)
737
+ break
738
+ case 'A':
739
+ this.transmit(0x41)
740
+ break
741
+ case 'B':
742
+ this.transmit(0x42)
743
+ break
744
+ case 'C':
745
+ this.transmit(0x43)
746
+ break
747
+ case 'D':
748
+ this.transmit(0x44)
749
+ break
750
+ case 'E':
751
+ this.transmit(0x45)
752
+ break
753
+ case 'F':
754
+ this.transmit(0x46)
755
+ break
756
+ case 'G':
757
+ this.transmit(0x47)
758
+ break
759
+ case 'H':
760
+ this.transmit(0x48)
761
+ break
762
+ case 'I':
763
+ this.transmit(0x49)
764
+ break
765
+ case 'J':
766
+ this.transmit(0x4A)
767
+ break
768
+ case 'K':
769
+ this.transmit(0x4B)
770
+ break
771
+ case 'L':
772
+ this.transmit(0x4C)
773
+ break
774
+ case 'M':
775
+ this.transmit(0x4D)
776
+ break
777
+ case 'N':
778
+ this.transmit(0x4E)
779
+ break
780
+ case 'O':
781
+ this.transmit(0x4F)
782
+ break
783
+ case 'P':
784
+ this.transmit(0x50)
785
+ break
786
+ case 'Q':
787
+ this.transmit(0x51)
788
+ break
789
+ case 'R':
790
+ this.transmit(0x52)
791
+ break
792
+ case 'S':
793
+ this.transmit(0x53)
794
+ break
795
+ case 'T':
796
+ this.transmit(0x54)
797
+ break
798
+ case 'U':
799
+ this.transmit(0x55)
800
+ break
801
+ case 'V':
802
+ this.transmit(0x56)
803
+ break
804
+ case 'W':
805
+ this.transmit(0x57)
806
+ break
807
+ case 'X':
808
+ this.transmit(0x58)
809
+ break
810
+ case 'Y':
811
+ this.transmit(0x59)
812
+ break
813
+ case 'Z':
814
+ this.transmit(0x5A)
815
+ break
816
+ case '[':
817
+ this.transmit(0x5B)
818
+ break
819
+ case '\\':
820
+ this.transmit(0x5C)
821
+ break
822
+ case ']':
823
+ this.transmit(0x5D)
824
+ break
825
+ case '^':
826
+ this.transmit(0x5E)
827
+ break
828
+ case '_':
829
+ this.transmit(0x5F)
830
+ break
831
+ case '`':
832
+ this.transmit(0x60)
833
+ break
834
+ case 'a':
835
+ this.transmit(0x61)
836
+ break
837
+ case 'b':
838
+ this.transmit(0x62)
839
+ break
840
+ case 'c':
841
+ this.transmit(0x63)
842
+ break
843
+ case 'd':
844
+ this.transmit(0x64)
845
+ break
846
+ case 'e':
847
+ this.transmit(0x65)
848
+ break
849
+ case 'f':
850
+ this.transmit(0x66)
851
+ break
852
+ case 'g':
853
+ this.transmit(0x67)
854
+ break
855
+ case 'h':
856
+ this.transmit(0x68)
857
+ break
858
+ case 'i':
859
+ this.transmit(0x69)
860
+ break
861
+ case 'j':
862
+ this.transmit(0x6A)
863
+ break
864
+ case 'k':
865
+ this.transmit(0x6B)
866
+ break
867
+ case 'l':
868
+ this.transmit(0x6C)
869
+ break
870
+ case 'm':
871
+ this.transmit(0x6D)
872
+ break
873
+ case 'n':
874
+ this.transmit(0x6E)
875
+ break
876
+ case 'o':
877
+ this.transmit(0x6F)
878
+ break
879
+ case 'p':
880
+ this.transmit(0x70)
881
+ break
882
+ case 'q':
883
+ this.transmit(0x71)
884
+ break
885
+ case 'r':
886
+ this.transmit(0x72)
887
+ break
888
+ case 's':
889
+ this.transmit(0x73)
890
+ break
891
+ case 't':
892
+ this.transmit(0x74)
893
+ break
894
+ case 'u':
895
+ this.transmit(0x75)
896
+ break
897
+ case 'v':
898
+ this.transmit(0x76)
899
+ break
900
+ case 'w':
901
+ this.transmit(0x77)
902
+ break
903
+ case 'x':
904
+ this.transmit(0x78)
905
+ break
906
+ case 'y':
907
+ this.transmit(0x79)
908
+ break
909
+ case 'z':
910
+ this.transmit(0x7A)
911
+ break
912
+ case '{':
913
+ this.transmit(0x7B)
914
+ break
915
+ case '|':
916
+ this.transmit(0x7C)
917
+ break
918
+ case '}':
919
+ this.transmit(0x7D)
920
+ break
921
+ case '~':
922
+ this.transmit(0x7E)
923
+ break
924
+ default:
925
+ break
926
+ }
927
+ }
928
+
929
+ static CHARACTERS = [
930
+ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], // [] (0)
931
+ [0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e], // [☺] (1)
932
+ [0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e], // [☻] (2)
933
+ [0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00], // [♥] (3)
934
+ [0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00], // [♦] (4)
935
+ [0x38, 0x7c, 0x38, 0xfe, 0xfe, 0x7c, 0x38, 0x7c], // [♣] (5)
936
+ [0x10, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x7c], // [♠] (6)
937
+ [0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00], // [•] (7)
938
+ [0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff], // [◘] (8)
939
+ [0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00], // [○] (9)
940
+ [0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff], // [◙] (10)
941
+ [0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78], // [♂] (11)
942
+ [0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18], // [♀] (12)
943
+ [0x3f, 0x33, 0x3f, 0x30, 0x30, 0x70, 0xf0, 0xe0], // [♪] (13)
944
+ [0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0], // [♫] (14)
945
+ [0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99], // [☼] (15)
946
+ [0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x00], // [►] (16)
947
+ [0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00], // [◄] (17)
948
+ [0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18], // [↕] (18)
949
+ [0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00], // [‼] (19)
950
+ [0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00], // [¶] (20)
951
+ [0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78], // [§] (21)
952
+ [0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00], // [▬] (22)
953
+ [0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff], // [↨] (23)
954
+ [0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00], // [↑] (24)
955
+ [0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00], // [↓] (25)
956
+ [0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00], // [→] (26)
957
+ [0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00], // [←] (27)
958
+ [0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00], // [∟] (28)
959
+ [0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00], // [↔] (29)
960
+ [0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00], // [▲] (30)
961
+ [0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00, 0x00], // [▼] (31)
962
+ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], // [ ] (32)
963
+ [0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00], // [!] (33)
964
+ [0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00], // ["] (34)
965
+ [0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00], // [#] (35)
966
+ [0x30, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x30, 0x00], // [$] (36)
967
+ [0x00, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x00], // [%] (37)
968
+ [0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x00], // [&] (38)
969
+ [0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00], // ['] (39)
970
+ [0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00], // [(] (40)
971
+ [0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00], // [)] (41)
972
+ [0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00], // [*] (42)
973
+ [0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0x00], // [+] (43)
974
+ [0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60], // [,] (44)
975
+ [0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00], // [-] (45)
976
+ [0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00], // [.] (46)
977
+ [0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00], // [/] (47)
978
+ [0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x00], // [0] (48)
979
+ [0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x00], // [1] (49)
980
+ [0x78, 0xcc, 0x0c, 0x38, 0x60, 0xcc, 0xfc, 0x00], // [2] (50)
981
+ [0x78, 0xcc, 0x0c, 0x38, 0x0c, 0xcc, 0x78, 0x00], // [3] (51)
982
+ [0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x1e, 0x00], // [4] (52)
983
+ [0xfc, 0xc0, 0xf8, 0x0c, 0x0c, 0xcc, 0x78, 0x00], // [5] (53)
984
+ [0x38, 0x60, 0xc0, 0xf8, 0xcc, 0xcc, 0x78, 0x00], // [6] (54)
985
+ [0xfc, 0xcc, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x00], // [7] (55)
986
+ [0x78, 0xcc, 0xcc, 0x78, 0xcc, 0xcc, 0x78, 0x00], // [8] (56)
987
+ [0x78, 0xcc, 0xcc, 0x7c, 0x0c, 0x18, 0x70, 0x00], // [9] (57)
988
+ [0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00], // [:] (58)
989
+ [0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x60], // [;] (59)
990
+ [0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00], // [<] (60)
991
+ [0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00], // [=] (61)
992
+ [0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00], // [>] (62)
993
+ [0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00], // [?] (63)
994
+ [0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x78, 0x00], // [@] (64)
995
+ [0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00], // [A] (65)
996
+ [0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00], // [B] (66)
997
+ [0x3c, 0x66, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x00], // [C] (67)
998
+ [0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00], // [D] (68)
999
+ [0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00], // [E] (69)
1000
+ [0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x00], // [F] (70)
1001
+ [0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3e, 0x00], // [G] (71)
1002
+ [0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0x00], // [H] (72)
1003
+ [0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00], // [I] (73)
1004
+ [0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00], // [J] (74)
1005
+ [0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00], // [K] (75)
1006
+ [0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00], // [L] (76)
1007
+ [0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00], // [M] (77)
1008
+ [0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00], // [N] (78)
1009
+ [0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00], // [O] (79)
1010
+ [0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00], // [P] (80)
1011
+ [0x78, 0xcc, 0xcc, 0xcc, 0xdc, 0x78, 0x1c, 0x00], // [Q] (81)
1012
+ [0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x00], // [R] (82)
1013
+ [0x78, 0xcc, 0xe0, 0x70, 0x1c, 0xcc, 0x78, 0x00], // [S] (83)
1014
+ [0xfc, 0xb4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00], // [T] (84)
1015
+ [0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xfc, 0x00], // [U] (85)
1016
+ [0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00], // [V] (86)
1017
+ [0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00], // [W] (87)
1018
+ [0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00], // [X] (88)
1019
+ [0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x78, 0x00], // [Y] (89)
1020
+ [0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00], // [Z] (90)
1021
+ [0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00], // [[] (91)
1022
+ [0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00], // [\] (92)
1023
+ [0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00], // []] (93)
1024
+ [0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00], // [^] (94)
1025
+ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff], // [_] (95)
1026
+ [0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00], // [`] (96)
1027
+ [0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00], // [a] (97)
1028
+ [0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0xdc, 0x00], // [b] (98)
1029
+ [0x00, 0x00, 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x00], // [c] (99)
1030
+ [0x1c, 0x0c, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00], // [d] (100)
1031
+ [0x00, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00], // [e] (101)
1032
+ [0x38, 0x6c, 0x60, 0xf0, 0x60, 0x60, 0xf0, 0x00], // [f] (102)
1033
+ [0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8], // [g] (103)
1034
+ [0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00], // [h] (104)
1035
+ [0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00], // [i] (105)
1036
+ [0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78], // [j] (106)
1037
+ [0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00], // [k] (107)
1038
+ [0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00], // [l] (108)
1039
+ [0x00, 0x00, 0xcc, 0xfe, 0xfe, 0xd6, 0xc6, 0x00], // [m] (109)
1040
+ [0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, 0x00], // [n] (110)
1041
+ [0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00], // [o] (111)
1042
+ [0x00, 0x00, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0], // [p] (112)
1043
+ [0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e], // [q] (113)
1044
+ [0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0xf0, 0x00], // [r] (114)
1045
+ [0x00, 0x00, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x00], // [s] (115)
1046
+ [0x10, 0x30, 0x7c, 0x30, 0x30, 0x34, 0x18, 0x00], // [t] (116)
1047
+ [0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00], // [u] (117)
1048
+ [0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00], // [v] (118)
1049
+ [0x00, 0x00, 0xc6, 0xd6, 0xfe, 0xfe, 0x6c, 0x00], // [w] (119)
1050
+ [0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00], // [x] (120)
1051
+ [0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8], // [y] (121)
1052
+ [0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00], // [z] (122)
1053
+ [0x1c, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x1c, 0x00], // [{] (123)
1054
+ [0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00], // [|] (124)
1055
+ [0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00], // [}] (125)
1056
+ [0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], // [~] (126)
1057
+ [0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00], // [⌂] (127)
1058
+ [0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x18, 0x0c, 0x78], // [Ç] (128)
1059
+ [0x00, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00], // [ü] (129)
1060
+ [0x1c, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00], // [é] (130)
1061
+ [0x7e, 0xc3, 0x3c, 0x06, 0x3e, 0x66, 0x3f, 0x00], // [â] (131)
1062
+ [0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00], // [ä] (132)
1063
+ [0xe0, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00], // [à] (133)
1064
+ [0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00], // [å] (134)
1065
+ [0x00, 0x00, 0x78, 0xc0, 0xc0, 0x78, 0x0c, 0x38], // [ç] (135)
1066
+ [0x7e, 0xc3, 0x3c, 0x66, 0x7e, 0x60, 0x3c, 0x00], // [ê] (136)
1067
+ [0xcc, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00], // [ë] (137)
1068
+ [0xe0, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00], // [è] (138)
1069
+ [0xcc, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00], // [ï] (139)
1070
+ [0x7c, 0xc6, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00], // [î] (140)
1071
+ [0xe0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00], // [ì] (141)
1072
+ [0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00], // [Ä] (142)
1073
+ [0x30, 0x30, 0x00, 0x78, 0xcc, 0xfc, 0xcc, 0x00], // [Å] (143)
1074
+ [0x1c, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00], // [É] (144)
1075
+ [0x00, 0x00, 0x7f, 0x0c, 0x7f, 0xcc, 0x7f, 0x00], // [æ] (145)
1076
+ [0x3e, 0x6c, 0xcc, 0xfe, 0xcc, 0xcc, 0xce, 0x00], // [Æ] (146)
1077
+ [0x78, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00], // [ô] (147)
1078
+ [0x00, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00], // [ö] (148)
1079
+ [0x00, 0xe0, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00], // [ò] (149)
1080
+ [0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00], // [û] (150)
1081
+ [0x00, 0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00], // [ù] (151)
1082
+ [0x00, 0xcc, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8], // [ÿ] (152)
1083
+ [0xc3, 0x18, 0x3c, 0x66, 0x66, 0x3c, 0x18, 0x00], // [Ö] (153)
1084
+ [0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00], // [Ü] (154)
1085
+ [0x18, 0x18, 0x7e, 0xc0, 0xc0, 0x7e, 0x18, 0x18], // [¢] (155)
1086
+ [0x38, 0x6c, 0x64, 0xf0, 0x60, 0xe6, 0xfc, 0x00], // [£] (156)
1087
+ [0xcc, 0xcc, 0x78, 0xfc, 0x30, 0xfc, 0x30, 0x30], // [¥] (157)
1088
+ [0xf8, 0xcc, 0xcc, 0xfa, 0xc6, 0xcf, 0xc6, 0xc7], // [₧] (158)
1089
+ [0x0e, 0x1b, 0x18, 0x3c, 0x18, 0x18, 0xd8, 0x70], // [ƒ] (159)
1090
+ [0x1c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00], // [á] (160)
1091
+ [0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00], // [í] (161)
1092
+ [0x00, 0x1c, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00], // [ó] (162)
1093
+ [0x00, 0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00], // [ú] (163)
1094
+ [0x00, 0xf8, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0x00], // [ñ] (164)
1095
+ [0xfc, 0x00, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x00], // [Ñ] (165)
1096
+ [0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00], // [ª] (166)
1097
+ [0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00], // [º] (167)
1098
+ [0x30, 0x00, 0x30, 0x60, 0xc0, 0xcc, 0x78, 0x00], // [¿] (168)
1099
+ [0x00, 0x00, 0x00, 0xfc, 0xc0, 0xc0, 0x00, 0x00], // [⌐] (169)
1100
+ [0x00, 0x00, 0x00, 0xfc, 0x0c, 0x0c, 0x00, 0x00], // [¬] (170)
1101
+ [0xc3, 0xc6, 0xcc, 0xde, 0x33, 0x66, 0xcc, 0x0f], // [½] (171)
1102
+ [0xc3, 0xc6, 0xcc, 0xdb, 0x37, 0x6f, 0xcf, 0x03], // [¼] (172)
1103
+ [0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00], // [¡] (173)
1104
+ [0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00], // [«] (174)
1105
+ [0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00], // [»] (175)
1106
+ [0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88], // [░] (176)
1107
+ [0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa], // [▒] (177)
1108
+ [0xdb, 0x77, 0xdb, 0xee, 0xdb, 0x77, 0xdb, 0xee], // [▓] (178)
1109
+ [0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18], // [│] (179)
1110
+ [0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18], // [┤] (180)
1111
+ [0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18], // [╡] (181)
1112
+ [0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36], // [╢] (182)
1113
+ [0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36], // [╖] (183)
1114
+ [0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18], // [╕] (184)
1115
+ [0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36], // [╣] (185)
1116
+ [0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36], // [║] (186)
1117
+ [0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36], // [╗] (187)
1118
+ [0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00], // [╝] (188)
1119
+ [0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00], // [╜] (189)
1120
+ [0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00], // [╛] (190)
1121
+ [0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18], // [┐] (191)
1122
+ [0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00], // [└] (192)
1123
+ [0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00], // [┴] (193)
1124
+ [0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18], // [┬] (194)
1125
+ [0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18], // [├] (195)
1126
+ [0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00], // [─] (196)
1127
+ [0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18], // [┼] (197)
1128
+ [0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18], // [╞] (198)
1129
+ [0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36], // [╟] (199)
1130
+ [0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00], // [╚] (200)
1131
+ [0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36], // [╔] (201)
1132
+ [0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00], // [╩] (202)
1133
+ [0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36], // [╦] (203)
1134
+ [0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36], // [╠] (204)
1135
+ [0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00], // [═] (205)
1136
+ [0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36], // [╬] (206)
1137
+ [0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00], // [╧] (207)
1138
+ [0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00], // [╨] (208)
1139
+ [0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18], // [╤] (209)
1140
+ [0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36], // [╥] (210)
1141
+ [0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00], // [╙] (211)
1142
+ [0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00], // [╘] (212)
1143
+ [0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18], // [╒] (213)
1144
+ [0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36], // [╓] (214)
1145
+ [0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36], // [╫] (215)
1146
+ [0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18], // [╪] (216)
1147
+ [0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00], // [┘] (217)
1148
+ [0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18], // [┌] (218)
1149
+ [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], // [█] (219)
1150
+ [0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff], // [▄] (220)
1151
+ [0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0], // [▌] (221)
1152
+ [0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f], // [▐] (222)
1153
+ [0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00], // [▀] (223)
1154
+ [0x00, 0x00, 0x76, 0xdc, 0xc8, 0xdc, 0x76, 0x00], // [α] (224)
1155
+ [0x00, 0x78, 0xcc, 0xf8, 0xcc, 0xf8, 0xc0, 0xc0], // [ß] (225)
1156
+ [0x00, 0xfc, 0xcc, 0xc0, 0xc0, 0xc0, 0xc0, 0x00], // [Γ] (226)
1157
+ [0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00], // [π] (227)
1158
+ [0xfc, 0xcc, 0x60, 0x30, 0x60, 0xcc, 0xfc, 0x00], // [Σ] (228)
1159
+ [0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0x70, 0x00], // [σ] (229)
1160
+ [0x00, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0xc0], // [µ] (230)
1161
+ [0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x00], // [τ] (231)
1162
+ [0xfc, 0x30, 0x78, 0xcc, 0xcc, 0x78, 0x30, 0xfc], // [Φ] (232)
1163
+ [0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x6c, 0x38, 0x00], // [Θ] (233)
1164
+ [0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x6c, 0xee, 0x00], // [Ω] (234)
1165
+ [0x1c, 0x30, 0x18, 0x7c, 0xcc, 0xcc, 0x78, 0x00], // [δ] (235)
1166
+ [0x00, 0x00, 0x7e, 0xdb, 0xdb, 0x7e, 0x00, 0x00], // [∞] (236)
1167
+ [0x06, 0x0c, 0x7e, 0xdb, 0xdb, 0x7e, 0x60, 0xc0], // [φ] (237)
1168
+ [0x38, 0x60, 0xc0, 0xf8, 0xc0, 0x60, 0x38, 0x00], // [ε] (238)
1169
+ [0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00], // [∩] (239)
1170
+ [0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00], // [≡] (240)
1171
+ [0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0xfc, 0x00], // [±] (241)
1172
+ [0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xfc, 0x00], // [≥] (242)
1173
+ [0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xfc, 0x00], // [≤] (243)
1174
+ [0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18], // [⌠] (244)
1175
+ [0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0x70], // [⌡] (245)
1176
+ [0x30, 0x30, 0x00, 0xfc, 0x00, 0x30, 0x30, 0x00], // [÷] (246)
1177
+ [0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00], // [≈] (247)
1178
+ [0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00], // [°] (248)
1179
+ [0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00], // [∙] (249)
1180
+ [0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00], // [·] (250)
1181
+ [0x0f, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c, 0x1c], // [√] (251)
1182
+ [0x78, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00], // [ⁿ] (252)
1183
+ [0x70, 0x18, 0x30, 0x60, 0x78, 0x00, 0x00, 0x00], // [²] (253)
1184
+ [0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00], // [■] (254)
1185
+ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], // [ ] (255)
1186
+ ]
1187
+
1188
+ }