Compare commits

..

13 Commits

Author SHA1 Message Date
omarandlorraine 54196929d8
Merge 0f1c01ce60 into 4847744518 2024-04-24 14:57:31 +01:00
Sam M W 0f1c01ce60 implement stz 2024-04-24 14:51:43 +01:00
Sam M W 2c26ebb00a decode inc a and dec a on CMOS 2024-04-24 14:51:43 +01:00
Sam M W df51b077e7 add/implement BRA instruction for CMOS 2024-04-24 14:51:43 +01:00
Sam M W 309ad50374 simpler/more obvious way to select for different implementations on derivatives 2024-04-24 14:51:43 +01:00
Sam M W 4847744518 correction to comment 2024-04-24 14:51:08 +01:00
Matthias Endler 11d9540729 fix typo 2024-04-24 15:41:25 +02:00
Sam M W bf06ad8924 better commenting inside of AddressingMode enum 2024-04-24 15:41:25 +02:00
Sam M W 54dd0cd536 rename IndirectWithFix to Indirect 2024-04-24 15:41:25 +02:00
Sam M W 2444ef52d1 fix typo in comment 2024-04-24 15:41:25 +02:00
Sam M W ad622bc930 formatting 2024-04-24 15:41:25 +02:00
Sam M W 97d6b3fd89 split the Indirect addressing mode into BuggyIndirect and IndirectWithFix 2024-04-24 15:41:25 +02:00
Sam M W da30c8c67d change arr_to_addr to address_from_bytes 2024-04-24 15:41:25 +02:00
2 changed files with 9 additions and 1 deletions

View File

@ -156,7 +156,7 @@ impl<M: Bus, V: Variant> CPU<M, V> {
// (Output: a 16-bit address)
// TODO: If the pointer ends in 0xff, then incrementing it would propagate
// the carry to the high byte of the pointer. This incurs a cost of one
// machine on the real 65C02, which is not implemented here.
// machine cycle on the real 65C02, which is not implemented here.
let slice = read_address(memory, address_from_bytes(slice[0], slice[1]));
OpInput::UseAddress(address_from_bytes(slice[0], slice[1]))
}
@ -580,6 +580,9 @@ impl<M: Bus, V: Variant> CPU<M, V> {
(Instruction::STY, OpInput::UseAddress(addr)) => {
self.memory.set_byte(addr, self.registers.index_y);
}
(Instruction::STZ, OpInput::UseAddress(addr)) => {
self.memory.set_byte(addr, 0);
}
(Instruction::TAX, OpInput::UseImplied) => {
let val = self.registers.accumulator;

View File

@ -100,6 +100,7 @@ pub enum Instruction {
STA, // STore Accumulator............. | .. ..... M = A
STX, // STore X register.............. | .. ..... M = X
STY, // STore Y register.............. | .. ..... M = Y
STZ, // STore Zero.................... | .. ..... M = Y
TAX, // Transfer Accumulator to X..... | N. ...Z. X = A
TAY, // Transfer Accumulator to Y..... | N. ...Z. Y = A
TSX, // Transfer Stack pointer to X... | N. ...Z. X = S
@ -494,6 +495,10 @@ impl crate::Variant for Cmos6502 {
0x3a => Some((Instruction::DEC, AddressingMode::Accumulator)),
0x6c => Some((Instruction::JMP, AddressingMode::Indirect)),
0x80 => Some((Instruction::BRA, AddressingMode::Relative)),
0x64 => Some((Instruction::STZ, AddressingMode::ZeroPage)),
0x74 => Some((Instruction::STZ, AddressingMode::ZeroPageX)),
0x9c => Some((Instruction::STZ, AddressingMode::Absolute)),
0x9e => Some((Instruction::STZ, AddressingMode::AbsoluteX)),
_ => Nmos6502::decode(opcode),
}
}