@@ -192,18 +192,16 @@ impl Cpu {
192
192
// for (i, val) in program.iter().enumerate() {
193
193
// self.mem_write((CPU_START + i) as u16, *val);
194
194
// }
195
- let rom = Rom :: new ( & program) ;
195
+ let rom = Rom :: new_test_rom ( program) ;
196
196
self . set_bus ( Bus :: new ( rom) ) ;
197
-
198
- // TODO: update this to get unit tests working
199
197
// self.mem_write_u16(0xFFFC, CPU_START as u16);
200
198
}
201
199
202
- // pub fn load_rom(&mut self, rom: Rom) {
203
- // // Load turns program into ROM, then sets the bus
204
- // self.set_bus(Bus::new(rom));
205
- // // self.mem_write_u16(0xFFFC, CPU_START as u16);
206
- // }
200
+ pub fn load_rom ( & mut self , rom : Rom ) {
201
+ // Load turns program into ROM, then sets the bus
202
+ self . set_bus ( Bus :: new ( rom) ) ;
203
+ // self.mem_write_u16(0xFFFC, CPU_START as u16);
204
+ }
207
205
208
206
fn load_and_run ( & mut self , program : Vec < u8 > ) {
209
207
self . load ( program) ;
@@ -1314,20 +1312,23 @@ mod tests {
1314
1312
}
1315
1313
1316
1314
#[ test]
1317
- fn test_lda_from_memory ( ) {
1315
+ fn test_0xa5_lda_from_memory ( ) {
1318
1316
let mut cpu = Cpu :: new ( ) ;
1317
+ cpu. load ( vec ! [ 0xa5 , 0x10 , 0x00 ] ) ;
1318
+ cpu. reset ( ) ;
1319
1319
cpu. mem_write ( 0x10 , 0x55 ) ;
1320
- assert_eq ! ( cpu. mem_read( 0x10 ) , 0x55 ) ;
1321
- cpu. load_and_run ( vec ! [ 0xa5 , 0x10 , 0x00 ] ) ;
1320
+ cpu. run ( ) ;
1322
1321
1323
1322
assert_eq ! ( cpu. a, 0x55 ) ;
1324
1323
}
1325
1324
1326
1325
#[ test]
1327
- fn test_lda_absolute ( ) {
1326
+ fn test_0xad_lda_absolute ( ) {
1328
1327
let mut cpu = Cpu :: new ( ) ;
1328
+ cpu. load ( vec ! [ 0xad , 0x03 , 0x10 , 0x00 ] ) ;
1329
+ cpu. reset ( ) ;
1329
1330
cpu. mem_write ( 0x1003 , 0x99 ) ;
1330
- cpu. load_and_run ( vec ! [ 0xad , 0x03 , 0x10 , 0x00 ] ) ;
1331
+ cpu. run ( ) ;
1331
1332
1332
1333
assert_eq ! ( cpu. a, 0x99 ) ;
1333
1334
}
@@ -1460,9 +1461,10 @@ mod tests {
1460
1461
#[ test]
1461
1462
fn test_jmp ( ) {
1462
1463
let mut cpu = Cpu :: new ( ) ;
1463
- let jump_dest: u16 = ( CPU_START as u16 ) + 333 ;
1464
- cpu. mem_write_u16 ( ( CPU_START as u16 ) + 1 , jump_dest) ;
1465
- cpu. load_and_run ( vec ! [ 0x20 ] ) ;
1464
+ let jump_dest: u16 = ( PRG_ROM_START + CPU_START as u16 ) + 333 ;
1465
+ let lo = ( jump_dest & 0xff ) as u8 ;
1466
+ let hi = ( jump_dest >> 8 ) as u8 ;
1467
+ cpu. load_and_run ( vec ! [ 0x20 , lo, hi] ) ;
1466
1468
1467
1469
// expect that you jump to jump_dest, then pc steps forward one more time while reading a BRK
1468
1470
// (since everything is 0x00 BRK by default)
@@ -1475,19 +1477,19 @@ mod tests {
1475
1477
1476
1478
let jmp_opcode = 0x20 ;
1477
1479
let rts_opcode = 0x60 ;
1478
- cpu. load ( vec ! [ jmp_opcode] ) ;
1479
- cpu. reset ( ) ;
1480
1480
1481
1481
let jump_dest: u16 = ( CPU_START as u16 ) + 123 ;
1482
- cpu. mem_write_u16 ( ( CPU_START as u16 ) + 1 , jump_dest) ;
1483
-
1482
+ let lo = ( jump_dest & 0xff ) as u8 ;
1483
+ let hi = ( jump_dest >> 8 ) as u8 ;
1484
+ cpu. load ( vec ! [ jmp_opcode, lo, hi] ) ;
1485
+ cpu. reset ( ) ;
1484
1486
cpu. mem_write ( jump_dest, rts_opcode) ;
1485
1487
1486
1488
cpu. run ( ) ;
1487
1489
// +4 =
1488
1490
// [0 1 2 3 ]
1489
1491
// [jmp, addr, addr+1, brk] .. and +1 as last pc+1 after brek
1490
- assert_eq ! ( cpu. pc, ( CPU_START as u16 ) + 4 ) ;
1492
+ assert_eq ! ( cpu. pc, ( PRG_ROM_START + CPU_START as u16 ) + 4 ) ;
1491
1493
}
1492
1494
1493
1495
#[ test]
@@ -1532,14 +1534,19 @@ mod tests {
1532
1534
#[ test]
1533
1535
fn test_0xee_inc_absolute ( ) {
1534
1536
let mut cpu = Cpu :: new ( ) ;
1535
- let to_inc = 0x01 ;
1536
- let to_inc_addr = CPU_START as u16 + 4 ;
1537
- let inc_param_addr = CPU_START as u16 + 1 ;
1538
- cpu. load ( vec ! [ 0xee , 0x00 , 0x00 , 0x00 , to_inc] ) ;
1537
+
1538
+ let inst = 0xee ;
1539
+
1540
+ let target_val = 3 ;
1541
+ let target_address = 0x12 ; // needs to be in CPU
1542
+
1543
+ let hi = ( target_address >> 8 ) as u8 ;
1544
+ let lo = ( target_address & 0x00ff ) as u8 ;
1545
+ cpu. load ( vec ! [ inst, lo, hi, 0x00 ] ) ;
1546
+ cpu. mem_write ( target_address, target_val) ;
1539
1547
cpu. reset ( ) ;
1540
- cpu. mem_write_u16 ( inc_param_addr, to_inc_addr) ;
1541
1548
cpu. run ( ) ;
1542
- assert_eq ! ( cpu. mem_read( to_inc_addr ) , 0x02 ) ;
1549
+ assert_eq ! ( cpu. mem_read( target_address ) , 4 ) ;
1543
1550
}
1544
1551
1545
1552
#[ test]
@@ -1586,15 +1593,22 @@ mod tests {
1586
1593
let consumed_brk_op = 1 ;
1587
1594
assert_eq ! (
1588
1595
cpu. pc,
1589
- CPU_START as u16 + consumed_bpl_op + displacement as u16 + consumed_brk_op
1596
+ PRG_ROM_START
1597
+ + CPU_START as u16
1598
+ + consumed_bpl_op
1599
+ + displacement as u16
1600
+ + consumed_brk_op
1590
1601
) ;
1591
1602
1592
1603
let mut cpu = Cpu :: new ( ) ;
1593
1604
cpu. load ( program) ;
1594
1605
cpu. reset ( ) ;
1595
1606
cpu. set_flag ( flag, !branch_if) ;
1596
1607
cpu. run ( ) ;
1597
- assert_eq ! ( cpu. pc, CPU_START as u16 + consumed_bpl_op + consumed_brk_op) ;
1608
+ assert_eq ! (
1609
+ cpu. pc,
1610
+ PRG_ROM_START + CPU_START as u16 + consumed_bpl_op + consumed_brk_op
1611
+ ) ;
1598
1612
}
1599
1613
}
1600
1614
@@ -1626,14 +1640,17 @@ mod tests {
1626
1640
#[ test]
1627
1641
fn test_0x4e_lsr_shifts_absolute ( ) {
1628
1642
let mut cpu = Cpu :: new ( ) ;
1629
- let to_lsr = 0b1000_1001 ;
1630
- let to_lsr_addr = CPU_START as u16 + 4 ;
1631
- let lsr_param_addr = CPU_START as u16 + 1 ;
1632
- cpu. load ( vec ! [ 0x4e , 0x00 , 0x00 , 0x00 , to_lsr] ) ;
1643
+
1644
+ let target_val = 0b1000_1001 ;
1645
+ let target_address = 0x12 ; // needs to be in CPU
1646
+
1647
+ let hi = ( target_address >> 8 ) as u8 ;
1648
+ let lo = ( target_address & 0x00ff ) as u8 ;
1649
+ cpu. load ( vec ! [ 0x4e , lo, hi, 0x00 ] ) ;
1650
+ cpu. mem_write ( target_address, target_val) ;
1633
1651
cpu. reset ( ) ;
1634
- cpu. mem_write_u16 ( lsr_param_addr, to_lsr_addr) ;
1635
1652
cpu. run ( ) ;
1636
- assert_eq ! ( cpu. mem_read( to_lsr_addr ) , 0b0100_0100 ) ;
1653
+ assert_eq ! ( cpu. mem_read( target_address ) , 0b0100_0100 ) ;
1637
1654
assert ! ( cpu. get_flag( Flag :: Carry ) ) ;
1638
1655
}
1639
1656
@@ -1642,7 +1659,7 @@ mod tests {
1642
1659
let mut cpu = Cpu :: new ( ) ;
1643
1660
let program = vec ! [ 0xea , 0xea , 0xea , 0xea , 0x00 ] ;
1644
1661
cpu. load_and_run ( program. clone ( ) ) ;
1645
- let end = ( CPU_START + program. len ( ) ) as u16 ;
1662
+ let end = PRG_ROM_START + ( CPU_START + program. len ( ) ) as u16 ;
1646
1663
assert_eq ! ( cpu. pc, end) ;
1647
1664
}
1648
1665
@@ -1723,15 +1740,19 @@ mod tests {
1723
1740
#[ test]
1724
1741
fn test_0xce_dec_absolute ( ) {
1725
1742
let mut cpu = Cpu :: new ( ) ;
1726
- let dec = 0xce ;
1727
- let to_dec = 3 ;
1728
- let to_dec_addr = CPU_START as u16 + 4 ;
1729
- let dec_param_addr = CPU_START as u16 + 1 ;
1730
- cpu. load ( vec ! [ dec, 0x00 , 0x00 , 0x00 , to_dec] ) ;
1743
+
1744
+ let inst = 0xce ;
1745
+
1746
+ let target_val = 3 ;
1747
+ let target_address = 0x12 ; // needs to be in CPU
1748
+
1749
+ let hi = ( target_address >> 8 ) as u8 ;
1750
+ let lo = ( target_address & 0x00ff ) as u8 ;
1751
+ cpu. load ( vec ! [ inst, lo, hi, 0x00 ] ) ;
1752
+ cpu. mem_write ( target_address, target_val) ;
1731
1753
cpu. reset ( ) ;
1732
- cpu. mem_write_u16 ( dec_param_addr, to_dec_addr) ;
1733
1754
cpu. run ( ) ;
1734
- assert_eq ! ( cpu. mem_read( to_dec_addr ) , 2 ) ;
1755
+ assert_eq ! ( cpu. mem_read( target_address ) , 2 ) ;
1735
1756
}
1736
1757
1737
1758
#[ test]
@@ -1760,12 +1781,15 @@ mod tests {
1760
1781
#[ test]
1761
1782
fn test_0x0e_asl_shifts_absolute ( ) {
1762
1783
let mut cpu = Cpu :: new ( ) ;
1784
+
1763
1785
let to_lsr = 0b1000_1001 ;
1764
- let to_lsr_addr = CPU_START as u16 + 4 ;
1765
- let lsr_param_addr = CPU_START as u16 + 1 ;
1766
- cpu. load ( vec ! [ 0x0e , 0x00 , 0x00 , 0x00 , to_lsr] ) ;
1786
+ let to_lsr_addr = 0x12 ; // needs to be in CPU
1787
+
1788
+ let hi = ( to_lsr_addr >> 8 ) as u8 ;
1789
+ let lo = ( to_lsr_addr & 0x00ff ) as u8 ;
1790
+ cpu. load ( vec ! [ 0x0e , lo, hi, 0x00 ] ) ;
1791
+ cpu. mem_write ( to_lsr_addr, to_lsr) ;
1767
1792
cpu. reset ( ) ;
1768
- cpu. mem_write_u16 ( lsr_param_addr, to_lsr_addr) ;
1769
1793
cpu. run ( ) ;
1770
1794
assert_eq ! ( cpu. mem_read( to_lsr_addr) , 0b0001_0010 ) ;
1771
1795
assert ! ( cpu. get_flag( Flag :: Carry ) ) ;
0 commit comments