vtac-terminal 1.1.0 → 1.2.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.
- package/README.md +49 -29
- package/demo/README.md +61 -0
- package/dist/VTAC/VTAC.js +10 -531
- package/dist/VTAC/VTAC.js.map +1 -1
- package/dist/index.js +241 -33
- package/dist/index.js.map +1 -1
- package/examples/README.md +17 -2
- package/jest.config.cjs +9 -0
- package/package.json +8 -2
- package/src/VTAC/VTAC.test.ts +531 -0
- package/src/VTAC/VTAC.ts +11 -567
- package/src/index.ts +280 -32
- package/docs/VT-AC.numbers +0 -0
- package/docs/VT-AC.pdf +0 -0
package/dist/VTAC/VTAC.js
CHANGED
|
@@ -1,19 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.VTAC = void 0;
|
|
7
|
-
const sdl_1 = __importDefault(require("@kmamal/sdl"));
|
|
8
|
-
const serialport_1 = require("serialport");
|
|
9
4
|
class VTAC {
|
|
10
5
|
constructor() {
|
|
11
|
-
this.baudRate = 9600;
|
|
12
|
-
this.parity = 'none';
|
|
13
|
-
this.dataBits = 8;
|
|
14
|
-
this.stopBits = 1;
|
|
15
|
-
this.scale = 2;
|
|
16
|
-
this.fullscreen = false;
|
|
17
6
|
this.buffer = Buffer.alloc(VTAC.WIDTH * VTAC.HEIGHT).fill(0x00);
|
|
18
7
|
this.mode = 'text';
|
|
19
8
|
this.column = 0;
|
|
@@ -24,107 +13,16 @@ class VTAC {
|
|
|
24
13
|
this.cursorChar = 0x00; // OFF
|
|
25
14
|
this.cursorMode = 'solid';
|
|
26
15
|
this.cursorCharNextByte = false;
|
|
27
|
-
this.cursorBlinkTime = 0;
|
|
28
|
-
this.cursorVisible = true;
|
|
29
|
-
this.cursorBlinkInterval = 500; // Blink every 500ms (twice per second)
|
|
30
16
|
this.bellDuration = 0x3C; // Duration in jiffies (1/60th of a second) (Default: 1 second)
|
|
31
17
|
this.bellFrequency = 0x3D; // Frequency value (Default: C6)
|
|
32
18
|
this.bellDurationNextByte = false;
|
|
33
19
|
this.bellFrequencyNextByte = false;
|
|
34
20
|
this.bellQueue = [];
|
|
35
|
-
this.isBellPlaying = false;
|
|
36
|
-
this.bellAudioDevice = undefined;
|
|
37
21
|
this.dataNextByte = false;
|
|
38
22
|
this.foregroundColor = 0xFF; // White
|
|
39
23
|
this.backgroundColor = 0x00; // Black
|
|
40
24
|
this.foregroundColorNextByte = false;
|
|
41
25
|
this.backgroundColorNextByte = false;
|
|
42
|
-
this.lastRenderTime = 0;
|
|
43
|
-
this.targetFrameTime = 1000 / 60; // 60fps = ~16.67ms per frame
|
|
44
|
-
//
|
|
45
|
-
// MAIN
|
|
46
|
-
//
|
|
47
|
-
this.begin = () => {
|
|
48
|
-
if (this.path) {
|
|
49
|
-
this.port = new serialport_1.SerialPort({
|
|
50
|
-
path: this.path,
|
|
51
|
-
baudRate: this.baudRate,
|
|
52
|
-
parity: this.parity,
|
|
53
|
-
dataBits: this.dataBits,
|
|
54
|
-
stopBits: this.stopBits
|
|
55
|
-
}, (err) => {
|
|
56
|
-
if (err) {
|
|
57
|
-
console.log('Error: ', err.message);
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
this.port.on('data', this.receive);
|
|
61
|
-
}
|
|
62
|
-
this.window = sdl_1.default.video.createWindow({
|
|
63
|
-
title: "VT-AC",
|
|
64
|
-
width: VTAC.WIDTH * this.scale,
|
|
65
|
-
height: VTAC.HEIGHT * this.scale,
|
|
66
|
-
fullscreen: this.fullscreen,
|
|
67
|
-
resizable: false
|
|
68
|
-
});
|
|
69
|
-
this.window.on('keyDown', this.onKey);
|
|
70
|
-
this.window.on('textInput', this.onText);
|
|
71
|
-
this.window.on('close', (event) => {
|
|
72
|
-
if (this.port && this.port.isOpen) {
|
|
73
|
-
this.port.close();
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
// Start the render loop
|
|
77
|
-
this.render();
|
|
78
|
-
};
|
|
79
|
-
this.render = () => {
|
|
80
|
-
if (!this.window) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
if (this.window.destroyed) {
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
const now = Date.now();
|
|
87
|
-
const elapsed = now - this.lastRenderTime;
|
|
88
|
-
// Update cursor blink state
|
|
89
|
-
if (this.cursorMode === 'blinking') {
|
|
90
|
-
this.cursorBlinkTime += elapsed;
|
|
91
|
-
if (this.cursorBlinkTime >= this.cursorBlinkInterval) {
|
|
92
|
-
this.cursorVisible = !this.cursorVisible;
|
|
93
|
-
this.cursorBlinkTime = 0;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
this.cursorVisible = true;
|
|
98
|
-
}
|
|
99
|
-
// Create temporary render buffer
|
|
100
|
-
const renderBuffer = Buffer.from(this.buffer);
|
|
101
|
-
// Draw cursor if visible and cursorChar is not 0x00 (OFF)
|
|
102
|
-
if (this.cursorVisible && this.cursorChar !== 0x00) {
|
|
103
|
-
this.drawCursor(renderBuffer);
|
|
104
|
-
}
|
|
105
|
-
this.window.render(VTAC.WIDTH, VTAC.HEIGHT, VTAC.WIDTH, 'rgb332', renderBuffer);
|
|
106
|
-
this.lastRenderTime = now;
|
|
107
|
-
// Calculate delay to maintain target frame rate
|
|
108
|
-
const renderTime = Date.now() - now;
|
|
109
|
-
const delay = Math.max(0, this.targetFrameTime - renderTime);
|
|
110
|
-
setTimeout(this.render, delay);
|
|
111
|
-
};
|
|
112
|
-
this.drawCursor = (renderBuffer) => {
|
|
113
|
-
const character = VTAC.CHARACTERS[this.cursorChar];
|
|
114
|
-
const startRow = this.row * 8;
|
|
115
|
-
const startColumn = this.column * 8;
|
|
116
|
-
// Draw cursor character with inverted colors
|
|
117
|
-
for (let y = 0; y < 8; y++) {
|
|
118
|
-
const rowByte = character[y];
|
|
119
|
-
const bufferRowStart = (startRow + y) * VTAC.WIDTH;
|
|
120
|
-
for (let x = 0; x < 8; x++) {
|
|
121
|
-
const bit = (rowByte >> (7 - x)) & 1;
|
|
122
|
-
// Invert the colors: if bit is 1, use background; if 0, use foreground
|
|
123
|
-
const color = bit ? this.backgroundColor : this.foregroundColor;
|
|
124
|
-
renderBuffer[bufferRowStart + startColumn + x] = color;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
26
|
//
|
|
129
27
|
// METHODS
|
|
130
28
|
//
|
|
@@ -139,14 +37,6 @@ class VTAC {
|
|
|
139
37
|
this.foregroundColor = 0xFF;
|
|
140
38
|
this.bellDuration = 0x3C;
|
|
141
39
|
this.bellFrequency = 0x3D;
|
|
142
|
-
this.bellQueue = [];
|
|
143
|
-
this.isBellPlaying = false;
|
|
144
|
-
// Close audio device if open
|
|
145
|
-
if (this.bellAudioDevice) {
|
|
146
|
-
this.bellAudioDevice.clearQueue();
|
|
147
|
-
this.bellAudioDevice.close();
|
|
148
|
-
this.bellAudioDevice = undefined;
|
|
149
|
-
}
|
|
150
40
|
this.columnNextByte = false;
|
|
151
41
|
this.rowNextByte = false;
|
|
152
42
|
this.cursorCharNextByte = false;
|
|
@@ -154,6 +44,7 @@ class VTAC {
|
|
|
154
44
|
this.backgroundColorNextByte = false;
|
|
155
45
|
this.bellDurationNextByte = false;
|
|
156
46
|
this.bellFrequencyNextByte = false;
|
|
47
|
+
this.bellQueue = [];
|
|
157
48
|
this.buffer.fill(0x00);
|
|
158
49
|
};
|
|
159
50
|
this.bell = () => {
|
|
@@ -164,80 +55,14 @@ class VTAC {
|
|
|
164
55
|
return;
|
|
165
56
|
}
|
|
166
57
|
// Add bell request to queue
|
|
167
|
-
this.bellQueue.push({
|
|
168
|
-
frequency: frequency,
|
|
169
|
-
duration: this.bellDuration
|
|
170
|
-
});
|
|
171
|
-
// Start processing queue if not already playing
|
|
172
|
-
if (!this.isBellPlaying) {
|
|
173
|
-
this.processBellQueue();
|
|
174
|
-
}
|
|
58
|
+
this.bellQueue.push({ frequency, duration: this.bellDuration });
|
|
175
59
|
};
|
|
176
|
-
this.
|
|
177
|
-
//
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
this.bellAudioDevice.pause();
|
|
183
|
-
this.bellAudioDevice.close();
|
|
184
|
-
this.bellAudioDevice = undefined;
|
|
185
|
-
}
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
// Mark as playing
|
|
189
|
-
this.isBellPlaying = true;
|
|
190
|
-
// Open audio device if not already open
|
|
191
|
-
if (!this.bellAudioDevice) {
|
|
192
|
-
const sampleRate = 44100;
|
|
193
|
-
this.bellAudioDevice = sdl_1.default.audio.openDevice({ type: 'playback' }, {
|
|
194
|
-
channels: 1,
|
|
195
|
-
frequency: sampleRate,
|
|
196
|
-
format: 'f32',
|
|
197
|
-
buffered: 4096 // Buffer size must be power of 2
|
|
198
|
-
});
|
|
199
|
-
if (!this.bellAudioDevice) {
|
|
200
|
-
// Fallback to console beep if audio device cannot be opened
|
|
201
|
-
process.stdout.write('\u0007');
|
|
202
|
-
// Clear queue and stop
|
|
203
|
-
this.bellQueue = [];
|
|
204
|
-
this.isBellPlaying = false;
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
// Start playback
|
|
208
|
-
this.bellAudioDevice.play();
|
|
209
|
-
}
|
|
210
|
-
// Get next bell request from queue
|
|
211
|
-
const bellRequest = this.bellQueue.shift();
|
|
212
|
-
if (!bellRequest) {
|
|
213
|
-
this.processBellQueue(); // Check if queue is empty
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
const { frequency, duration } = bellRequest;
|
|
217
|
-
// Convert jiffies (1/60th of a second) to milliseconds
|
|
218
|
-
const durationMs = (duration / 60) * 1000;
|
|
219
|
-
// Generate sine wave samples
|
|
220
|
-
const sampleRate = 44100;
|
|
221
|
-
const numSamples = Math.floor((durationMs / 1000) * sampleRate);
|
|
222
|
-
const samples = new Float32Array(numSamples);
|
|
223
|
-
for (let i = 0; i < numSamples; i++) {
|
|
224
|
-
// Generate sine wave: amplitude * sin(2π * frequency * time)
|
|
225
|
-
const time = i / sampleRate;
|
|
226
|
-
const amplitude = 0.2; // Keep volume at 20% to avoid distortion
|
|
227
|
-
samples[i] = amplitude * Math.sin(2 * Math.PI * frequency * time);
|
|
228
|
-
// Apply fade out in the last 10% to avoid clicks
|
|
229
|
-
const fadeStartSample = numSamples * 0.9;
|
|
230
|
-
if (i > fadeStartSample) {
|
|
231
|
-
const fadeProgress = (i - fadeStartSample) / (numSamples - fadeStartSample);
|
|
232
|
-
samples[i] *= (1 - fadeProgress);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
// Enqueue the audio samples
|
|
236
|
-
this.bellAudioDevice.enqueue(Buffer.from(samples.buffer));
|
|
237
|
-
// Process next bell in queue after this one finishes
|
|
238
|
-
setTimeout(() => {
|
|
239
|
-
this.processBellQueue();
|
|
240
|
-
}, durationMs);
|
|
60
|
+
this.getNextBell = () => {
|
|
61
|
+
// Remove and return the first bell from queue
|
|
62
|
+
return this.bellQueue.shift();
|
|
63
|
+
};
|
|
64
|
+
this.hasQueuedBells = () => {
|
|
65
|
+
return this.bellQueue.length > 0;
|
|
241
66
|
};
|
|
242
67
|
this.backspace = () => {
|
|
243
68
|
if (this.column > 0) {
|
|
@@ -376,15 +201,7 @@ class VTAC {
|
|
|
376
201
|
this.offset = 0;
|
|
377
202
|
};
|
|
378
203
|
this.delete = () => {
|
|
379
|
-
|
|
380
|
-
const startColumn = this.column * 8;
|
|
381
|
-
// Clear 8x8 pixel block with background color
|
|
382
|
-
for (let y = 0; y < 8; y++) {
|
|
383
|
-
const bufferRowStart = (startRow + y) * VTAC.WIDTH;
|
|
384
|
-
for (let x = 0; x < 8; x++) {
|
|
385
|
-
this.buffer[bufferRowStart + startColumn + x] = this.backgroundColor;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
204
|
+
this.clearCharacterCell(this.column, this.row);
|
|
388
205
|
};
|
|
389
206
|
this.data = (data) => {
|
|
390
207
|
switch (this.mode) {
|
|
@@ -420,6 +237,7 @@ class VTAC {
|
|
|
420
237
|
this.row++;
|
|
421
238
|
if (this.row >= VTAC.ROWS) {
|
|
422
239
|
this.row = VTAC.ROWS - 1;
|
|
240
|
+
this.scroll('up');
|
|
423
241
|
}
|
|
424
242
|
}
|
|
425
243
|
this.offset = 0;
|
|
@@ -636,345 +454,6 @@ class VTAC {
|
|
|
636
454
|
break;
|
|
637
455
|
}
|
|
638
456
|
};
|
|
639
|
-
this.transmit = (data) => {
|
|
640
|
-
var _a;
|
|
641
|
-
(_a = this.port) === null || _a === void 0 ? void 0 : _a.write([data], 'hex', (err) => {
|
|
642
|
-
if (err) {
|
|
643
|
-
console.log('Error: ', err.message);
|
|
644
|
-
}
|
|
645
|
-
});
|
|
646
|
-
};
|
|
647
|
-
this.receive = (data) => {
|
|
648
|
-
for (let i = 0; i < data.length; i++) {
|
|
649
|
-
this.parse(data[i]);
|
|
650
|
-
}
|
|
651
|
-
};
|
|
652
|
-
this.onKey = (event) => {
|
|
653
|
-
switch (event.key) {
|
|
654
|
-
case 'backspace':
|
|
655
|
-
this.transmit(0x08);
|
|
656
|
-
break;
|
|
657
|
-
case 'tab':
|
|
658
|
-
this.transmit(0x09);
|
|
659
|
-
break;
|
|
660
|
-
case 'enter':
|
|
661
|
-
case 'return':
|
|
662
|
-
this.transmit(0x0D);
|
|
663
|
-
this.transmit(0x0A);
|
|
664
|
-
break;
|
|
665
|
-
case 'escape':
|
|
666
|
-
this.transmit(0x1B);
|
|
667
|
-
break;
|
|
668
|
-
case 'left':
|
|
669
|
-
this.transmit(0x1C);
|
|
670
|
-
break;
|
|
671
|
-
case 'right':
|
|
672
|
-
this.transmit(0x1D);
|
|
673
|
-
break;
|
|
674
|
-
case 'up':
|
|
675
|
-
this.transmit(0x1E);
|
|
676
|
-
break;
|
|
677
|
-
case 'down':
|
|
678
|
-
this.transmit(0x1F);
|
|
679
|
-
break;
|
|
680
|
-
case 'delete':
|
|
681
|
-
this.transmit(0x7F);
|
|
682
|
-
break;
|
|
683
|
-
default:
|
|
684
|
-
break;
|
|
685
|
-
}
|
|
686
|
-
};
|
|
687
|
-
this.onText = (event) => {
|
|
688
|
-
switch (event.text) {
|
|
689
|
-
case ' ':
|
|
690
|
-
this.transmit(0x20);
|
|
691
|
-
break;
|
|
692
|
-
case '!':
|
|
693
|
-
this.transmit(0x21);
|
|
694
|
-
break;
|
|
695
|
-
case '"':
|
|
696
|
-
this.transmit(0x22);
|
|
697
|
-
break;
|
|
698
|
-
case '#':
|
|
699
|
-
this.transmit(0x23);
|
|
700
|
-
break;
|
|
701
|
-
case '$':
|
|
702
|
-
this.transmit(0x24);
|
|
703
|
-
break;
|
|
704
|
-
case '%':
|
|
705
|
-
this.transmit(0x25);
|
|
706
|
-
break;
|
|
707
|
-
case '&':
|
|
708
|
-
this.transmit(0x26);
|
|
709
|
-
break;
|
|
710
|
-
case '\'':
|
|
711
|
-
this.transmit(0x27);
|
|
712
|
-
break;
|
|
713
|
-
case '(':
|
|
714
|
-
this.transmit(0x28);
|
|
715
|
-
break;
|
|
716
|
-
case ')':
|
|
717
|
-
this.transmit(0x29);
|
|
718
|
-
break;
|
|
719
|
-
case '*':
|
|
720
|
-
this.transmit(0x2A);
|
|
721
|
-
break;
|
|
722
|
-
case '+':
|
|
723
|
-
this.transmit(0x2B);
|
|
724
|
-
break;
|
|
725
|
-
case ',':
|
|
726
|
-
this.transmit(0x2C);
|
|
727
|
-
break;
|
|
728
|
-
case '-':
|
|
729
|
-
this.transmit(0x2D);
|
|
730
|
-
break;
|
|
731
|
-
case '.':
|
|
732
|
-
this.transmit(0x2E);
|
|
733
|
-
break;
|
|
734
|
-
case '/':
|
|
735
|
-
this.transmit(0x2F);
|
|
736
|
-
break;
|
|
737
|
-
case '0':
|
|
738
|
-
this.transmit(0x30);
|
|
739
|
-
break;
|
|
740
|
-
case '1':
|
|
741
|
-
this.transmit(0x31);
|
|
742
|
-
break;
|
|
743
|
-
case '2':
|
|
744
|
-
this.transmit(0x32);
|
|
745
|
-
break;
|
|
746
|
-
case '3':
|
|
747
|
-
this.transmit(0x33);
|
|
748
|
-
break;
|
|
749
|
-
case '4':
|
|
750
|
-
this.transmit(0x34);
|
|
751
|
-
break;
|
|
752
|
-
case '5':
|
|
753
|
-
this.transmit(0x35);
|
|
754
|
-
break;
|
|
755
|
-
case '6':
|
|
756
|
-
this.transmit(0x36);
|
|
757
|
-
break;
|
|
758
|
-
case '7':
|
|
759
|
-
this.transmit(0x37);
|
|
760
|
-
break;
|
|
761
|
-
case '8':
|
|
762
|
-
this.transmit(0x38);
|
|
763
|
-
break;
|
|
764
|
-
case '9':
|
|
765
|
-
this.transmit(0x39);
|
|
766
|
-
break;
|
|
767
|
-
case ':':
|
|
768
|
-
this.transmit(0x3A);
|
|
769
|
-
break;
|
|
770
|
-
case ';':
|
|
771
|
-
this.transmit(0x3B);
|
|
772
|
-
break;
|
|
773
|
-
case '<':
|
|
774
|
-
this.transmit(0x3C);
|
|
775
|
-
break;
|
|
776
|
-
case '=':
|
|
777
|
-
this.transmit(0x3D);
|
|
778
|
-
break;
|
|
779
|
-
case '>':
|
|
780
|
-
this.transmit(0x3E);
|
|
781
|
-
break;
|
|
782
|
-
case '?':
|
|
783
|
-
this.transmit(0x3F);
|
|
784
|
-
break;
|
|
785
|
-
case '@':
|
|
786
|
-
this.transmit(0x40);
|
|
787
|
-
break;
|
|
788
|
-
case 'A':
|
|
789
|
-
this.transmit(0x41);
|
|
790
|
-
break;
|
|
791
|
-
case 'B':
|
|
792
|
-
this.transmit(0x42);
|
|
793
|
-
break;
|
|
794
|
-
case 'C':
|
|
795
|
-
this.transmit(0x43);
|
|
796
|
-
break;
|
|
797
|
-
case 'D':
|
|
798
|
-
this.transmit(0x44);
|
|
799
|
-
break;
|
|
800
|
-
case 'E':
|
|
801
|
-
this.transmit(0x45);
|
|
802
|
-
break;
|
|
803
|
-
case 'F':
|
|
804
|
-
this.transmit(0x46);
|
|
805
|
-
break;
|
|
806
|
-
case 'G':
|
|
807
|
-
this.transmit(0x47);
|
|
808
|
-
break;
|
|
809
|
-
case 'H':
|
|
810
|
-
this.transmit(0x48);
|
|
811
|
-
break;
|
|
812
|
-
case 'I':
|
|
813
|
-
this.transmit(0x49);
|
|
814
|
-
break;
|
|
815
|
-
case 'J':
|
|
816
|
-
this.transmit(0x4A);
|
|
817
|
-
break;
|
|
818
|
-
case 'K':
|
|
819
|
-
this.transmit(0x4B);
|
|
820
|
-
break;
|
|
821
|
-
case 'L':
|
|
822
|
-
this.transmit(0x4C);
|
|
823
|
-
break;
|
|
824
|
-
case 'M':
|
|
825
|
-
this.transmit(0x4D);
|
|
826
|
-
break;
|
|
827
|
-
case 'N':
|
|
828
|
-
this.transmit(0x4E);
|
|
829
|
-
break;
|
|
830
|
-
case 'O':
|
|
831
|
-
this.transmit(0x4F);
|
|
832
|
-
break;
|
|
833
|
-
case 'P':
|
|
834
|
-
this.transmit(0x50);
|
|
835
|
-
break;
|
|
836
|
-
case 'Q':
|
|
837
|
-
this.transmit(0x51);
|
|
838
|
-
break;
|
|
839
|
-
case 'R':
|
|
840
|
-
this.transmit(0x52);
|
|
841
|
-
break;
|
|
842
|
-
case 'S':
|
|
843
|
-
this.transmit(0x53);
|
|
844
|
-
break;
|
|
845
|
-
case 'T':
|
|
846
|
-
this.transmit(0x54);
|
|
847
|
-
break;
|
|
848
|
-
case 'U':
|
|
849
|
-
this.transmit(0x55);
|
|
850
|
-
break;
|
|
851
|
-
case 'V':
|
|
852
|
-
this.transmit(0x56);
|
|
853
|
-
break;
|
|
854
|
-
case 'W':
|
|
855
|
-
this.transmit(0x57);
|
|
856
|
-
break;
|
|
857
|
-
case 'X':
|
|
858
|
-
this.transmit(0x58);
|
|
859
|
-
break;
|
|
860
|
-
case 'Y':
|
|
861
|
-
this.transmit(0x59);
|
|
862
|
-
break;
|
|
863
|
-
case 'Z':
|
|
864
|
-
this.transmit(0x5A);
|
|
865
|
-
break;
|
|
866
|
-
case '[':
|
|
867
|
-
this.transmit(0x5B);
|
|
868
|
-
break;
|
|
869
|
-
case '\\':
|
|
870
|
-
this.transmit(0x5C);
|
|
871
|
-
break;
|
|
872
|
-
case ']':
|
|
873
|
-
this.transmit(0x5D);
|
|
874
|
-
break;
|
|
875
|
-
case '^':
|
|
876
|
-
this.transmit(0x5E);
|
|
877
|
-
break;
|
|
878
|
-
case '_':
|
|
879
|
-
this.transmit(0x5F);
|
|
880
|
-
break;
|
|
881
|
-
case '`':
|
|
882
|
-
this.transmit(0x60);
|
|
883
|
-
break;
|
|
884
|
-
case 'a':
|
|
885
|
-
this.transmit(0x61);
|
|
886
|
-
break;
|
|
887
|
-
case 'b':
|
|
888
|
-
this.transmit(0x62);
|
|
889
|
-
break;
|
|
890
|
-
case 'c':
|
|
891
|
-
this.transmit(0x63);
|
|
892
|
-
break;
|
|
893
|
-
case 'd':
|
|
894
|
-
this.transmit(0x64);
|
|
895
|
-
break;
|
|
896
|
-
case 'e':
|
|
897
|
-
this.transmit(0x65);
|
|
898
|
-
break;
|
|
899
|
-
case 'f':
|
|
900
|
-
this.transmit(0x66);
|
|
901
|
-
break;
|
|
902
|
-
case 'g':
|
|
903
|
-
this.transmit(0x67);
|
|
904
|
-
break;
|
|
905
|
-
case 'h':
|
|
906
|
-
this.transmit(0x68);
|
|
907
|
-
break;
|
|
908
|
-
case 'i':
|
|
909
|
-
this.transmit(0x69);
|
|
910
|
-
break;
|
|
911
|
-
case 'j':
|
|
912
|
-
this.transmit(0x6A);
|
|
913
|
-
break;
|
|
914
|
-
case 'k':
|
|
915
|
-
this.transmit(0x6B);
|
|
916
|
-
break;
|
|
917
|
-
case 'l':
|
|
918
|
-
this.transmit(0x6C);
|
|
919
|
-
break;
|
|
920
|
-
case 'm':
|
|
921
|
-
this.transmit(0x6D);
|
|
922
|
-
break;
|
|
923
|
-
case 'n':
|
|
924
|
-
this.transmit(0x6E);
|
|
925
|
-
break;
|
|
926
|
-
case 'o':
|
|
927
|
-
this.transmit(0x6F);
|
|
928
|
-
break;
|
|
929
|
-
case 'p':
|
|
930
|
-
this.transmit(0x70);
|
|
931
|
-
break;
|
|
932
|
-
case 'q':
|
|
933
|
-
this.transmit(0x71);
|
|
934
|
-
break;
|
|
935
|
-
case 'r':
|
|
936
|
-
this.transmit(0x72);
|
|
937
|
-
break;
|
|
938
|
-
case 's':
|
|
939
|
-
this.transmit(0x73);
|
|
940
|
-
break;
|
|
941
|
-
case 't':
|
|
942
|
-
this.transmit(0x74);
|
|
943
|
-
break;
|
|
944
|
-
case 'u':
|
|
945
|
-
this.transmit(0x75);
|
|
946
|
-
break;
|
|
947
|
-
case 'v':
|
|
948
|
-
this.transmit(0x76);
|
|
949
|
-
break;
|
|
950
|
-
case 'w':
|
|
951
|
-
this.transmit(0x77);
|
|
952
|
-
break;
|
|
953
|
-
case 'x':
|
|
954
|
-
this.transmit(0x78);
|
|
955
|
-
break;
|
|
956
|
-
case 'y':
|
|
957
|
-
this.transmit(0x79);
|
|
958
|
-
break;
|
|
959
|
-
case 'z':
|
|
960
|
-
this.transmit(0x7A);
|
|
961
|
-
break;
|
|
962
|
-
case '{':
|
|
963
|
-
this.transmit(0x7B);
|
|
964
|
-
break;
|
|
965
|
-
case '|':
|
|
966
|
-
this.transmit(0x7C);
|
|
967
|
-
break;
|
|
968
|
-
case '}':
|
|
969
|
-
this.transmit(0x7D);
|
|
970
|
-
break;
|
|
971
|
-
case '~':
|
|
972
|
-
this.transmit(0x7E);
|
|
973
|
-
break;
|
|
974
|
-
default:
|
|
975
|
-
break;
|
|
976
|
-
}
|
|
977
|
-
};
|
|
978
457
|
}
|
|
979
458
|
}
|
|
980
459
|
exports.VTAC = VTAC;
|