MCPcopy
hub / github.com/fogleman/nes / Step

Method Step

nes/cpu.go:425–492  ·  view source on GitHub ↗

Step executes a single CPU instruction

()

Source from the content-addressed store, hash-verified

423
424// Step executes a single CPU instruction
425func (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

Callers

nothing calls this directly

Calls 6

nmiMethod · 0.95
irqMethod · 0.95
Read16Method · 0.95
read16bugMethod · 0.95
pagesDifferFunction · 0.85
ReadMethod · 0.65

Tested by

no test coverage detected