mirror of
https://github.com/Luigi30/FruitMachine-Swift.git
synced 2025-01-21 21:33:59 +00:00
passes all Klaus tests up to decimal test
This commit is contained in:
parent
4a15c6aff5
commit
7eb1982c5f
@ -89,7 +89,7 @@ class DebuggerViewController: NSViewController {
|
|||||||
isRunning = true
|
isRunning = true
|
||||||
|
|
||||||
cpuInstance.cycles = 0
|
cpuInstance.cycles = 0
|
||||||
cpuInstance.cyclesInBatch = 50000
|
cpuInstance.cyclesInBatch = 1000000
|
||||||
|
|
||||||
while(!cpuInstance.checkOutOfCycles() && isRunning) {
|
while(!cpuInstance.checkOutOfCycles() && isRunning) {
|
||||||
cpuStep()
|
cpuStep()
|
||||||
|
@ -173,14 +173,14 @@ func hex2bcd(hex: UInt8) -> UInt8 {
|
|||||||
|
|
||||||
class Opcodes: NSObject {
|
class Opcodes: NSObject {
|
||||||
|
|
||||||
static func _Add(state: CPU, operand: UInt8) {
|
static func _Add(state: CPU, operand: UInt8, isSubtract: Bool) {
|
||||||
if(state.accumulator == 0xFF) {
|
if(state.accumulator == 0xFF) {
|
||||||
_ = 1
|
_ = 1
|
||||||
}
|
}
|
||||||
var t16: UInt16 = UInt16(state.accumulator &+ operand) + UInt16((state.status_register.carry ? UInt8(1) : UInt8(0)))
|
var t16: UInt16 = UInt16(state.accumulator &+ operand) + UInt16((state.status_register.carry ? UInt8(1) : UInt8(0)))
|
||||||
let t8: UInt8 = UInt8(t16 & 0xFF)
|
let t8: UInt8 = UInt8(t16 & 0xFF)
|
||||||
|
|
||||||
state.status_register.overflow = (~(state.accumulator ^ operand) & (state.accumulator ^ t8) & 0x80) == 0x80
|
state.status_register.overflow = (state.accumulator & 0x80) != (t8 & 0x80)
|
||||||
state.status_register.zero = (t8 == 0)
|
state.status_register.zero = (t8 == 0)
|
||||||
state.status_register.negative = (t8 & 0x80) == 0x80
|
state.status_register.negative = (t8 & 0x80) == 0x80
|
||||||
|
|
||||||
@ -190,33 +190,30 @@ class Opcodes: NSObject {
|
|||||||
state.status_register.carry = (t16 > 255)
|
state.status_register.carry = (t16 > 255)
|
||||||
}
|
}
|
||||||
|
|
||||||
state.accumulator = (UInt8(t16 & 0xFF))
|
state.accumulator = t8
|
||||||
}
|
}
|
||||||
|
|
||||||
static func ADC(state: CPU, addressingMode: AddressingMode) -> Void {
|
static func ADC(state: CPU, addressingMode: AddressingMode) -> Void {
|
||||||
_Add(state: state, operand: UInt8(getOperandByteForAddressingMode(state: state, mode: addressingMode)))
|
_Add(state: state, operand: UInt8(getOperandByteForAddressingMode(state: state, mode: addressingMode)), isSubtract: false)
|
||||||
/*
|
|
||||||
let operand = UInt8(getOperandByteForAddressingMode(state: state, mode: addressingMode))
|
|
||||||
|
|
||||||
var t16: UInt16 = UInt16(state.accumulator &+ operand) + UInt16((state.status_register.carry ? UInt8(1) : UInt8(0)))
|
|
||||||
let t8: UInt8 = UInt8(t16 & 0xFF)
|
|
||||||
|
|
||||||
state.status_register.overflow = (~(state.accumulator ^ operand) & (state.accumulator ^ t8) & 0x80) == 0x80
|
|
||||||
state.status_register.zero = (t8 == 0)
|
|
||||||
state.status_register.negative = (t8 & 0x80) == 0x80
|
|
||||||
|
|
||||||
if(state.status_register.decimal) {
|
|
||||||
t16 = UInt16(hex2bcd(hex: state.accumulator) + hex2bcd(hex: operand) + (state.status_register.carry ? UInt8(1) : UInt8(0)))
|
|
||||||
} else {
|
|
||||||
state.status_register.carry = (t16 > 255)
|
|
||||||
}
|
|
||||||
|
|
||||||
state.accumulator = (UInt8(t16 & 0xFF))
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static func SBC(state: CPU, addressingMode: AddressingMode) -> Void {
|
static func SBC(state: CPU, addressingMode: AddressingMode) -> Void {
|
||||||
_Add(state: state, operand: ~(UInt8(getOperandByteForAddressingMode(state: state, mode: addressingMode))))
|
let operand = UInt8(getOperandByteForAddressingMode(state: state, mode: addressingMode))
|
||||||
|
var t16: UInt16 = UInt16(state.accumulator &- operand) - UInt16((state.status_register.carry ? UInt8(0) : UInt8(1)))
|
||||||
|
let t8: UInt8 = UInt8(t16 & 0xFF)
|
||||||
|
|
||||||
|
state.cyclesInBatch = 0
|
||||||
|
state.status_register.overflow = (t8 >= 0x80 && t8 <= 0xFF)
|
||||||
|
|
||||||
|
if(state.status_register.decimal == true) {
|
||||||
|
t16 = UInt16(hex2bcd(hex: state.accumulator) + hex2bcd(hex: operand) + (state.status_register.carry ? UInt8(1) : UInt8(0)))
|
||||||
|
} else {
|
||||||
|
state.status_register.carry = (t16 >> 8) == 0 ? false : true
|
||||||
|
}
|
||||||
|
|
||||||
|
state.accumulator = t8
|
||||||
|
state.updateZeroFlag(value: t8)
|
||||||
|
state.updateNegativeFlag(value: t8)
|
||||||
}
|
}
|
||||||
|
|
||||||
static func LDA(state: CPU, addressingMode: AddressingMode) -> Void {
|
static func LDA(state: CPU, addressingMode: AddressingMode) -> Void {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user