carry flag problem

This commit is contained in:
Luigi Thirty 2017-08-02 04:01:06 -04:00
parent 16ad485931
commit 4efe09ad30
9 changed files with 105 additions and 67 deletions

View File

@ -22,6 +22,7 @@
2A6DC7F01F30495D0066FE0D /* ScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A6DC7EF1F30495D0066FE0D /* ScreenView.swift */; };
2A7665781F2F05F600135518 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7665761F2F05F600135518 /* PreferencesWindowController.swift */; };
2A7665791F2F05F600135518 /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A7665771F2F05F600135518 /* PreferencesWindow.xib */; };
2A86FB971F316CB500AD0C68 /* KeyboardController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A86FB961F316CB500AD0C68 /* KeyboardController.swift */; };
2A91852A1F2EA84D00A9E5BE /* BitmapPixels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9185291F2EA84D00A9E5BE /* BitmapPixels.swift */; };
2AA8B5F81F2A8889002B350F /* AppleI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA8B5F71F2A8889002B350F /* AppleI.swift */; };
2AA8B5FC1F2A8EAD002B350F /* Terminal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA8B5FB1F2A8EAD002B350F /* Terminal.swift */; };
@ -62,6 +63,7 @@
2A6DC7EF1F30495D0066FE0D /* ScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenView.swift; sourceTree = "<group>"; };
2A7665761F2F05F600135518 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = "<group>"; };
2A7665771F2F05F600135518 /* PreferencesWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = "<group>"; };
2A86FB961F316CB500AD0C68 /* KeyboardController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardController.swift; sourceTree = "<group>"; };
2A9185291F2EA84D00A9E5BE /* BitmapPixels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BitmapPixels.swift; sourceTree = "<group>"; };
2AA8B5F71F2A8889002B350F /* AppleI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleI.swift; sourceTree = "<group>"; };
2AA8B5FB1F2A8EAD002B350F /* Terminal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Terminal.swift; sourceTree = "<group>"; };
@ -163,6 +165,7 @@
children = (
2A6DC7EE1F30492E0066FE0D /* Video */,
2AB6CACC1F3041A200DECAC0 /* AppleII.swift */,
2A86FB961F316CB500AD0C68 /* KeyboardController.swift */,
2A6C2D161F31216700B8DC60 /* SoftswitchOverrides.swift */,
);
path = AppleII;
@ -358,6 +361,7 @@
2AD6D5841F26E6BF008F3CF5 /* DebuggerCommands.swift in Sources */,
2AE5BA041F23DE4400FAA343 /* Disassembly.swift in Sources */,
2A6DC7EB1F3045C90066FE0D /* EmulatedSystem.swift in Sources */,
2A86FB971F316CB500AD0C68 /* KeyboardController.swift in Sources */,
2AE42E3A1F28628300C4900E /* AppleIViewController.swift in Sources */,
2AD458E51F2070DF00F05121 /* Opcodes.swift in Sources */,
2AE42E081F2850F400C4900E /* ReadOverride.swift in Sources */,

View File

@ -14,6 +14,7 @@ class AppleII: NSObject, EmulatedSystem {
var frameCounter: Int = 0
let cg = A2CharacterGenerator(romPath: "/Users/luigi/apple2/a2.chr");
let keyboardController = KeyboardController()
var CPU_FREQUENCY: Double
var FRAMES_PER_SECOND: Double
@ -30,6 +31,7 @@ class AppleII: NSObject, EmulatedSystem {
super.init()
loadROMs()
setupMemory(ramConfig: .sixteenK)
emuScreenLayer.shouldRasterize = true
emuScreenLayer.delegate = emulatorViewDelegate
@ -42,14 +44,21 @@ class AppleII: NSObject, EmulatedSystem {
installOverrides()
doReset()
}
func doReset() {
CPU.sharedInstance.performReset()
}
func loadROMs() {
/*
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0001-00.e0", offset: 0xE000, length: 0x800)
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0002-00.e8", offset: 0xE800, length: 0x800)
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0003-00.f0", offset: 0xF000, length: 0x800)
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple2/341-0004-00.f8", offset: 0xF800, length: 0x800)
*/
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/6502/test.bin", offset: 0x0000, length: 0x10000)
}
func installOverrides() {
@ -89,4 +98,33 @@ class AppleII: NSObject, EmulatedSystem {
emulatorView.setNeedsDisplay(emulatorView.frame)
}
enum MemoryConfiguration {
case fourK
case sixteenK
case fortyeightK
}
func setupMemory(ramConfig: MemoryConfiguration) {
let ramPages: Int
switch ramConfig {
case .fourK:
ramPages = 4096 / 256
case .sixteenK:
ramPages = 16384 / 256
case .fortyeightK:
ramPages = 49152 / 256
}
for page in 0 ..< ramPages {
CPU.sharedInstance.memoryInterface.pages[page] = MemoryInterface.pageMode.rw //RAM
}
for page in ramPages ..< 192 {
CPU.sharedInstance.memoryInterface.pages[page] = MemoryInterface.pageMode.null //not connected
}
for page in 224 ..< 256 {
CPU.sharedInstance.memoryInterface.pages[page] = MemoryInterface.pageMode.ro //not connected
}
}
}

View File

@ -0,0 +1,14 @@
//
// KeyboardController.swift
// FruitMachine
//
// Created by Christopher Rohl on 8/1/17.
// Copyright © 2017 Christopher Rohl. All rights reserved.
//
import Cocoa
class KeyboardController: NSObject {
var KEYBOARD: UInt8 = 0x00
var STROBE: UInt8 = 0x00
}

View File

@ -13,11 +13,10 @@ extension AppleII {
class SoftswitchOverrides: NSObject {
static let readKeyboard = ReadOverride(start: 0xC000, end: 0xC000, readAnyway: false, action: SoftswitchOverrides.actionReadKeyboard)
static func actionReadKeyboard(dummy: AnyObject, byte: UInt8?) -> UInt8? {
let b = CPU.sharedInstance.memoryInterface.readByte(offset: 0xC000, bypassOverrides: true)
CPU.sharedInstance.memoryInterface.writeByte(offset: 0xC000, value: b)
return b
//let b = CPU.sharedInstance.memoryInterface.readByte(offset: 0xC000, bypassOverrides: true)
//CPU.sharedInstance.memoryInterface.writeByte(offset: 0xC000, value: b)
//return b
return AppleII.sharedInstance.keyboardController.KEYBOARD
}
static let clearKeypressStrobeR = ReadOverride(start: 0xC010, end: 0xC010, readAnyway: false, action: SoftswitchOverrides.actionClearKeypressStrobe)
@ -25,10 +24,14 @@ extension AppleII {
static func actionClearKeypressStrobe(dummy: AnyObject, byte: UInt8?) -> UInt8? {
//Clears b7 of $C000 on write.
let b = CPU.sharedInstance.memoryInterface.readByte(offset: 0xC000, bypassOverrides: true)
CPU.sharedInstance.memoryInterface.writeByte(offset: 0xC000, value: b & 0x7F, bypassOverrides: true)
//let b = CPU.sharedInstance.memoryInterface.readByte(offset: 0xC000, bypassOverrides: true)
//CPU.sharedInstance.memoryInterface.writeByte(offset: 0xC000, value: b & 0x7F, bypassOverrides: true)
//CPU.sharedInstance.memoryInterface.writeByte(offset: 0xC010, value: b & 0x7F, bypassOverrides: true)
//return b
let b = AppleII.sharedInstance.keyboardController.KEYBOARD
AppleII.sharedInstance.keyboardController.KEYBOARD = b & 0x7F
AppleII.sharedInstance.keyboardController.STROBE = b & 0x7F
return b
}
}

View File

@ -25,11 +25,15 @@ class AppleIIViewController: NSViewController {
self.view.addSubview(computer.emulatorView)
/*
self.frameTimer = Timer.scheduledTimer(timeInterval: 1.0/60.0,
target: self,
selector: #selector(runEmulation),
userInfo: nil,
repeats: true)
*/
CPU.sharedInstance.program_counter = 0x400
}
@objc func runEmulation() {
@ -39,7 +43,7 @@ class AppleIIViewController: NSViewController {
}
}
@IBAction func showDebugger(_ sender: Any) {
@IBAction func showDebugger(_ sender: Any) {
let debuggerStoryboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Debugger"), bundle: nil)
debuggerWindowController = debuggerStoryboard.instantiateInitialController() as! DebuggerWindowController
debuggerWindowController.showWindow(self)
@ -49,6 +53,10 @@ class AppleIIViewController: NSViewController {
preferencesWindowController.loadWindow()
}
@IBAction func doReset(_ sender: Any) {
computer.doReset()
}
override func keyDown(with event: NSEvent) {
let c = returnChar(theEvent: event)
@ -56,8 +64,8 @@ class AppleIIViewController: NSViewController {
return
}
//Poke the ASCII byte into $C000.
CPU.sharedInstance.memoryInterface.writeByte(offset: 0xC000, value: UInt8((ascii32 | 0x80) & 0x000000FF))
//Set the keyboard input register accordingly. Set b7 so the OS knows there's a keypress waiting
computer.keyboardController.KEYBOARD = UInt8((ascii32 | 0x80) & 0x000000FF)
}
private func returnChar(theEvent: NSEvent) -> Character?{

View File

@ -64,60 +64,9 @@
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<menuItem title="Reset" keyEquivalent="r" id="aTl-1u-JFS">
<connections>
<action selector="newDocument:" target="Ady-hI-5gd" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="Ady-hI-5gd" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="Ady-hI-5gd" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="Ady-hI-5gd" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="Ady-hI-5gd" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="Ady-hI-5gd" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
<connections>
<action selector="revertDocumentToSaved:" target="Ady-hI-5gd" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="Ady-hI-5gd" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="Ady-hI-5gd" id="qaZ-4w-aoO"/>
<action selector="doReset:" target="Ady-hI-5gd" id="7dg-B5-6Ok"/>
</connections>
</menuItem>
</items>

View File

@ -46,7 +46,7 @@ class DebuggerViewController: NSViewController {
text_CPU_SR.stringValue = String(format:"%02X", cpuInstance.stack_pointer)
text_CPU_Flags.stringValue = String(cpuInstance.status_register.asString())
disassembly = cpuInstance.disassemble(fromAddress: CPU.sharedInstance.program_counter, length: 256)
disassembly = cpuInstance.disassemble(fromAddress: CPU.sharedInstance.program_counter &- 16, length: 256)
debuggerTableView.reloadData()
highlightCurrentInstruction()
}
@ -58,7 +58,7 @@ class DebuggerViewController: NSViewController {
debuggerTableView.dataSource = self
updateCPUStatusFields()
disassembly = cpuInstance.disassemble(fromAddress: CPU.sharedInstance.program_counter, length: 256)
disassembly = cpuInstance.disassemble(fromAddress: CPU.sharedInstance.program_counter &- 16, length: 256)
debuggerTableView.reloadData()
// Do any additional setup after loading the view.

View File

@ -9,20 +9,31 @@
import Cocoa
final class MemoryInterface: NSObject {
enum pageMode {
case ro
case rw
case null
}
fileprivate var memory: [UInt8]
var read_overrides: [ReadOverride]
var write_overrides: [WriteOverride]
var pages: [pageMode] = [pageMode](repeating: .null, count: 256)
override init() {
memory = [UInt8](repeating: 0x00, count: 65536)
read_overrides = [ReadOverride]()
write_overrides = [WriteOverride]()
}
func getPage(offset: UInt16) -> UInt8 {
return UInt8(offset >> 8)
}
func readByte(offset: UInt16, bypassOverrides: Bool = false) -> UInt8 {
if(!bypassOverrides) {
for override in read_overrides {
if case override.rangeStart ... override.rangeEnd = offset {
@ -34,6 +45,11 @@ final class MemoryInterface: NSObject {
}
}
//If no override, check if there's memory here.
if(pages[Int(getPage(offset: offset))] == pageMode.null) {
return 0x00
}
//No match.
return memory[Int(offset)]
}
@ -51,6 +67,11 @@ final class MemoryInterface: NSObject {
}
}
//If no override, check if there's memory here to write.
if(pages[Int(getPage(offset: offset))] != pageMode.rw) {
return
}
memory[Int(offset)] = value
}

View File

@ -175,7 +175,8 @@ final class Opcodes: NSObject {
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 = t8 <= 127 ? true : false
//carry flag isn't being set properly
state.status_register.carry = (t8 >= 127) ? true : false
}
state.accumulator = t8