FruitMachine-Swift/FruitMachine/AppleI/AppleI.swift

83 lines
2.9 KiB
Swift
Raw Normal View History

2017-07-27 23:22:13 +00:00
//
// AppleI.swift
// FruitMachine
//
// Created by Christopher Rohl on 7/27/17.
// Copyright © 2017 Christopher Rohl. All rights reserved.
//
import Cocoa
class AppleI: NSObject {
static let sharedInstance = AppleI()
let cg = CharacterGenerator(romPath: "/Users/luigi/apple1/apple1.vid");
let terminal = Terminal()
2017-07-29 06:56:06 +00:00
//PIA 0 = KBD
//PIA 1 = DSP
//let pia = [PIA(), PIA()]
let pia: [String:PIA] = [
"keyboard": PIA(),
"display": PIA()
]
2017-07-30 06:32:53 +00:00
let emulatorViewDelegate = AppleIBitmapDisplay()
let emulatorView = AppleScreenView(frame: NSMakeRect(0, 0, 640, 384))
2017-07-27 23:22:13 +00:00
let emuScreenLayer = CALayer()
2017-07-30 06:32:53 +00:00
let emuMetalLayer = CAMetalLayer()
2017-07-27 23:22:13 +00:00
static let CPU_FREQUENCY = 1000000
static let FRAMES_PER_SECOND = 60
static let CYCLES_PER_BATCH = CPU_FREQUENCY / FRAMES_PER_SECOND
override init() {
super.init()
2017-07-29 20:11:14 +00:00
emuScreenLayer.shouldRasterize = true
2017-07-27 23:22:13 +00:00
emuScreenLayer.delegate = emulatorViewDelegate
emuScreenLayer.frame = emulatorView.bounds
2017-07-29 20:11:14 +00:00
emulatorView.wantsLayer = true
2017-07-27 23:22:13 +00:00
emuScreenLayer.setNeedsDisplay()
emulatorView.layer?.addSublayer(emuScreenLayer)
installOverrides()
for (cellNum, character) in terminal.characters.enumerated() {
emulatorViewDelegate.putCharacterPixels(charPixels: cg.getCharacterPixels(charIndex: character), pixelPosition: emulatorViewDelegate.getPixelOffset(charCellIndex: cellNum))
}
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple1/apple1.rom", offset: 0xFF00, length: 0x100)
CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple1/basic.bin", offset: 0xE000, length: 0x1000)
2017-07-27 23:22:13 +00:00
CPU.sharedInstance.performReset()
}
func installOverrides() {
CPU.sharedInstance.memoryInterface.write_overrides.append(PIAOverrides.writeDSP)
CPU.sharedInstance.memoryInterface.read_overrides.append(PIAOverrides.readDSP)
2017-07-29 06:56:06 +00:00
2017-07-29 20:11:14 +00:00
CPU.sharedInstance.memoryInterface.write_overrides.append(PIAOverrides.writeDSPCR)
2017-07-29 06:56:06 +00:00
CPU.sharedInstance.memoryInterface.read_overrides.append(PIAOverrides.readKBD)
CPU.sharedInstance.memoryInterface.read_overrides.append(PIAOverrides.readKBDCR)
2017-07-29 20:11:14 +00:00
2017-07-27 23:22:13 +00:00
}
func runFrame() {
CPU.sharedInstance.cycles = 0
CPU.sharedInstance.cyclesInBatch = AppleI.CYCLES_PER_BATCH
CPU.sharedInstance.runCyclesBatch()
//update the video display
for (cellNum, character) in terminal.characters.enumerated() {
emulatorViewDelegate.putCharacterPixels(charPixels: cg.getCharacterPixels(charIndex: character), pixelPosition: emulatorViewDelegate.getPixelOffset(charCellIndex: cellNum))
}
2017-07-29 20:11:14 +00:00
emulatorView.setNeedsDisplay(emulatorView.frame)
2017-07-27 23:22:13 +00:00
emulatorView.display()
}
}