diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 945c4c4ea..ec5a717e8 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -10,8 +10,11 @@ 4B14144E1B5883E500E04248 /* Atari2600.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B14144B1B5883E500E04248 /* Atari2600.mm */; }; 4B14144F1B5883E500E04248 /* OpenGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B14144D1B5883E500E04248 /* OpenGLView.m */; }; 4B1414511B5885DF00E04248 /* Atari2600.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F921B58822000787C9A /* Atari2600.cpp */; }; - 4B1414531B5885E800E04248 /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F951B58822E00787C9A /* CPU6502.cpp */; }; - 4B1414541B58860100E04248 /* CPU6502AllRAM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F971B58822E00787C9A /* CPU6502AllRAM.cpp */; }; + 4B14145B1B58879D00E04248 /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414571B58879D00E04248 /* CPU6502.cpp */; }; + 4B14145D1B5887A600E04248 /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414571B58879D00E04248 /* CPU6502.cpp */; }; + 4B14145E1B5887AA00E04248 /* CPU6502AllRAM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414591B58879D00E04248 /* CPU6502AllRAM.cpp */; }; + 4B1414601B58885000E04248 /* WolfgangLorenzTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */; }; + 4B1414621B58888700E04248 /* KlausDormannTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414611B58888700E04248 /* KlausDormannTests.swift */; }; 4BB298EE1B587D8400A49093 /* 6502_functional_test.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4BB297E01B587D8300A49093 /* 6502_functional_test.bin */; }; 4BB298EF1B587D8400A49093 /* AllSuiteA.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4BB297E11B587D8300A49093 /* AllSuiteA.bin */; }; 4BB298F01B587D8400A49093 /* TestMachine.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BB297E31B587D8300A49093 /* TestMachine.mm */; }; @@ -285,7 +288,7 @@ 4BB73EA71B587A5100552FC2 /* Atari2600Document.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4BB73EA51B587A5100552FC2 /* Atari2600Document.xib */; }; 4BB73EA91B587A5100552FC2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4BB73EA81B587A5100552FC2 /* Assets.xcassets */; }; 4BB73EAC1B587A5100552FC2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4BB73EAA1B587A5100552FC2 /* MainMenu.xib */; }; - 4BB73EB71B587A5100552FC2 /* Clock_SignalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB73EB61B587A5100552FC2 /* Clock_SignalTests.swift */; }; + 4BB73EB71B587A5100552FC2 /* AllSuiteATests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB73EB61B587A5100552FC2 /* AllSuiteATests.swift */; }; 4BB73EC21B587A5100552FC2 /* Clock_SignalUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB73EC11B587A5100552FC2 /* Clock_SignalUITests.swift */; }; /* End PBXBuildFile section */ @@ -312,12 +315,14 @@ 4B14144C1B5883E500E04248 /* OpenGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenGLView.h; sourceTree = ""; }; 4B14144D1B5883E500E04248 /* OpenGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenGLView.m; sourceTree = ""; }; 4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ClockSignal-Bridging-Header.h"; sourceTree = ""; }; + 4B1414571B58879D00E04248 /* CPU6502.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CPU6502.cpp; sourceTree = ""; }; + 4B1414581B58879D00E04248 /* CPU6502.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CPU6502.hpp; sourceTree = ""; }; + 4B1414591B58879D00E04248 /* CPU6502AllRAM.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CPU6502AllRAM.cpp; sourceTree = ""; }; + 4B14145A1B58879D00E04248 /* CPU6502AllRAM.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CPU6502AllRAM.hpp; sourceTree = ""; }; + 4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WolfgangLorenzTests.swift; sourceTree = ""; }; + 4B1414611B58888700E04248 /* KlausDormannTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KlausDormannTests.swift; sourceTree = ""; }; 4B6D7F921B58822000787C9A /* Atari2600.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Atari2600.cpp; sourceTree = ""; }; 4B6D7F931B58822000787C9A /* Atari2600.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Atari2600.hpp; sourceTree = ""; }; - 4B6D7F951B58822E00787C9A /* CPU6502.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CPU6502.cpp; path = ../../Processors/6502/CPU6502.cpp; sourceTree = ""; }; - 4B6D7F961B58822E00787C9A /* CPU6502.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = CPU6502.hpp; path = ../../Processors/6502/CPU6502.hpp; sourceTree = ""; }; - 4B6D7F971B58822E00787C9A /* CPU6502AllRAM.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CPU6502AllRAM.cpp; path = ../../Processors/6502/CPU6502AllRAM.cpp; sourceTree = ""; }; - 4B6D7F981B58822E00787C9A /* CPU6502AllRAM.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = CPU6502AllRAM.hpp; path = ../../Processors/6502/CPU6502AllRAM.hpp; sourceTree = ""; }; 4BB297DF1B587D8200A49093 /* Clock SignalTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Clock SignalTests-Bridging-Header.h"; sourceTree = ""; }; 4BB297E01B587D8300A49093 /* 6502_functional_test.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = 6502_functional_test.bin; sourceTree = ""; }; 4BB297E11B587D8300A49093 /* AllSuiteA.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = AllSuiteA.bin; sourceTree = ""; }; @@ -596,7 +601,7 @@ 4BB73EAB1B587A5100552FC2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 4BB73EAD1B587A5100552FC2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4BB73EB21B587A5100552FC2 /* Clock SignalTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Clock SignalTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BB73EB61B587A5100552FC2 /* Clock_SignalTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clock_SignalTests.swift; sourceTree = ""; }; + 4BB73EB61B587A5100552FC2 /* AllSuiteATests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllSuiteATests.swift; sourceTree = ""; }; 4BB73EB81B587A5100552FC2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4BB73EBD1B587A5100552FC2 /* Clock SignalUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Clock SignalUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 4BB73EC11B587A5100552FC2 /* Clock_SignalUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clock_SignalUITests.swift; sourceTree = ""; }; @@ -629,6 +634,17 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 4B1414561B58879D00E04248 /* 6502 */ = { + isa = PBXGroup; + children = ( + 4B1414571B58879D00E04248 /* CPU6502.cpp */, + 4B1414581B58879D00E04248 /* CPU6502.hpp */, + 4B1414591B58879D00E04248 /* CPU6502AllRAM.cpp */, + 4B14145A1B58879D00E04248 /* CPU6502AllRAM.hpp */, + ); + path = 6502; + sourceTree = ""; + }; 4BB297E41B587D8300A49093 /* Wolfgang Lorenz 6502 test suite */ = { isa = PBXGroup; children = ( @@ -950,9 +966,11 @@ 4BB297E21B587D8300A49093 /* TestMachine.h */, 4BB297E31B587D8300A49093 /* TestMachine.mm */, 4BB297E41B587D8300A49093 /* Wolfgang Lorenz 6502 test suite */, - 4BB73EB61B587A5100552FC2 /* Clock_SignalTests.swift */, + 4BB73EB61B587A5100552FC2 /* AllSuiteATests.swift */, 4BB73EB81B587A5100552FC2 /* Info.plist */, 4BB297DF1B587D8200A49093 /* Clock SignalTests-Bridging-Header.h */, + 4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */, + 4B1414611B58888700E04248 /* KlausDormannTests.swift */, ); path = "Clock SignalTests"; sourceTree = ""; @@ -979,24 +997,12 @@ 4BB73EDD1B587CA500552FC2 /* Processors */ = { isa = PBXGroup; children = ( - 4BB73EDE1B587CA500552FC2 /* 6502 */, + 4B1414561B58879D00E04248 /* 6502 */, ); name = Processors; path = ../../Processors; sourceTree = ""; }; - 4BB73EDE1B587CA500552FC2 /* 6502 */ = { - isa = PBXGroup; - children = ( - 4B6D7F951B58822E00787C9A /* CPU6502.cpp */, - 4B6D7F961B58822E00787C9A /* CPU6502.hpp */, - 4B6D7F971B58822E00787C9A /* CPU6502AllRAM.cpp */, - 4B6D7F981B58822E00787C9A /* CPU6502AllRAM.hpp */, - ); - name = 6502; - path = ../../Processors/6502; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1403,6 +1409,7 @@ 4B1414511B5885DF00E04248 /* Atari2600.cpp in Sources */, 4BB73EA41B587A5100552FC2 /* Atari2600Document.swift in Sources */, 4B14144E1B5883E500E04248 /* Atari2600.mm in Sources */, + 4B14145B1B58879D00E04248 /* CPU6502.cpp in Sources */, 4BB73EA21B587A5100552FC2 /* AppDelegate.swift in Sources */, 4B14144F1B5883E500E04248 /* OpenGLView.m in Sources */, ); @@ -1412,10 +1419,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4B1414541B58860100E04248 /* CPU6502AllRAM.cpp in Sources */, - 4B1414531B5885E800E04248 /* CPU6502.cpp in Sources */, - 4BB73EB71B587A5100552FC2 /* Clock_SignalTests.swift in Sources */, + 4B14145E1B5887AA00E04248 /* CPU6502AllRAM.cpp in Sources */, + 4B14145D1B5887A600E04248 /* CPU6502.cpp in Sources */, + 4BB73EB71B587A5100552FC2 /* AllSuiteATests.swift in Sources */, + 4B1414621B58888700E04248 /* KlausDormannTests.swift in Sources */, 4BB298F01B587D8400A49093 /* TestMachine.mm in Sources */, + 4B1414601B58885000E04248 /* WolfgangLorenzTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/OSBindings/Mac/Clock SignalTests/AllSuiteATests.swift b/OSBindings/Mac/Clock SignalTests/AllSuiteATests.swift new file mode 100644 index 000000000..66daf0610 --- /dev/null +++ b/OSBindings/Mac/Clock SignalTests/AllSuiteATests.swift @@ -0,0 +1,33 @@ +// +// Clock_SignalTests.swift +// Clock SignalTests +// +// Created by Thomas Harte on 16/07/2015. +// Copyright © 2015 Thomas Harte. All rights reserved. +// + +import XCTest +@testable import Clock_Signal + +class AllSuiteATests: XCTestCase { + + func testAllSuiteA() { + if let filename = NSBundle(forClass: self.dynamicType).pathForResource("AllSuiteA", ofType: "bin") { + if let allSuiteA = NSData(contentsOfFile: filename) { + let machine = CSTestMachine() + + machine.setData(allSuiteA, atAddress: 0x4000) + machine.setValue(CSTestMachineJamOpcode, forAddress:0x45c0); // end + + machine.setValue(0x4000, forRegister: CSTestMachineRegister.ProgramCounter) + while !machine.isJammed { + machine.runForNumberOfCycles(1000) + } + + if machine.valueForAddress(0x0210) != 0xff { + NSException(name: "Failed AllSuiteA", reason: "Failed test \(machine.valueForAddress(0x0210))", userInfo: nil).raise() + } + } + } + } +} diff --git a/OSBindings/Mac/Clock SignalTests/KlausDormannTests.swift b/OSBindings/Mac/Clock SignalTests/KlausDormannTests.swift new file mode 100644 index 000000000..ffc1aba75 --- /dev/null +++ b/OSBindings/Mac/Clock SignalTests/KlausDormannTests.swift @@ -0,0 +1,60 @@ +// +// KlausDormanTests.swift +// Clock Signal +// +// Created by Thomas Harte on 16/07/2015. +// Copyright © 2015 Thomas Harte. All rights reserved. +// + +import Foundation +import XCTest + +class KlausDormannTests: XCTestCase { + + func testKlausDormann() { + + func errorForTrapAddress(address: UInt16) -> String? { + let hexAddress = String(format:"%04x", address) + switch address { + case 0x3399: return nil // success! + + case 0x33a7: return "Decimal ADC result has wrong value" + case 0x3502: return "Binary SBC result has wrong value" + case 0x33b9: return "Decimal SBC result has wrong value" + case 0x33c0: return "Decimal SBC wrong carry flag" + case 0x36d1: return "BRK: unexpected BRK or IRQ" + case 0x36ac, 0x36f6: return "Improper JSR return address on stack" + case 0x36e5: return "BRK flag not set on stack" + case 0x26d2: return "ASL zpg,x produced incorrect flags" + + default: return "Unknown error at \(hexAddress)" + } + } + + if let filename = NSBundle(forClass: self.dynamicType).pathForResource("6502_functional_test", ofType: "bin") { + if let functionalTest = NSData(contentsOfFile: filename) { + let machine = CSTestMachine() + + machine.setData(functionalTest, atAddress: 0) + machine.setValue(0x400, forRegister: CSTestMachineRegister.ProgramCounter) + + while true { + let oldPC = machine.valueForRegister(CSTestMachineRegister.LastOperationAddress) + machine.runForNumberOfCycles(1000) + let newPC = machine.valueForRegister(CSTestMachineRegister.LastOperationAddress) + + if newPC == oldPC { + let error = errorForTrapAddress(oldPC) + + if let error = error { + NSException(name: "Failed test", reason: error, userInfo: nil).raise() + } else { + return + } + } + } + } + } + + } +} diff --git a/OSBindings/Mac/Clock SignalTests/Clock_SignalTests.swift b/OSBindings/Mac/Clock SignalTests/WolfgangLorenzTests.swift similarity index 79% rename from OSBindings/Mac/Clock SignalTests/Clock_SignalTests.swift rename to OSBindings/Mac/Clock SignalTests/WolfgangLorenzTests.swift index d18b4033b..2c9f459d1 100644 --- a/OSBindings/Mac/Clock SignalTests/Clock_SignalTests.swift +++ b/OSBindings/Mac/Clock SignalTests/WolfgangLorenzTests.swift @@ -1,84 +1,16 @@ // -// Clock_SignalTests.swift -// Clock SignalTests +// WolfgangLorenzTests.swift +// Clock Signal // // Created by Thomas Harte on 16/07/2015. // Copyright © 2015 Thomas Harte. All rights reserved. // import XCTest -@testable import Clock_Signal +import Foundation -class Clock_SignalTests: XCTestCase, CSTestMachineJamHandler { +class WolfgangLorenzTests: XCTestCase, CSTestMachineJamHandler { - func testAllSuiteA() { - if let filename = NSBundle(forClass: self.dynamicType).pathForResource("AllSuiteA", ofType: "bin") { - if let allSuiteA = NSData(contentsOfFile: filename) { - let machine = CSTestMachine() - machine.jamHandler = self - - machine.setData(allSuiteA, atAddress: 0x4000) - machine.setValue(CSTestMachineJamOpcode, forAddress:0x45c0); // end - - machine.setValue(0x4000, forRegister: CSTestMachineRegister.ProgramCounter) - while !machine.isJammed { - machine.runForNumberOfCycles(1000) - } - - if machine.valueForAddress(0x0210) != 0xff { - NSException(name: "Failed AllSuiteA", reason: "Failed test \(machine.valueForAddress(0x0210))", userInfo: nil).raise() - } - } - } - } - - func testKlausDormann() { - - func errorForTrapAddress(address: UInt16) -> String? { - let hexAddress = String(format:"%04x", address) - switch address { - case 0x3399: return nil // success! - - case 0x33a7: return "Decimal ADC result has wrong value" - case 0x3502: return "Binary SBC result has wrong value" - case 0x33b9: return "Decimal SBC result has wrong value" - case 0x33c0: return "Decimal SBC wrong carry flag" - case 0x36d1: return "BRK: unexpected BRK or IRQ" - case 0x36ac, 0x36f6: return "Improper JSR return address on stack" - case 0x36e5: return "BRK flag not set on stack" - case 0x26d2: return "ASL zpg,x produced incorrect flags" - - default: return "Unknown error at \(hexAddress)" - } - } - - if let filename = NSBundle(forClass: self.dynamicType).pathForResource("6502_functional_test", ofType: "bin") { - if let functionalTest = NSData(contentsOfFile: filename) { - let machine = CSTestMachine() - - machine.setData(functionalTest, atAddress: 0) - machine.setValue(0x400, forRegister: CSTestMachineRegister.ProgramCounter) - - while true { - let oldPC = machine.valueForRegister(CSTestMachineRegister.LastOperationAddress) - machine.runForNumberOfCycles(1000) - let newPC = machine.valueForRegister(CSTestMachineRegister.LastOperationAddress) - - if newPC == oldPC { - let error = errorForTrapAddress(oldPC) - - if let error = error { - NSException(name: "Failed test", reason: error, userInfo: nil).raise() - } else { - return - } - } - } - } - } - - } - func testWolfgangLorenzStart() { self.runWolfgangLorenzTest(" start") } @@ -386,7 +318,7 @@ class Clock_SignalTests: XCTestCase, CSTestMachineJamHandler { case 0x0000: NSException(name: "Failed test", reason: "Execution hit 0000", userInfo: nil).raise() - case 0xe16f, 0x45c0: // Wolfgang Lorenz load next (which we consider to be success) + case 0xe16f: // load next (which we consider to be success) break; default: