mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-29 12:50:28 +00:00
Added test for NOP, discovering the undocumented ones to be the incorrect length.
This commit is contained in:
parent
6616265d93
commit
cc98534f94
@ -41,6 +41,14 @@ class TimingTests: XCTestCase, CSTestMachineJamHandler {
|
|||||||
self.runTest(code, expectedRunLength: 48)
|
self.runTest(code, expectedRunLength: 48)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testBIT() {
|
||||||
|
let code: [UInt8] = [
|
||||||
|
0x24, 0x2a, // [3] BIT $2a
|
||||||
|
0x2c, 0x2a, 0x2b, // [4] BIT $2b2a
|
||||||
|
CSTestMachineJamOpcode]
|
||||||
|
self.runTest(code, expectedRunLength: 7)
|
||||||
|
}
|
||||||
|
|
||||||
func testSTA() {
|
func testSTA() {
|
||||||
let code: [UInt8] = [
|
let code: [UInt8] = [
|
||||||
0x85, 0x00, // [3] STA $00
|
0x85, 0x00, // [3] STA $00
|
||||||
@ -140,6 +148,53 @@ class TimingTests: XCTestCase, CSTestMachineJamHandler {
|
|||||||
self.runTest(code, expectedRunLength: 11)
|
self.runTest(code, expectedRunLength: 11)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testSnippet3() {
|
||||||
|
let code: [UInt8] = [
|
||||||
|
0x20, 0x04, 0x02, // [6] JSR $0204
|
||||||
|
CSTestMachineJamOpcode,
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x85, 0x09, // [3] STA $09
|
||||||
|
0x85, 0x09, // [3] STA $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x85, 0x09, // [3] STA $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x85, 0x09, // [3] STA $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x86, 0x09, // [3] STX $09
|
||||||
|
0x87, 0x09, // [3] SAX $09
|
||||||
|
0x60, // [6] RTS
|
||||||
|
CSTestMachineJamOpcode]
|
||||||
|
self.runTest(code, expectedRunLength: 66)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testNOP() {
|
||||||
|
let code: [UInt8] = [
|
||||||
|
0x04, 0x00, // [3] NOP zpg
|
||||||
|
0x14, 0x00, // [4] NOP zpg, x
|
||||||
|
0x34, 0x00, // [4] NOP zpg, x
|
||||||
|
0x44, 0x00, // [3] NOP zpg
|
||||||
|
0x54, 0x00, // [4] NOP zpg, x
|
||||||
|
0x64, 0x00, // [3] NOP zpg
|
||||||
|
0x74, 0x00, // [4] NOP zpg, x
|
||||||
|
0x80, 0x00, // [2] NOP #
|
||||||
|
0x82, 0x00, // [2] NOP #
|
||||||
|
0x89, 0x00, // [2] NOP #
|
||||||
|
0xc2, 0x00, // [2] NOP #
|
||||||
|
0xd4, 0x00, // [4] NOP zpg, x
|
||||||
|
0xe2, 0x00, // [2] NOP #
|
||||||
|
0xf4, 0x00, // [4] NOP zpg, x
|
||||||
|
CSTestMachineJamOpcode]
|
||||||
|
self.runTest(code, expectedRunLength: 43)
|
||||||
|
}
|
||||||
|
|
||||||
func runTest(code: [UInt8], expectedRunLength: UInt32) {
|
func runTest(code: [UInt8], expectedRunLength: UInt32) {
|
||||||
let machine = CSTestMachine()
|
let machine = CSTestMachine()
|
||||||
|
|
||||||
|
@ -149,14 +149,14 @@ template <class T> class Processor {
|
|||||||
#define IndirectIndexedr CycleIncrementPCFetchAddressLowFromOperand, CycleIncrementOperandFetchAddressHigh, CycleAddYToAddressLow, OperationCorrectAddressHigh
|
#define IndirectIndexedr CycleIncrementPCFetchAddressLowFromOperand, CycleIncrementOperandFetchAddressHigh, CycleAddYToAddressLow, OperationCorrectAddressHigh
|
||||||
#define IndirectIndexed CycleIncrementPCFetchAddressLowFromOperand, CycleIncrementOperandFetchAddressHigh, CycleAddYToAddressLowRead, OperationCorrectAddressHigh
|
#define IndirectIndexed CycleIncrementPCFetchAddressLowFromOperand, CycleIncrementOperandFetchAddressHigh, CycleAddYToAddressLowRead, OperationCorrectAddressHigh
|
||||||
|
|
||||||
#define Read(op) CycleFetchOperandFromAddress, op
|
#define Read(...) CycleFetchOperandFromAddress, __VA_ARGS__
|
||||||
#define Write(op) op, CycleWriteOperandToAddress
|
#define Write(...) __VA_ARGS__, CycleWriteOperandToAddress
|
||||||
#define ReadModifyWrite(...) CycleFetchOperandFromAddress, CycleWriteOperandToAddress, __VA_ARGS__, CycleWriteOperandToAddress
|
#define ReadModifyWrite(...) CycleFetchOperandFromAddress, CycleWriteOperandToAddress, __VA_ARGS__, CycleWriteOperandToAddress
|
||||||
|
|
||||||
#define AbsoluteRead(op) Program(Absolute, Read(op))
|
#define AbsoluteRead(op) Program(Absolute, Read(op))
|
||||||
#define AbsoluteXRead(op) Program(AbsoluteXr, Read(op))
|
#define AbsoluteXRead(op) Program(AbsoluteXr, Read(op))
|
||||||
#define AbsoluteYRead(op) Program(AbsoluteYr, Read(op))
|
#define AbsoluteYRead(op) Program(AbsoluteYr, Read(op))
|
||||||
#define ZeroRead(op) Program(Zero, Read(op))
|
#define ZeroRead(...) Program(Zero, Read(__VA_ARGS__))
|
||||||
#define ZeroXRead(op) Program(ZeroX, Read(op))
|
#define ZeroXRead(op) Program(ZeroX, Read(op))
|
||||||
#define ZeroYRead(op) Program(ZeroY, Read(op))
|
#define ZeroYRead(op) Program(ZeroY, Read(op))
|
||||||
#define IndexedIndirectRead(op) Program(IndexedIndirect, Read(op))
|
#define IndexedIndirectRead(op) Program(IndexedIndirect, Read(op))
|
||||||
@ -183,8 +183,8 @@ template <class T> class Processor {
|
|||||||
#define Immediate(op) Program(OperationIncrementPC, op)
|
#define Immediate(op) Program(OperationIncrementPC, op)
|
||||||
#define Implied(op) Program(OperationCopyOperandFromA, op, OperationCopyOperandToA)
|
#define Implied(op) Program(OperationCopyOperandFromA, op, OperationCopyOperandToA)
|
||||||
|
|
||||||
#define ZeroNop() Program(Zero)
|
#define ZeroNop() Program(Zero, CycleFetchOperandFromAddress)
|
||||||
#define ZeroXNop() Program(ZeroX)
|
#define ZeroXNop() Program(ZeroX, CycleFetchOperandFromAddress)
|
||||||
#define AbsoluteNop() Program(Absolute)
|
#define AbsoluteNop() Program(Absolute)
|
||||||
#define AbsoluteXNop() Program(AbsoluteX)
|
#define AbsoluteXNop() Program(AbsoluteX)
|
||||||
#define ImpliedNop() {OperationMoveToNextProgram}
|
#define ImpliedNop() {OperationMoveToNextProgram}
|
||||||
@ -460,11 +460,18 @@ template <class T> class Processor {
|
|||||||
|
|
||||||
#pragma mark - Fetch/Decode
|
#pragma mark - Fetch/Decode
|
||||||
|
|
||||||
case CycleFetchOperation:
|
case CycleFetchOperation: {
|
||||||
_lastOperationPC = _pc;
|
_lastOperationPC = _pc;
|
||||||
_pc.full++;
|
_pc.full++;
|
||||||
read_op(_operation, _lastOperationPC.full);
|
read_op(_operation, _lastOperationPC.full);
|
||||||
break;
|
|
||||||
|
// static int last_cycles_left_to_run = 0;
|
||||||
|
// if(last_cycles_left_to_run > _cycles_left_to_run)
|
||||||
|
// printf("%02x %d\n", _operation, last_cycles_left_to_run - _cycles_left_to_run);
|
||||||
|
// else
|
||||||
|
// printf("%02x\n", _operation);
|
||||||
|
// last_cycles_left_to_run = _cycles_left_to_run;
|
||||||
|
} break;
|
||||||
|
|
||||||
case CycleFetchOperand:
|
case CycleFetchOperand:
|
||||||
read_mem(_operand, _pc.full);
|
read_mem(_operand, _pc.full);
|
||||||
|
Loading…
Reference in New Issue
Block a user