@tmustier/pi-nes 0.2.4 → 0.2.5

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 (32) hide show
  1. package/AGENTS.md +89 -1
  2. package/README.md +78 -49
  3. package/extensions/nes/native/nes-core/Cargo.lock +0 -2
  4. package/extensions/nes/native/nes-core/Cargo.toml +1 -1
  5. package/extensions/nes/native/nes-core/index.d.ts +5 -0
  6. package/extensions/nes/native/nes-core/index.node +0 -0
  7. package/extensions/nes/native/nes-core/native.d.ts +5 -0
  8. package/extensions/nes/native/nes-core/src/lib.rs +25 -0
  9. package/extensions/nes/native/nes-core/vendor/nes_rust/.cargo-ok +1 -0
  10. package/extensions/nes/native/nes-core/vendor/nes_rust/.cargo_vcs_info.json +5 -0
  11. package/extensions/nes/native/nes-core/vendor/nes_rust/.travis.yml +3 -0
  12. package/extensions/nes/native/nes-core/vendor/nes_rust/Cargo.toml +23 -0
  13. package/extensions/nes/native/nes-core/vendor/nes_rust/LICENSE +21 -0
  14. package/extensions/nes/native/nes-core/vendor/nes_rust/README.md +59 -0
  15. package/extensions/nes/native/nes-core/vendor/nes_rust/src/apu.rs +1114 -0
  16. package/extensions/nes/native/nes-core/vendor/nes_rust/src/audio.rs +6 -0
  17. package/extensions/nes/native/nes-core/vendor/nes_rust/src/button.rs +23 -0
  18. package/extensions/nes/native/nes-core/vendor/nes_rust/src/cpu.rs +2364 -0
  19. package/extensions/nes/native/nes-core/vendor/nes_rust/src/default_audio.rs +49 -0
  20. package/extensions/nes/native/nes-core/vendor/nes_rust/src/default_display.rs +47 -0
  21. package/extensions/nes/native/nes-core/vendor/nes_rust/src/default_input.rs +33 -0
  22. package/extensions/nes/native/nes-core/vendor/nes_rust/src/display.rs +10 -0
  23. package/extensions/nes/native/nes-core/vendor/nes_rust/src/input.rs +7 -0
  24. package/extensions/nes/native/nes-core/vendor/nes_rust/src/joypad.rs +86 -0
  25. package/extensions/nes/native/nes-core/vendor/nes_rust/src/lib.rs +168 -0
  26. package/extensions/nes/native/nes-core/vendor/nes_rust/src/mapper.rs +502 -0
  27. package/extensions/nes/native/nes-core/vendor/nes_rust/src/memory.rs +73 -0
  28. package/extensions/nes/native/nes-core/vendor/nes_rust/src/ppu.rs +1378 -0
  29. package/extensions/nes/native/nes-core/vendor/nes_rust/src/register.rs +560 -0
  30. package/extensions/nes/native/nes-core/vendor/nes_rust/src/rom.rs +231 -0
  31. package/extensions/nes/nes-core.ts +27 -4
  32. package/package.json +1 -1
@@ -0,0 +1,560 @@
1
+ pub struct Register<T> {
2
+ data: T
3
+ }
4
+
5
+ // @TODO: Combine Register<u8> with Register<u16>
6
+
7
+ impl Register<u8> {
8
+ pub fn new() -> Register<u8> {
9
+ Register{ data: 0 }
10
+ }
11
+
12
+ pub fn get_width(&self) -> u8 {
13
+ 8
14
+ }
15
+
16
+ pub fn load(&self) -> u8 {
17
+ self.data
18
+ }
19
+
20
+ pub fn load_bit(&self, pos: u8) -> u8 {
21
+ (self.data >> pos) & 1
22
+ }
23
+
24
+ pub fn load_bits(&self, offset: u8, width: u8) -> u8 {
25
+ (self.data >> offset) & ((1 << width) - 1)
26
+ }
27
+
28
+ pub fn store(&mut self, value: u8) {
29
+ self.data = value;
30
+ }
31
+
32
+ pub fn store_bit(&mut self, pos: u8, value: u8) {
33
+ self.data = self.data & !(1 << pos) | ((value & 1) << pos);
34
+ }
35
+
36
+ pub fn store_bits(&mut self, offset: u8, width: u8, value: u8) {
37
+ let mask = (1 << width) - 1;
38
+ self.data = self.data & !(mask << offset) | ((value & mask) << offset);
39
+ }
40
+
41
+ pub fn clear(&mut self) {
42
+ self.data = 0;
43
+ }
44
+
45
+ pub fn set_bit(&mut self, pos: u8) {
46
+ self.store_bit(pos, 1);
47
+ }
48
+
49
+ pub fn clear_bit(&mut self, pos: u8) {
50
+ self.store_bit(pos, 0);
51
+ }
52
+
53
+ pub fn is_bit_set(&self, pos: u8) -> bool {
54
+ self.load_bit(pos) == 1
55
+ }
56
+
57
+ pub fn increment(&mut self) {
58
+ self.add(1);
59
+ }
60
+
61
+ pub fn increment_by_2(&mut self) {
62
+ self.add(2);
63
+ }
64
+
65
+ pub fn add(&mut self, value: u8) {
66
+ self.data = self.data.wrapping_add(value);
67
+ }
68
+
69
+ pub fn decrement(&mut self) {
70
+ self.sub(1);
71
+ }
72
+
73
+ pub fn decrement_by_2(&mut self) {
74
+ self.sub(2);
75
+ }
76
+
77
+ pub fn sub(&mut self, value: u8) {
78
+ self.data = self.data.wrapping_sub(value);
79
+ }
80
+
81
+ pub fn shift(&mut self, value: u8) -> u8 {
82
+ let carry = self.load_bit(self.get_width() - 1);
83
+ self.data = (self.data << 1) | (value & 1);
84
+ carry
85
+ }
86
+
87
+ pub fn dump(&self) -> String {
88
+ format!("0x{:02x}", self.data)
89
+ }
90
+ }
91
+
92
+ impl Register<u16> {
93
+ pub fn new() -> Register<u16> {
94
+ Register{ data: 0 }
95
+ }
96
+
97
+ pub fn get_width(&self) -> u8 {
98
+ 16
99
+ }
100
+
101
+ pub fn load(&self) -> u16 {
102
+ self.data
103
+ }
104
+
105
+ pub fn load_bit(&self, pos: u8) -> u8 {
106
+ ((self.data >> pos) & 1) as u8
107
+ }
108
+
109
+ pub fn load_bits(&self, offset: u8, width: u8) -> u16 {
110
+ (self.data >> offset) & ((1 << width) - 1)
111
+ }
112
+
113
+ pub fn store(&mut self, value: u16) {
114
+ self.data = value;
115
+ }
116
+
117
+ pub fn store_bit(&mut self, pos: u8, value: u8) {
118
+ self.data = self.data & !(1 << pos) | ((value as u16 & 1) << pos);
119
+ }
120
+
121
+ pub fn store_bits(&mut self, offset: u8, width: u8, value: u16) {
122
+ let mask = (1 << width) - 1;
123
+ self.data = self.data & !(mask << offset) | ((value & mask) << offset);
124
+ }
125
+
126
+ pub fn clear(&mut self) {
127
+ self.data = 0;
128
+ }
129
+
130
+ pub fn set_bit(&mut self, pos: u8) {
131
+ self.store_bit(pos, 1);
132
+ }
133
+
134
+ pub fn clear_bit(&mut self, pos: u8) {
135
+ self.store_bit(pos, 0);
136
+ }
137
+
138
+ pub fn is_bit_set(&self, pos: u8) -> bool {
139
+ self.load_bit(pos) == 1
140
+ }
141
+
142
+ pub fn increment(&mut self) {
143
+ self.add(1);
144
+ }
145
+
146
+ pub fn increment_by_2(&mut self) {
147
+ self.add(2);
148
+ }
149
+
150
+ pub fn add(&mut self, value: u16) {
151
+ self.data = self.data.wrapping_add(value);
152
+ }
153
+
154
+ pub fn decrement(&mut self) {
155
+ self.sub(1);
156
+ }
157
+
158
+ pub fn decrement_by_2(&mut self) {
159
+ self.sub(2);
160
+ }
161
+
162
+ pub fn sub(&mut self, value: u16) {
163
+ self.data = self.data.wrapping_sub(value);
164
+ }
165
+
166
+ pub fn shift(&mut self, value: u8) -> u8 {
167
+ let carry = self.load_bit(self.get_width() - 1);
168
+ self.data = (self.data << 1) | (value as u16 & 1);
169
+ carry
170
+ }
171
+
172
+ pub fn store_higher_byte(&mut self, value: u8) {
173
+ self.data &= 0x00ff;
174
+ self.data |= (value as u16) << 8;
175
+ }
176
+
177
+ pub fn store_lower_byte(&mut self, value: u8) {
178
+ self.data &= 0xff00;
179
+ self.data |= value as u16;
180
+ }
181
+
182
+ pub fn dump(&self) -> String {
183
+ format!("0x{:04x}", self.data)
184
+ }
185
+ }
186
+
187
+ #[cfg(test)]
188
+ mod tests_register_u8 {
189
+ use super::*;
190
+
191
+ #[test]
192
+ fn initial_value() {
193
+ let r = Register::<u8>::new();
194
+ assert_eq!(0, r.data);
195
+ }
196
+
197
+ #[test]
198
+ fn get_width() {
199
+ let r = Register::<u8>::new();
200
+ assert_eq!(8, r.get_width());
201
+ }
202
+
203
+ #[test]
204
+ fn load() {
205
+ let r = Register::<u8>::new();
206
+ assert_eq!(0, r.load());
207
+ }
208
+
209
+ #[test]
210
+ fn load_bit() {
211
+ let mut r = Register::<u8>::new();
212
+ r.store(2);
213
+ assert_eq!(1, r.load_bit(1));
214
+ }
215
+
216
+ #[test]
217
+ fn load_bits() {
218
+ let mut r = Register::<u8>::new();
219
+ r.store(2);
220
+ assert_eq!(1, r.load_bits(1, 2));
221
+ }
222
+
223
+ #[test]
224
+ fn store() {
225
+ let mut r = Register::<u8>::new();
226
+ r.store(0xFF);
227
+ assert_eq!(0xFF, r.load());
228
+ r.store(0);
229
+ assert_eq!(0, r.load());
230
+ }
231
+
232
+ #[test]
233
+ fn store_bit() {
234
+ let mut r = Register::<u8>::new();
235
+ r.store_bit(1, 1);
236
+ assert_eq!(2, r.load());
237
+ r.store(0xFF);
238
+ r.store_bit(1, 0);
239
+ assert_eq!(0xFD, r.load());
240
+ }
241
+
242
+ #[test]
243
+ fn store_bits() {
244
+ let mut r = Register::<u8>::new();
245
+ r.store_bits(1, 2, 3);
246
+ assert_eq!(6, r.load());
247
+ r.store(0xFF);
248
+ r.store_bits(1, 2, 0);
249
+ assert_eq!(0xF9, r.load());
250
+ }
251
+
252
+ #[test]
253
+ fn clear() {
254
+ let mut r = Register::<u8>::new();
255
+ r.store(0xFF);
256
+ r.clear();
257
+ assert_eq!(0, r.load());
258
+ }
259
+
260
+ #[test]
261
+ fn set_bit() {
262
+ let mut r = Register::<u8>::new();
263
+ r.set_bit(1);
264
+ assert_eq!(2, r.load());
265
+ }
266
+
267
+ #[test]
268
+ fn clear_bit() {
269
+ let mut r = Register::<u8>::new();
270
+ r.store(0xFF);
271
+ r.clear_bit(1);
272
+ assert_eq!(0xFD, r.load());
273
+ }
274
+
275
+ #[test]
276
+ fn is_bit_set() {
277
+ let mut r = Register::<u8>::new();
278
+ assert_eq!(false, r.is_bit_set(1));
279
+ r.set_bit(1);
280
+ assert_eq!(true, r.is_bit_set(1));
281
+ }
282
+
283
+ #[test]
284
+ fn increment() {
285
+ let mut r = Register::<u8>::new();
286
+ r.increment();
287
+ assert_eq!(1, r.load());
288
+ r.store(0xFF);
289
+ r.increment();
290
+ assert_eq!(0, r.load());
291
+ }
292
+
293
+ #[test]
294
+ fn increment_by_2() {
295
+ let mut r = Register::<u8>::new();
296
+ r.increment_by_2();
297
+ assert_eq!(2, r.load());
298
+ r.store(0xFF);
299
+ r.increment_by_2();
300
+ assert_eq!(1, r.load());
301
+ }
302
+
303
+ #[test]
304
+ fn add() {
305
+ let mut r = Register::<u8>::new();
306
+ r.add(3);
307
+ assert_eq!(3, r.load());
308
+ r.store(0xFF);
309
+ r.add(3);
310
+ assert_eq!(2, r.load());
311
+ }
312
+
313
+ #[test]
314
+ fn decrement() {
315
+ let mut r = Register::<u8>::new();
316
+ r.decrement();
317
+ assert_eq!(0xFF, r.load());
318
+ r.decrement();
319
+ assert_eq!(0xFE, r.load());
320
+ }
321
+
322
+ #[test]
323
+ fn decrement_by_2() {
324
+ let mut r = Register::<u8>::new();
325
+ r.decrement_by_2();
326
+ assert_eq!(0xFE, r.load());
327
+ r.decrement_by_2();
328
+ assert_eq!(0xFC, r.load());
329
+ }
330
+
331
+ #[test]
332
+ fn sub() {
333
+ let mut r = Register::<u8>::new();
334
+ r.sub(3);
335
+ assert_eq!(0xFD, r.load());
336
+ r.sub(3);
337
+ assert_eq!(0xFA, r.load());
338
+ }
339
+
340
+ #[test]
341
+ fn shift() {
342
+ let mut r = Register::<u8>::new();
343
+ assert_eq!(0, r.shift(1));
344
+ assert_eq!(1, r.load());
345
+ assert_eq!(0, r.shift(0));
346
+ assert_eq!(2, r.load());
347
+ r.store(0xFF);
348
+ assert_eq!(1, r.shift(1));
349
+ assert_eq!(0xFF, r.load());
350
+ assert_eq!(1, r.shift(0));
351
+ assert_eq!(0xFE, r.load());
352
+ }
353
+
354
+ #[test]
355
+ fn dump() {
356
+ let mut r = Register::<u8>::new();
357
+ assert_eq!("0x00", r.dump());
358
+ r.store(0xFF);
359
+ assert_eq!("0xff", r.dump());
360
+ r.store(0x8A);
361
+ assert_eq!("0x8a", r.dump());
362
+ }
363
+ }
364
+
365
+
366
+ #[cfg(test)]
367
+ mod tests_register_u16 {
368
+ use super::*;
369
+
370
+ #[test]
371
+ fn initial_value() {
372
+ let r = Register::<u16>::new();
373
+ assert_eq!(0, r.data);
374
+ }
375
+
376
+ #[test]
377
+ fn get_width() {
378
+ let r = Register::<u16>::new();
379
+ assert_eq!(16, r.get_width());
380
+ }
381
+
382
+ #[test]
383
+ fn load() {
384
+ let r = Register::<u16>::new();
385
+ assert_eq!(0, r.load());
386
+ }
387
+
388
+ #[test]
389
+ fn load_bit() {
390
+ let mut r = Register::<u16>::new();
391
+ r.store(2);
392
+ assert_eq!(1, r.load_bit(1));
393
+ }
394
+
395
+ #[test]
396
+ fn load_bits() {
397
+ let mut r = Register::<u16>::new();
398
+ r.store(2);
399
+ assert_eq!(1, r.load_bits(1, 2));
400
+ }
401
+
402
+ #[test]
403
+ fn store() {
404
+ let mut r = Register::<u16>::new();
405
+ r.store(0xFF);
406
+ assert_eq!(0xFF, r.load());
407
+ r.store(0);
408
+ assert_eq!(0, r.load());
409
+ }
410
+
411
+ #[test]
412
+ fn store_bit() {
413
+ let mut r = Register::<u16>::new();
414
+ r.store_bit(1, 1);
415
+ assert_eq!(2, r.load());
416
+ r.store(0xFF);
417
+ r.store_bit(1, 0);
418
+ assert_eq!(0xFD, r.load());
419
+ }
420
+
421
+ #[test]
422
+ fn store_bits() {
423
+ let mut r = Register::<u16>::new();
424
+ r.store_bits(1, 2, 3);
425
+ assert_eq!(6, r.load());
426
+ r.store(0xFF);
427
+ r.store_bits(1, 2, 0);
428
+ assert_eq!(0xF9, r.load());
429
+ }
430
+
431
+ #[test]
432
+ fn clear() {
433
+ let mut r = Register::<u16>::new();
434
+ r.store(0xFF);
435
+ r.clear();
436
+ assert_eq!(0, r.load());
437
+ }
438
+
439
+ #[test]
440
+ fn set_bit() {
441
+ let mut r = Register::<u16>::new();
442
+ r.set_bit(1);
443
+ assert_eq!(2, r.load());
444
+ }
445
+
446
+ #[test]
447
+ fn clear_bit() {
448
+ let mut r = Register::<u16>::new();
449
+ r.store(0xFF);
450
+ r.clear_bit(1);
451
+ assert_eq!(0xFD, r.load());
452
+ }
453
+
454
+ #[test]
455
+ fn is_bit_set() {
456
+ let mut r = Register::<u16>::new();
457
+ assert_eq!(false, r.is_bit_set(1));
458
+ r.set_bit(1);
459
+ assert_eq!(true, r.is_bit_set(1));
460
+ }
461
+
462
+ #[test]
463
+ fn increment() {
464
+ let mut r = Register::<u16>::new();
465
+ r.increment();
466
+ assert_eq!(1, r.load());
467
+ r.store(0xFF);
468
+ r.increment();
469
+ assert_eq!(0x100, r.load());
470
+ r.store(0xFFFF);
471
+ r.increment();
472
+ assert_eq!(0, r.load());
473
+ }
474
+
475
+ #[test]
476
+ fn increment_by_2() {
477
+ let mut r = Register::<u16>::new();
478
+ r.increment_by_2();
479
+ assert_eq!(2, r.load());
480
+ r.store(0xFF);
481
+ r.increment_by_2();
482
+ assert_eq!(0x101, r.load());
483
+ r.store(0xFFFF);
484
+ r.increment_by_2();
485
+ assert_eq!(1, r.load());
486
+ }
487
+
488
+ #[test]
489
+ fn add() {
490
+ let mut r = Register::<u16>::new();
491
+ r.add(3);
492
+ assert_eq!(3, r.load());
493
+ r.store(0xFF);
494
+ r.add(3);
495
+ assert_eq!(0x102, r.load());
496
+ r.store(0xFFFF);
497
+ r.add(3);
498
+ assert_eq!(2, r.load());
499
+ }
500
+
501
+ #[test]
502
+ fn decrement() {
503
+ let mut r = Register::<u16>::new();
504
+ r.decrement();
505
+ assert_eq!(0xFFFF, r.load());
506
+ r.decrement();
507
+ assert_eq!(0xFFFE, r.load());
508
+ }
509
+
510
+ #[test]
511
+ fn decrement_by_2() {
512
+ let mut r = Register::<u16>::new();
513
+ r.decrement_by_2();
514
+ assert_eq!(0xFFFE, r.load());
515
+ r.decrement_by_2();
516
+ assert_eq!(0xFFFC, r.load());
517
+ }
518
+
519
+ #[test]
520
+ fn sub() {
521
+ let mut r = Register::<u16>::new();
522
+ r.sub(3);
523
+ assert_eq!(0xFFFD, r.load());
524
+ r.sub(3);
525
+ assert_eq!(0xFFFA, r.load());
526
+ }
527
+
528
+ #[test]
529
+ fn shift() {
530
+ let mut r = Register::<u16>::new();
531
+ assert_eq!(0, r.shift(1));
532
+ assert_eq!(1, r.load());
533
+ assert_eq!(0, r.shift(0));
534
+ assert_eq!(2, r.load());
535
+ r.store(0xFF);
536
+ assert_eq!(0, r.shift(1));
537
+ assert_eq!(0x1FF, r.load());
538
+ assert_eq!(0, r.shift(0));
539
+ assert_eq!(0x3FE, r.load());
540
+ r.store(0xFFFF);
541
+ assert_eq!(1, r.shift(1));
542
+ assert_eq!(0xFFFF, r.load());
543
+ assert_eq!(1, r.shift(0));
544
+ assert_eq!(0xFFFE, r.load());
545
+ }
546
+
547
+ #[test]
548
+ fn dump() {
549
+ let mut r = Register::<u16>::new();
550
+ assert_eq!("0x0000", r.dump());
551
+ r.store(0xFF);
552
+ assert_eq!("0x00ff", r.dump());
553
+ r.store(0x8A);
554
+ assert_eq!("0x008a", r.dump());
555
+ r.store(0xFFFF);
556
+ assert_eq!("0xffff", r.dump());
557
+ r.store(0xA88A);
558
+ assert_eq!("0xa88a", r.dump());
559
+ }
560
+ }