why aren't view refreshing!

This commit is contained in:
Luigi Thirty 2017-07-29 02:56:06 -04:00
parent 0c75e6f75e
commit 906fe20761
13 changed files with 129 additions and 39 deletions

View File

@ -12,6 +12,7 @@
2A5BC5191F29A28D008C03BE /* AppleScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BC5181F29A28D008C03BE /* AppleScreenView.swift */; }; 2A5BC5191F29A28D008C03BE /* AppleScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BC5181F29A28D008C03BE /* AppleScreenView.swift */; };
2A5BC51C1F29A2EB008C03BE /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A5BC51B1F29A2EB008C03BE /* QuartzCore.framework */; }; 2A5BC51C1F29A2EB008C03BE /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A5BC51B1F29A2EB008C03BE /* QuartzCore.framework */; };
2A5BC51E1F29A4C3008C03BE /* AppleScreenViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BC51D1F29A4C3008C03BE /* AppleScreenViewDelegate.swift */; }; 2A5BC51E1F29A4C3008C03BE /* AppleScreenViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BC51D1F29A4C3008C03BE /* AppleScreenViewDelegate.swift */; };
2A60851E1F2AFAE900E05B64 /* PIA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A60851D1F2AFAE900E05B64 /* PIA.swift */; };
2AA8B5F81F2A8889002B350F /* AppleI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA8B5F71F2A8889002B350F /* AppleI.swift */; }; 2AA8B5F81F2A8889002B350F /* AppleI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA8B5F71F2A8889002B350F /* AppleI.swift */; };
2AA8B5FC1F2A8EAD002B350F /* Terminal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA8B5FB1F2A8EAD002B350F /* Terminal.swift */; }; 2AA8B5FC1F2A8EAD002B350F /* Terminal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA8B5FB1F2A8EAD002B350F /* Terminal.swift */; };
2AA8B5FE1F2A942C002B350F /* PIAOverrides.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA8B5FD1F2A942C002B350F /* PIAOverrides.swift */; }; 2AA8B5FE1F2A942C002B350F /* PIAOverrides.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA8B5FD1F2A942C002B350F /* PIAOverrides.swift */; };
@ -40,6 +41,7 @@
2A5BC5181F29A28D008C03BE /* AppleScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleScreenView.swift; sourceTree = "<group>"; }; 2A5BC5181F29A28D008C03BE /* AppleScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleScreenView.swift; sourceTree = "<group>"; };
2A5BC51B1F29A2EB008C03BE /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 2A5BC51B1F29A2EB008C03BE /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
2A5BC51D1F29A4C3008C03BE /* AppleScreenViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleScreenViewDelegate.swift; sourceTree = "<group>"; }; 2A5BC51D1F29A4C3008C03BE /* AppleScreenViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleScreenViewDelegate.swift; sourceTree = "<group>"; };
2A60851D1F2AFAE900E05B64 /* PIA.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIA.swift; sourceTree = "<group>"; };
2AA8B5F71F2A8889002B350F /* AppleI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleI.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>"; }; 2AA8B5FB1F2A8EAD002B350F /* Terminal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Terminal.swift; sourceTree = "<group>"; };
2AA8B5FD1F2A942C002B350F /* PIAOverrides.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAOverrides.swift; sourceTree = "<group>"; }; 2AA8B5FD1F2A942C002B350F /* PIAOverrides.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAOverrides.swift; sourceTree = "<group>"; };
@ -92,6 +94,7 @@
2A5BC5181F29A28D008C03BE /* AppleScreenView.swift */, 2A5BC5181F29A28D008C03BE /* AppleScreenView.swift */,
2A5BC51D1F29A4C3008C03BE /* AppleScreenViewDelegate.swift */, 2A5BC51D1F29A4C3008C03BE /* AppleScreenViewDelegate.swift */,
2AA8B5F71F2A8889002B350F /* AppleI.swift */, 2AA8B5F71F2A8889002B350F /* AppleI.swift */,
2A60851D1F2AFAE900E05B64 /* PIA.swift */,
); );
path = AppleI; path = AppleI;
sourceTree = "<group>"; sourceTree = "<group>";
@ -262,6 +265,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
2A60851E1F2AFAE900E05B64 /* PIA.swift in Sources */,
2A2126841F2A9FA300E43DC1 /* DebuggerWindowController.swift in Sources */, 2A2126841F2A9FA300E43DC1 /* DebuggerWindowController.swift in Sources */,
2AD458E31F20661300F05121 /* CPUInstructions.swift in Sources */, 2AD458E31F20661300F05121 /* CPUInstructions.swift in Sources */,
2AD458D01F205EB700F05121 /* DebuggerViewController.swift in Sources */, 2AD458D01F205EB700F05121 /* DebuggerViewController.swift in Sources */,

View File

@ -14,6 +14,14 @@ class AppleI: NSObject {
let cg = CharacterGenerator(romPath: "/Users/luigi/apple1/apple1.vid"); let cg = CharacterGenerator(romPath: "/Users/luigi/apple1/apple1.vid");
let terminal = Terminal() let terminal = Terminal()
//PIA 0 = KBD
//PIA 1 = DSP
//let pia = [PIA(), PIA()]
let pia: [String:PIA] = [
"keyboard": PIA(),
"display": PIA()
]
let emulatorViewDelegate = AppleScreenViewDelegate() let emulatorViewDelegate = AppleScreenViewDelegate()
let emulatorView = AppleScreenView(frame: NSMakeRect(0, 0, 400, 384)) let emulatorView = AppleScreenView(frame: NSMakeRect(0, 0, 400, 384))
let emuScreenLayer = CALayer() let emuScreenLayer = CALayer()
@ -45,6 +53,9 @@ class AppleI: NSObject {
func installOverrides() { func installOverrides() {
CPU.sharedInstance.memoryInterface.write_overrides.append(PIAOverrides.writeDSP) CPU.sharedInstance.memoryInterface.write_overrides.append(PIAOverrides.writeDSP)
CPU.sharedInstance.memoryInterface.read_overrides.append(PIAOverrides.readDSP) CPU.sharedInstance.memoryInterface.read_overrides.append(PIAOverrides.readDSP)
CPU.sharedInstance.memoryInterface.read_overrides.append(PIAOverrides.readKBD)
CPU.sharedInstance.memoryInterface.read_overrides.append(PIAOverrides.readKBDCR)
} }
func runFrame() { func runFrame() {
@ -54,11 +65,6 @@ class AppleI: NSObject {
//update the video display //update the video display
for (cellNum, character) in terminal.characters.enumerated() { for (cellNum, character) in terminal.characters.enumerated() {
if(character == 0x8D) //CR
{
continue //ignore for now
}
emulatorViewDelegate.putCharacterPixels(charPixels: cg.getCharacterPixels(charIndex: character), pixelPosition: emulatorViewDelegate.getPixelOffset(charCellIndex: cellNum)) emulatorViewDelegate.putCharacterPixels(charPixels: cg.getCharacterPixels(charIndex: character), pixelPosition: emulatorViewDelegate.getPixelOffset(charCellIndex: cellNum))
} }

View File

@ -0,0 +1,20 @@
//
// PIA.swift
// FruitMachine
//
// Created by Christopher Rohl on 7/28/17.
// Copyright © 2017 Christopher Rohl. All rights reserved.
//
import Cocoa
class PIA: NSObject {
var data: UInt8
var control: UInt8
override init() {
data = 0x00
control = 0x00
}
}

View File

@ -38,20 +38,7 @@ class CharacterGenerator: NSObject {
/* Instead of ignoring ASCII bit b6, we ignore bit b5. At the same time ASCII bit b6 must be inverted before it is fed to the character ROM. This way the entire character range from $40 to $7F will end up in the range $00 to $1F (twice of course). Now lower case characters are automatically translated into their corresponding upper case bit maps. /* Instead of ignoring ASCII bit b6, we ignore bit b5. At the same time ASCII bit b6 must be inverted before it is fed to the character ROM. This way the entire character range from $40 to $7F will end up in the range $00 to $1F (twice of course). Now lower case characters are automatically translated into their corresponding upper case bit maps.
*/ */
var convertedCharIndex = charIndex & 0x7F var convertedCharIndex = (charIndex & 0x1f) | (((charIndex ^ 0x40) & 0x40) >> 1)
convertedCharIndex = convertedCharIndex & ~(0x20)
convertedCharIndex = convertedCharIndex & ~(0x40)
/*
if((convertedCharIndex & 0x40) == 0x40)
{
convertedCharIndex = convertedCharIndex & ~(0x40)
}
else
{
convertedCharIndex = convertedCharIndex | 0x40
}
*/
for scanlineIndex in 0..<CharacterGenerator.CHAR_HEIGHT { for scanlineIndex in 0..<CharacterGenerator.CHAR_HEIGHT {
pixelArray[scanlineIndex] = ROM[scanlineIndex + (Int(convertedCharIndex) * CharacterGenerator.CHAR_HEIGHT)] pixelArray[scanlineIndex] = ROM[scanlineIndex + (Int(convertedCharIndex) * CharacterGenerator.CHAR_HEIGHT)]

View File

@ -9,15 +9,41 @@
import Cocoa import Cocoa
class PIAOverrides: NSObject { class PIAOverrides: NSObject {
static let writeDSP = WriteOverride(start: 0xD012, end: 0xD012, writeValue: false, action: PIAOverrides.actionWriteDSP) static let writeDSP = WriteOverride(start: 0xD012, end: 0xD012, writeAnyway: false, action: PIAOverrides.actionWriteDSP)
static func actionWriteDSP(terminal: AnyObject, byte: UInt8?) -> Void { static func actionWriteDSP(terminal: AnyObject, byte: UInt8?) -> UInt8? {
//(terminal as! Terminal).putCharacter(charIndex: byte!) //TODO: implement actual 6520 PIA behavior
//Writing to DSP sets DSP.7
AppleI.sharedInstance.pia["display"]!.data = byte! | 0x80
//Output our character to the terminal
AppleI.sharedInstance.terminal.putCharacter(charIndex: byte!) AppleI.sharedInstance.terminal.putCharacter(charIndex: byte!)
AppleI.sharedInstance.pia["display"]!.data = byte! & ~(0x80)
return nil;
} }
static let readDSP = ReadOverride(start: 0xD012, end: 0xD012, writeValue: false, action: PIAOverrides.actionReadDSP) static let readDSP = ReadOverride(start: 0xD012, end: 0xD012, readAnyway: false, action: PIAOverrides.actionReadDSP)
static func actionReadDSP(terminal: AnyObject, byte: UInt8?) -> Void { static func actionReadDSP(terminal: AnyObject, byte: UInt8?) -> UInt8? {
CPU.sharedInstance.memoryInterface.writeByte(offset: 0xD012, value: CPU.sharedInstance.memoryInterface.readByte(offset: 0xD012, bypassOverrides: true) & 0x7F, bypassOverrides: true) //the display is always ready
//DSP.7 is unset when the character is accepted by the terminal
return AppleI.sharedInstance.pia["display"]!.data
}
/* */
static let readKBDCR = ReadOverride(start: 0xD011, end: 0xD011, readAnyway: false, action: PIAOverrides.actionReadKBDCR)
static func actionReadKBDCR(terminal: AnyObject, byte: UInt8?) -> UInt8? {
return AppleI.sharedInstance.pia["keyboard"]!.control
}
/* */
static let readKBD = ReadOverride(start: 0xD010, end: 0xD010, readAnyway: false, action: PIAOverrides.actionReadKBD)
static func actionReadKBD(terminal: AnyObject, byte: UInt8?) -> UInt8? {
//Reading KBD clears KBDCR.7
AppleI.sharedInstance.pia["keyboard"]!.control = AppleI.sharedInstance.pia["keyboard"]!.control & ~(0x80)
//KBD.7 is tied to +5V
return AppleI.sharedInstance.pia["keyboard"]!.data | 0x80
} }
} }

View File

@ -22,7 +22,7 @@ class Terminal: NSObject {
override init() { override init() {
cursorPosition = Cell(x: 0, y: 0) cursorPosition = Cell(x: 0, y: 0)
characters = [UInt8](repeating: 0x40, count: Terminal.CELLS_WIDTH * Terminal.CELLS_HEIGHT) characters = [UInt8](repeating: 0x00, count: Terminal.CELLS_WIDTH * Terminal.CELLS_HEIGHT)
} }
func cellToIndex(cell: Cell) -> Int { func cellToIndex(cell: Cell) -> Int {
@ -30,8 +30,14 @@ class Terminal: NSObject {
} }
func putCharacter(charIndex: UInt8) { func putCharacter(charIndex: UInt8) {
characters[cellToIndex(cell: cursorPosition)] = charIndex if(charIndex == 0x8D)
advanceCursor() {
carriageReturn()
}
else {
characters[cellToIndex(cell: cursorPosition)] = charIndex
advanceCursor()
}
} }
func advanceCursor() { func advanceCursor() {
@ -44,4 +50,12 @@ class Terminal: NSObject {
} }
} }
} }
func carriageReturn() {
cursorPosition.x = 0
cursorPosition.y += 1
if(cursorPosition.y == Terminal.CELLS_HEIGHT) {
cursorPosition.y = 0
}
}
} }

View File

@ -309,7 +309,7 @@
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gOM-wQ-387"> <textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gOM-wQ-387">
<rect key="frame" x="42" y="20" width="388" height="22"/> <rect key="frame" x="42" y="20" width="388" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" state="on" borderStyle="bezel" title="debuggerInput" drawsBackground="YES" usesSingleLineMode="YES" id="Tgu-VW-lrU"> <textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" state="on" borderStyle="bezel" placeholderString="" drawsBackground="YES" usesSingleLineMode="YES" id="Tgu-VW-lrU">
<font key="font" metaFont="fixedUser" size="11"/> <font key="font" metaFont="fixedUser" size="11"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>

View File

@ -48,10 +48,15 @@ extension DebuggerViewController {
class DebuggerCommands: NSObject { class DebuggerCommands: NSObject {
static func bplist(state: CPU, parameters: [String]) -> String { static func bplist(state: CPU, parameters: [String]) -> String {
var output = "" var output = ""
for (index, bp) in state.breakpoints.enumerated() {
output += "Breakpoint \(index): $\(bp.asHexString())\r\n" if(state.breakpoints.count > 0){
for (index, bp) in state.breakpoints.enumerated() {
output += "Breakpoint \(index): $\(bp.asHexString())\r\n"
}
} }
output = "No breakpoints are set."
return output return output
} }

View File

@ -26,7 +26,10 @@ class MemoryInterface: NSObject {
if(!bypassOverrides) { if(!bypassOverrides) {
for override in read_overrides { for override in read_overrides {
if case override.rangeStart ... override.rangeEnd = offset { if case override.rangeStart ... override.rangeEnd = offset {
override.action(CPU.sharedInstance, nil) let readValue = override.action(CPU.sharedInstance, nil)
if(!override.doRead) {
return readValue!
}
} }
} }
} }
@ -41,7 +44,7 @@ class MemoryInterface: NSObject {
for override in write_overrides { for override in write_overrides {
if case override.rangeStart ... override.rangeEnd = offset { if case override.rangeStart ... override.rangeEnd = offset {
override.action(CPU.sharedInstance, value) override.action(CPU.sharedInstance, value)
if(!override.writeValue) { if(!override.doWrite) {
return return
} }
} }

View File

@ -11,14 +11,12 @@ import Cocoa
class MemoryOverride: NSObject { class MemoryOverride: NSObject {
let rangeStart: UInt16 let rangeStart: UInt16
let rangeEnd: UInt16 let rangeEnd: UInt16
let writeValue: Bool
let action: (CPU, UInt8?) -> Void let action: (CPU, UInt8?) -> UInt8?
init(start: UInt16, end: UInt16, writeValue: Bool, action: @escaping (AnyObject, UInt8?) -> Void) { init(start: UInt16, end: UInt16, action: @escaping (AnyObject, UInt8?) -> UInt8?) {
rangeStart = start rangeStart = start
rangeEnd = end rangeEnd = end
self.writeValue = writeValue
self.action = action self.action = action
} }

View File

@ -12,5 +12,10 @@ import Cocoa
Memory-mapped registers, peripherals, etc. */ Memory-mapped registers, peripherals, etc. */
class ReadOverride: MemoryOverride { class ReadOverride: MemoryOverride {
let doRead: Bool //do we write anyway?
init(start: UInt16, end: UInt16, readAnyway: Bool, action: @escaping (AnyObject, UInt8?) -> UInt8?) {
doRead = readAnyway
super.init(start: start, end: end, action: action)
}
} }

View File

@ -12,5 +12,10 @@ import Cocoa
Memory-mapped registers, peripherals, etc. */ Memory-mapped registers, peripherals, etc. */
class WriteOverride: MemoryOverride { class WriteOverride: MemoryOverride {
let doWrite: Bool //do we write anyway?
init(start: UInt16, end: UInt16, writeAnyway: Bool, action: @escaping (AnyObject, UInt8?) -> UInt8?) {
doWrite = writeAnyway
super.init(start: start, end: end, action: action)
}
} }

View File

@ -12,9 +12,11 @@ import CoreGraphics
class MainViewController: NSViewController { class MainViewController: NSViewController {
let computer = AppleI.sharedInstance let computer = AppleI.sharedInstance
var debuggerWindowController: DebuggerWindowController! var debuggerWindowController: DebuggerWindowController!
var isPaused = false
var frameTimer: Timer?
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
@ -26,7 +28,22 @@ class MainViewController: NSViewController {
self.view.addSubview(computer.emulatorView) self.view.addSubview(computer.emulatorView)
computer.emulatorView.display() computer.emulatorView.display()
computer.runFrame() self.frameTimer = Timer.scheduledTimer(timeInterval: 1/60, target: self, selector: #selector(runEmulation), userInfo: nil, repeats: true)
//runEmulation()
}
@objc func runEmulation() {
AppleI.sharedInstance.runFrame()
computer.emulatorView.setNeedsDisplay(computer.emulatorView.frame)
computer.emulatorView.layer!.setNeedsDisplay(computer.emulatorView.layer!.frame)
computer.emulatorView.display()
}
override func keyDown(with event: NSEvent) {
let character = event.characters?.first
computer.pia["keyboard"]?.data = 0x41
computer.pia["keyboard"]?.control |= 0x80
} }
} }