ac6502 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.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/dist/components/CPU.js +1170 -0
  4. package/dist/components/CPU.js.map +1 -0
  5. package/dist/components/Cart.js +23 -0
  6. package/dist/components/Cart.js.map +1 -0
  7. package/dist/components/IO/Empty.js +19 -0
  8. package/dist/components/IO/Empty.js.map +1 -0
  9. package/dist/components/IO/GPIOAttachments/GPIOAttachment.js +71 -0
  10. package/dist/components/IO/GPIOAttachments/GPIOAttachment.js.map +1 -0
  11. package/dist/components/IO/GPIOAttachments/GPIOJoystickAttachment.js +90 -0
  12. package/dist/components/IO/GPIOAttachments/GPIOJoystickAttachment.js.map +1 -0
  13. package/dist/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.js +489 -0
  14. package/dist/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.js.map +1 -0
  15. package/dist/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.js +274 -0
  16. package/dist/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.js.map +1 -0
  17. package/dist/components/IO/GPIOCard.js +597 -0
  18. package/dist/components/IO/GPIOCard.js.map +1 -0
  19. package/dist/components/IO/InputBoard.js +19 -0
  20. package/dist/components/IO/InputBoard.js.map +1 -0
  21. package/dist/components/IO/LCDCard.js +19 -0
  22. package/dist/components/IO/LCDCard.js.map +1 -0
  23. package/dist/components/IO/RAMCard.js +63 -0
  24. package/dist/components/IO/RAMCard.js.map +1 -0
  25. package/dist/components/IO/RTCCard.js +483 -0
  26. package/dist/components/IO/RTCCard.js.map +1 -0
  27. package/dist/components/IO/SerialCard.js +282 -0
  28. package/dist/components/IO/SerialCard.js.map +1 -0
  29. package/dist/components/IO/SoundCard.js +620 -0
  30. package/dist/components/IO/SoundCard.js.map +1 -0
  31. package/dist/components/IO/StorageCard.js +428 -0
  32. package/dist/components/IO/StorageCard.js.map +1 -0
  33. package/dist/components/IO/VGACard.js +9 -0
  34. package/dist/components/IO/VGACard.js.map +1 -0
  35. package/dist/components/IO/VideoCard.js +623 -0
  36. package/dist/components/IO/VideoCard.js.map +1 -0
  37. package/dist/components/IO.js +3 -0
  38. package/dist/components/IO.js.map +1 -0
  39. package/dist/components/Machine.js +310 -0
  40. package/dist/components/Machine.js.map +1 -0
  41. package/dist/components/RAM.js +24 -0
  42. package/dist/components/RAM.js.map +1 -0
  43. package/dist/components/ROM.js +23 -0
  44. package/dist/components/ROM.js.map +1 -0
  45. package/dist/index.js +441 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/tests/CPU.test.js +1626 -0
  48. package/dist/tests/CPU.test.js.map +1 -0
  49. package/dist/tests/Cart.test.js +119 -0
  50. package/dist/tests/Cart.test.js.map +1 -0
  51. package/dist/tests/IO/GPIOAttachments/GPIOAttachment.test.js +339 -0
  52. package/dist/tests/IO/GPIOAttachments/GPIOAttachment.test.js.map +1 -0
  53. package/dist/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.js +126 -0
  54. package/dist/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.js.map +1 -0
  55. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.js +779 -0
  56. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.js.map +1 -0
  57. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.js +355 -0
  58. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.js.map +1 -0
  59. package/dist/tests/IO/GPIOCard.test.js +503 -0
  60. package/dist/tests/IO/GPIOCard.test.js.map +1 -0
  61. package/dist/tests/IO/RAMCard.test.js +229 -0
  62. package/dist/tests/IO/RAMCard.test.js.map +1 -0
  63. package/dist/tests/IO/RTCCard.test.js +177 -0
  64. package/dist/tests/IO/RTCCard.test.js.map +1 -0
  65. package/dist/tests/IO/SerialCard.test.js +423 -0
  66. package/dist/tests/IO/SerialCard.test.js.map +1 -0
  67. package/dist/tests/IO/SoundCard.test.js +528 -0
  68. package/dist/tests/IO/SoundCard.test.js.map +1 -0
  69. package/dist/tests/IO/StorageCard.test.js +647 -0
  70. package/dist/tests/IO/StorageCard.test.js.map +1 -0
  71. package/dist/tests/IO/VideoCard.test.js +549 -0
  72. package/dist/tests/IO/VideoCard.test.js.map +1 -0
  73. package/dist/tests/Machine.test.js +383 -0
  74. package/dist/tests/Machine.test.js.map +1 -0
  75. package/dist/tests/RAM.test.js +160 -0
  76. package/dist/tests/RAM.test.js.map +1 -0
  77. package/dist/tests/ROM.test.js +123 -0
  78. package/dist/tests/ROM.test.js.map +1 -0
  79. package/jest.config.cjs +9 -0
  80. package/package.json +43 -0
  81. package/src/components/CPU.ts +1371 -0
  82. package/src/components/Cart.ts +20 -0
  83. package/src/components/IO/GPIOAttachments/GPIOAttachment.ts +189 -0
  84. package/src/components/IO/GPIOAttachments/GPIOJoystickAttachment.ts +99 -0
  85. package/src/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.ts +465 -0
  86. package/src/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.ts +287 -0
  87. package/src/components/IO/GPIOCard.ts +677 -0
  88. package/src/components/IO/RAMCard.ts +68 -0
  89. package/src/components/IO/RTCCard.ts +518 -0
  90. package/src/components/IO/SerialCard.ts +335 -0
  91. package/src/components/IO/SoundCard.ts +711 -0
  92. package/src/components/IO/StorageCard.ts +473 -0
  93. package/src/components/IO/VideoCard.ts +730 -0
  94. package/src/components/IO.ts +11 -0
  95. package/src/components/Machine.ts +364 -0
  96. package/src/components/RAM.ts +23 -0
  97. package/src/components/ROM.ts +19 -0
  98. package/src/index.ts +474 -0
  99. package/src/tests/CPU.test.ts +2045 -0
  100. package/src/tests/Cart.test.ts +149 -0
  101. package/src/tests/IO/GPIOAttachments/GPIOAttachment.test.ts +413 -0
  102. package/src/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.ts +147 -0
  103. package/src/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.ts +961 -0
  104. package/src/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.ts +449 -0
  105. package/src/tests/IO/GPIOCard.test.ts +644 -0
  106. package/src/tests/IO/RAMCard.test.ts +284 -0
  107. package/src/tests/IO/RTCCard.test.ts +222 -0
  108. package/src/tests/IO/SerialCard.test.ts +530 -0
  109. package/src/tests/IO/SoundCard.test.ts +659 -0
  110. package/src/tests/IO/StorageCard.test.ts +787 -0
  111. package/src/tests/IO/VideoCard.test.ts +668 -0
  112. package/src/tests/Machine.test.ts +437 -0
  113. package/src/tests/RAM.test.ts +196 -0
  114. package/src/tests/ROM.test.ts +154 -0
  115. package/tsconfig.json +12 -0
package/dist/index.js ADDED
@@ -0,0 +1,441 @@
1
+ #! /usr/bin/env node
2
+ "use strict";
3
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
+ return new (P || (P = Promise))(function (resolve, reject) {
6
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
10
+ });
11
+ };
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ const figlet_1 = __importDefault(require("figlet"));
17
+ const Machine_1 = require("./components/Machine");
18
+ const commander_1 = require("commander");
19
+ const serialport_1 = require("serialport");
20
+ const sdl_1 = __importDefault(require("@kmamal/sdl"));
21
+ const VERSION = '1.0.0';
22
+ const WIDTH = 320;
23
+ const HEIGHT = 240;
24
+ // Audio constants
25
+ const AUDIO_SAMPLE_RATE = 44100;
26
+ const AUDIO_CHANNELS = 1;
27
+ const AUDIO_FORMAT = 'f32';
28
+ const AUDIO_BUFFERED = 2048;
29
+ // Joystick button bit masks (matching GPIOJoystickAttachment)
30
+ const BUTTON_UP = 0x01;
31
+ const BUTTON_DOWN = 0x02;
32
+ const BUTTON_LEFT = 0x04;
33
+ const BUTTON_RIGHT = 0x08;
34
+ const BUTTON_A = 0x10;
35
+ const BUTTON_B = 0x20;
36
+ const BUTTON_SELECT = 0x40;
37
+ const BUTTON_START = 0x80;
38
+ // Axis threshold for converting analog input to digital (50% of normalized range)
39
+ const AXIS_THRESHOLD = 0.5;
40
+ class Emulator {
41
+ constructor(options) {
42
+ this.options = options;
43
+ this.machine = new Machine_1.Machine();
44
+ this.controllers = new Map();
45
+ this.joystickButtonState = 0x00;
46
+ }
47
+ initialize() {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ this.validateOptions();
50
+ yield this.loadBinaries();
51
+ this.configureFrequency();
52
+ this.configureScale();
53
+ this.setupSerialPort();
54
+ this.setupAudio();
55
+ this.setupWindow();
56
+ this.setupControllers();
57
+ });
58
+ }
59
+ validateOptions() {
60
+ const dataBits = parseInt(this.options.databits || '8');
61
+ const stopBits = parseFloat(this.options.stopbits || '1');
62
+ if (dataBits !== 5 && dataBits !== 6 && dataBits !== 7 && dataBits !== 8) {
63
+ console.log('Error: Invalid Data Bits');
64
+ process.exit(1);
65
+ }
66
+ if (stopBits !== 1 && stopBits !== 1.5 && stopBits !== 2) {
67
+ console.log('Error: Invalid Stop Bits');
68
+ process.exit(1);
69
+ }
70
+ }
71
+ loadBinaries() {
72
+ return __awaiter(this, void 0, void 0, function* () {
73
+ if (this.options.rom) {
74
+ yield this.machine.loadROM(this.options.rom);
75
+ console.log(`Loaded ROM: ${this.options.rom}`);
76
+ }
77
+ else {
78
+ console.log('Loaded ROM: NONE');
79
+ }
80
+ if (this.options.cart) {
81
+ yield this.machine.loadCart(this.options.cart);
82
+ console.log(`Loaded Cart: ${this.options.cart}`);
83
+ }
84
+ else {
85
+ console.log('Loaded Cart: NONE');
86
+ }
87
+ if (this.options.storage) {
88
+ yield this.machine.io4.loadFromFile(this.options.storage);
89
+ }
90
+ });
91
+ }
92
+ configureFrequency() {
93
+ if (this.options.freq) {
94
+ const frequency = Number(this.options.freq);
95
+ if (!isNaN(frequency)) {
96
+ this.machine.frequency = frequency;
97
+ console.log(`Frequency: ${this.options.freq} Hz`);
98
+ }
99
+ else {
100
+ console.log();
101
+ console.error(`Aborting... Error Invalid Frequency: '${this.options.freq}'`);
102
+ process.exit(1);
103
+ }
104
+ }
105
+ else {
106
+ console.log("Frequency: 1000000 Hz");
107
+ }
108
+ }
109
+ configureScale() {
110
+ if (this.options.scale) {
111
+ const scale = Number(this.options.scale);
112
+ if (!isNaN(scale)) {
113
+ this.machine.scale = scale;
114
+ console.log(`Scale: ${this.options.scale}x`);
115
+ }
116
+ else {
117
+ console.log();
118
+ console.error(`Aborting... Error Invalid Scale: '${this.options.scale}'`);
119
+ process.exit(1);
120
+ }
121
+ }
122
+ else {
123
+ console.log(`Scale: 1x`);
124
+ }
125
+ }
126
+ setupSerialPort() {
127
+ if (!this.options.port) {
128
+ return;
129
+ }
130
+ const baudRate = parseInt(this.options.baudrate || '9600');
131
+ const parity = (this.options.parity || 'none');
132
+ const dataBits = parseInt(this.options.databits || '8');
133
+ const stopBits = parseFloat(this.options.stopbits || '1');
134
+ this.serialPort = new serialport_1.SerialPort({
135
+ path: this.options.port,
136
+ baudRate: baudRate,
137
+ parity: parity,
138
+ dataBits: dataBits,
139
+ stopBits: stopBits
140
+ }, (err) => {
141
+ if (err) {
142
+ console.log('Error: ', err.message);
143
+ }
144
+ });
145
+ this.serialPort.on('data', (data) => {
146
+ for (let i = 0; i < data.length; i++) {
147
+ this.machine.onReceive(data[i]);
148
+ }
149
+ });
150
+ this.machine.transmit = (data) => {
151
+ if (this.serialPort && this.serialPort.isOpen) {
152
+ this.serialPort.write(Buffer.from([data]), (err) => {
153
+ if (err) {
154
+ console.log('Error sending serial data: ', err.message);
155
+ }
156
+ });
157
+ }
158
+ };
159
+ }
160
+ setupAudio() {
161
+ try {
162
+ this.audioDevice = sdl_1.default.audio.openDevice({ type: 'playback' }, {
163
+ channels: AUDIO_CHANNELS,
164
+ frequency: AUDIO_SAMPLE_RATE,
165
+ format: AUDIO_FORMAT,
166
+ buffered: AUDIO_BUFFERED,
167
+ });
168
+ // Configure SoundCard sample rate to match audio device
169
+ this.machine.io7.sampleRate = this.audioDevice.frequency;
170
+ // Connect the Machine's audio callback to the SDL audio device
171
+ this.machine.pushAudioSamples = (samples) => {
172
+ if (!this.audioDevice || this.audioDevice.closed)
173
+ return;
174
+ const { channels, bytesPerSample } = this.audioDevice;
175
+ const buffer = Buffer.alloc(samples.length * channels * bytesPerSample);
176
+ let offset = 0;
177
+ for (let i = 0; i < samples.length; i++) {
178
+ for (let ch = 0; ch < channels; ch++) {
179
+ offset = this.audioDevice.writeSample(buffer, samples[i], offset);
180
+ }
181
+ }
182
+ this.audioDevice.enqueue(buffer);
183
+ };
184
+ this.audioDevice.play();
185
+ console.log(`Audio: ${this.audioDevice.frequency} Hz, ${AUDIO_FORMAT}, buffer ${AUDIO_BUFFERED}`);
186
+ }
187
+ catch (error) {
188
+ console.error('Failed to initialize audio:', error);
189
+ }
190
+ }
191
+ setupWindow() {
192
+ this.window = sdl_1.default.video.createWindow({
193
+ title: "6502 Emulator",
194
+ width: WIDTH * this.machine.scale,
195
+ height: HEIGHT * this.machine.scale,
196
+ accelerated: true,
197
+ vsync: true
198
+ });
199
+ this.window.on('keyDown', (event) => {
200
+ if (!event.scancode) {
201
+ return;
202
+ }
203
+ this.machine.onKeyDown(event.scancode);
204
+ });
205
+ this.window.on('keyUp', (event) => {
206
+ if (!event.scancode) {
207
+ return;
208
+ }
209
+ this.machine.onKeyUp(event.scancode);
210
+ });
211
+ this.machine.render = (buffer) => {
212
+ if (!this.window) {
213
+ return;
214
+ }
215
+ this.window.render(WIDTH, HEIGHT, WIDTH * 4, 'rgba32', buffer);
216
+ };
217
+ this.window.on('close', () => this.shutdown());
218
+ }
219
+ setupControllers() {
220
+ // Controller device add/remove handlers
221
+ sdl_1.default.controller.on('deviceAdd', (device) => {
222
+ console.log(`Controller added: ${device.name || device.id}`);
223
+ try {
224
+ const controller = sdl_1.default.controller.openDevice(device);
225
+ this.controllers.set(device.id, controller);
226
+ this.setupControllerHandlers(controller, device);
227
+ console.log(`Controller ${device.name || device.id} opened successfully`);
228
+ }
229
+ catch (error) {
230
+ console.error(`Failed to open controller ${device.name || device.id}:`, error);
231
+ }
232
+ });
233
+ sdl_1.default.controller.on('deviceRemove', (device) => {
234
+ console.log(`Controller removed: ${device.name || device.id}`);
235
+ const controller = this.controllers.get(device.id);
236
+ if (controller && !controller.closed) {
237
+ controller.close();
238
+ }
239
+ this.controllers.delete(device.id);
240
+ // Clear joystick state when all controllers are removed
241
+ if (this.controllers.size === 0) {
242
+ this.joystickButtonState = 0x00;
243
+ this.machine.onJoystick(this.joystickButtonState);
244
+ }
245
+ });
246
+ // Initialize controllers - detect any already connected
247
+ console.log('Scanning for controllers...');
248
+ const devices = sdl_1.default.controller.devices;
249
+ if (devices && devices.length > 0) {
250
+ console.log(`Found ${devices.length} controller(s)`);
251
+ devices.forEach((device) => {
252
+ try {
253
+ const controller = sdl_1.default.controller.openDevice(device);
254
+ this.controllers.set(device.id, controller);
255
+ this.setupControllerHandlers(controller, device);
256
+ console.log(`Controller ${device.name || device.id} opened successfully`);
257
+ }
258
+ catch (error) {
259
+ console.error(`Failed to open controller ${device.name || device.id}:`, error);
260
+ }
261
+ });
262
+ }
263
+ else {
264
+ console.log('No controllers found');
265
+ }
266
+ }
267
+ setupControllerHandlers(controller, device) {
268
+ controller.on('buttonDown', (button) => {
269
+ switch (button) {
270
+ case 'dpadUp':
271
+ this.joystickButtonState |= BUTTON_UP;
272
+ break;
273
+ case 'dpadDown':
274
+ this.joystickButtonState |= BUTTON_DOWN;
275
+ break;
276
+ case 'dpadLeft':
277
+ this.joystickButtonState |= BUTTON_LEFT;
278
+ break;
279
+ case 'dpadRight':
280
+ this.joystickButtonState |= BUTTON_RIGHT;
281
+ break;
282
+ case 'a':
283
+ this.joystickButtonState |= BUTTON_A;
284
+ break;
285
+ case 'b':
286
+ this.joystickButtonState |= BUTTON_B;
287
+ break;
288
+ case 'back':
289
+ this.joystickButtonState |= BUTTON_SELECT;
290
+ break;
291
+ case 'start':
292
+ this.joystickButtonState |= BUTTON_START;
293
+ break;
294
+ }
295
+ this.machine.onJoystick(this.joystickButtonState);
296
+ });
297
+ controller.on('buttonUp', (button) => {
298
+ switch (button) {
299
+ case 'dpadUp':
300
+ this.joystickButtonState &= ~BUTTON_UP;
301
+ break;
302
+ case 'dpadDown':
303
+ this.joystickButtonState &= ~BUTTON_DOWN;
304
+ break;
305
+ case 'dpadLeft':
306
+ this.joystickButtonState &= ~BUTTON_LEFT;
307
+ break;
308
+ case 'dpadRight':
309
+ this.joystickButtonState &= ~BUTTON_RIGHT;
310
+ break;
311
+ case 'a':
312
+ this.joystickButtonState &= ~BUTTON_A;
313
+ break;
314
+ case 'b':
315
+ this.joystickButtonState &= ~BUTTON_B;
316
+ break;
317
+ case 'back':
318
+ this.joystickButtonState &= ~BUTTON_SELECT;
319
+ break;
320
+ case 'start':
321
+ this.joystickButtonState &= ~BUTTON_START;
322
+ break;
323
+ }
324
+ this.machine.onJoystick(this.joystickButtonState);
325
+ });
326
+ controller.on('axisMotion', ({ axis, value }) => {
327
+ if (axis === 'leftStickX') {
328
+ if (value < -AXIS_THRESHOLD) {
329
+ this.joystickButtonState |= BUTTON_LEFT;
330
+ this.joystickButtonState &= ~BUTTON_RIGHT;
331
+ }
332
+ else if (value > AXIS_THRESHOLD) {
333
+ this.joystickButtonState |= BUTTON_RIGHT;
334
+ this.joystickButtonState &= ~BUTTON_LEFT;
335
+ }
336
+ else {
337
+ this.joystickButtonState &= ~(BUTTON_LEFT | BUTTON_RIGHT);
338
+ }
339
+ this.machine.onJoystick(this.joystickButtonState);
340
+ }
341
+ else if (axis === 'leftStickY') {
342
+ if (value < -AXIS_THRESHOLD) {
343
+ this.joystickButtonState |= BUTTON_UP;
344
+ this.joystickButtonState &= ~BUTTON_DOWN;
345
+ }
346
+ else if (value > AXIS_THRESHOLD) {
347
+ this.joystickButtonState |= BUTTON_DOWN;
348
+ this.joystickButtonState &= ~BUTTON_UP;
349
+ }
350
+ else {
351
+ this.joystickButtonState &= ~(BUTTON_UP | BUTTON_DOWN);
352
+ }
353
+ this.machine.onJoystick(this.joystickButtonState);
354
+ }
355
+ });
356
+ controller.on('close', () => {
357
+ console.log(`Controller closed: ${device.name || device.id}`);
358
+ this.controllers.delete(device.id);
359
+ });
360
+ }
361
+ shutdown() {
362
+ // Close all connected controllers
363
+ for (const [id, controller] of this.controllers.entries()) {
364
+ if (!controller.closed) {
365
+ console.log(`Closing controller ${id}`);
366
+ controller.close();
367
+ }
368
+ }
369
+ this.controllers.clear();
370
+ // Close the audio device
371
+ if (this.audioDevice && !this.audioDevice.closed) {
372
+ this.audioDevice.pause();
373
+ this.audioDevice.close();
374
+ }
375
+ if (this.serialPort && this.serialPort.isOpen) {
376
+ this.serialPort.close((err) => {
377
+ if (err) {
378
+ console.log('Error closing serial port: ', err.message);
379
+ }
380
+ });
381
+ }
382
+ this.machine.end();
383
+ const uptime = Date.now() - this.machine.startTime;
384
+ console.log();
385
+ console.log('Result:');
386
+ console.table({
387
+ 'Time Elapsed': uptime / 1000,
388
+ 'CPU Cycles': this.machine.cpu.cycles,
389
+ 'Frames': this.machine.frames,
390
+ 'Avg FPS': parseFloat((this.machine.frames / (uptime / 1000)).toFixed(2))
391
+ });
392
+ // Save storage data if path was provided
393
+ if (this.options.storage) {
394
+ this.machine.io4.saveToFile(this.options.storage).then(() => {
395
+ process.exit(0);
396
+ }).catch(() => {
397
+ process.exit(1);
398
+ });
399
+ }
400
+ else {
401
+ process.exit(0);
402
+ }
403
+ }
404
+ start() {
405
+ this.machine.start();
406
+ }
407
+ }
408
+ // Parse command line arguments
409
+ const program = new commander_1.Command();
410
+ program
411
+ .name('ac6502')
412
+ .description('Emulator for the A.C. Wright 6502 project.')
413
+ .version(VERSION, '-v, --version', 'Output the current emulator version')
414
+ .helpOption('-h, --help', 'Output help / options')
415
+ .option('-c, --cart <path>', 'Path to 32K Cart binary file')
416
+ .option('-f, --freq <freq>', 'Set the clock frequency in Hz', '2000000')
417
+ .option('-r, --rom <path>', 'Path to 32K ROM binary file')
418
+ .option('-s, --scale <scale>', 'Set the emulator scale', '2')
419
+ .option('-b, --baudrate <baudrate>', 'Baud Rate', '9600')
420
+ .option('-a, --parity <parity>', 'Parity (odd | even | none)', 'none')
421
+ .option('-d, --databits <databits>', 'Data Bits (5 | 6 | 7 | 8)', '8')
422
+ .option('-t, --stopbits <stopbits>', 'Stop Bits (1 | 1.5 | 2)', '1')
423
+ .option('-p, --port <port>', 'Path to the serial port (e.g., /dev/ttyUSB0)')
424
+ .option('-S, --storage <path>', 'Path to storage data file for Compact Flash card persistence')
425
+ .addHelpText('beforeAll', figlet_1.default.textSync('6502 Emulator', { font: 'cricket' }) + '\n' + `Version: ${VERSION} | A.C. Wright Design\n`)
426
+ .parse(process.argv);
427
+ const options = program.opts();
428
+ // Main initialization function
429
+ function main() {
430
+ return __awaiter(this, void 0, void 0, function* () {
431
+ const emulator = new Emulator(options);
432
+ yield emulator.initialize();
433
+ emulator.start();
434
+ });
435
+ }
436
+ // Run the main function
437
+ main().catch((error) => {
438
+ console.error('Error:', error);
439
+ process.exit(1);
440
+ });
441
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}