Step executes a single CPU instruction
()
| 423 | |
| 424 | // Step executes a single CPU instruction |
| 425 | func (cpu *CPU) Step() int { |
| 426 | if cpu.stall > 0 { |
| 427 | cpu.stall-- |
| 428 | return 1 |
| 429 | } |
| 430 | |
| 431 | cycles := cpu.Cycles |
| 432 | |
| 433 | switch cpu.interrupt { |
| 434 | case interruptNMI: |
| 435 | cpu.nmi() |
| 436 | case interruptIRQ: |
| 437 | cpu.irq() |
| 438 | } |
| 439 | cpu.interrupt = interruptNone |
| 440 | |
| 441 | opcode := cpu.Read(cpu.PC) |
| 442 | mode := instructionModes[opcode] |
| 443 | |
| 444 | var address uint16 |
| 445 | var pageCrossed bool |
| 446 | switch mode { |
| 447 | case modeAbsolute: |
| 448 | address = cpu.Read16(cpu.PC + 1) |
| 449 | case modeAbsoluteX: |
| 450 | address = cpu.Read16(cpu.PC+1) + uint16(cpu.X) |
| 451 | pageCrossed = pagesDiffer(address-uint16(cpu.X), address) |
| 452 | case modeAbsoluteY: |
| 453 | address = cpu.Read16(cpu.PC+1) + uint16(cpu.Y) |
| 454 | pageCrossed = pagesDiffer(address-uint16(cpu.Y), address) |
| 455 | case modeAccumulator: |
| 456 | address = 0 |
| 457 | case modeImmediate: |
| 458 | address = cpu.PC + 1 |
| 459 | case modeImplied: |
| 460 | address = 0 |
| 461 | case modeIndexedIndirect: |
| 462 | address = cpu.read16bug(uint16(cpu.Read(cpu.PC+1) + cpu.X)) |
| 463 | case modeIndirect: |
| 464 | address = cpu.read16bug(cpu.Read16(cpu.PC + 1)) |
| 465 | case modeIndirectIndexed: |
| 466 | address = cpu.read16bug(uint16(cpu.Read(cpu.PC+1))) + uint16(cpu.Y) |
| 467 | pageCrossed = pagesDiffer(address-uint16(cpu.Y), address) |
| 468 | case modeRelative: |
| 469 | offset := uint16(cpu.Read(cpu.PC + 1)) |
| 470 | if offset < 0x80 { |
| 471 | address = cpu.PC + 2 + offset |
| 472 | } else { |
| 473 | address = cpu.PC + 2 + offset - 0x100 |
| 474 | } |
| 475 | case modeZeroPage: |
| 476 | address = uint16(cpu.Read(cpu.PC + 1)) |
| 477 | case modeZeroPageX: |
| 478 | address = uint16(cpu.Read(cpu.PC+1)+cpu.X) & 0xff |
| 479 | case modeZeroPageY: |
| 480 | address = uint16(cpu.Read(cpu.PC+1)+cpu.Y) & 0xff |
| 481 | } |
| 482 |