FruitMachine-Swift/FruitMachine/M6502/Memory/MemoryInterface.swift

93 lines
2.6 KiB
Swift
Raw Normal View History

2017-07-20 06:50:28 +00:00
//
// MemoryInterface.swift
// FruitMachine
//
// Created by Christopher Rohl on 7/20/17.
// Copyright © 2017 Christopher Rohl. All rights reserved.
//
import Cocoa
final class MemoryInterface: NSObject {
2017-08-02 08:01:06 +00:00
enum pageMode {
case ro
case rw
case null
}
2017-07-22 02:13:53 +00:00
fileprivate var memory: [UInt8]
2017-07-20 06:50:28 +00:00
var read_overrides: [ReadOverride]
var write_overrides: [WriteOverride]
2017-08-02 08:01:06 +00:00
var pages: [pageMode] = [pageMode](repeating: .null, count: 256)
2017-07-20 06:50:28 +00:00
override init() {
memory = [UInt8](repeating: 0x00, count: 65536)
read_overrides = [ReadOverride]()
write_overrides = [WriteOverride]()
2017-07-20 06:50:28 +00:00
}
2017-07-21 07:25:48 +00:00
2017-08-02 08:01:06 +00:00
func getPage(offset: UInt16) -> UInt8 {
return UInt8(offset >> 8)
}
2017-07-27 23:22:13 +00:00
func readByte(offset: UInt16, bypassOverrides: Bool = false) -> UInt8 {
if(!bypassOverrides) {
for override in read_overrides {
if case override.rangeStart ... override.rangeEnd = offset {
2017-08-03 04:31:12 +00:00
let readValue = override.action(CPU.sharedInstance, offset, nil)
2017-07-29 06:56:06 +00:00
if(!override.doRead) {
return readValue!
}
2017-07-27 23:22:13 +00:00
}
}
}
2017-08-02 08:01:06 +00:00
//If no override, check if there's memory here.
if(pages[Int(getPage(offset: offset))] == pageMode.null) {
return 0x00
}
//No match.
2017-07-21 07:25:48 +00:00
return memory[Int(offset)]
}
2017-07-27 23:22:13 +00:00
func writeByte(offset: UInt16, value: UInt8, bypassOverrides: Bool = false) {
if(!bypassOverrides) {
for override in write_overrides {
if case override.rangeStart ... override.rangeEnd = offset {
2017-08-03 04:31:12 +00:00
_ = override.action(CPU.sharedInstance, offset, value)
2017-07-29 06:56:06 +00:00
if(!override.doWrite) {
2017-07-27 23:22:13 +00:00
return
}
}
}
}
2017-08-02 08:01:06 +00:00
//If no override, check if there's memory here to write.
if(pages[Int(getPage(offset: offset))] != pageMode.rw) {
return
}
2017-07-21 07:25:48 +00:00
memory[Int(offset)] = value
}
func readWord(offset: UInt16) -> UInt16 {
let low = readByte(offset: offset)
let high = readByte(offset: offset+1)
2017-07-22 07:11:14 +00:00
return (UInt16(high) << 8) | UInt16(low)
2017-07-21 07:25:48 +00:00
}
2017-07-22 02:13:53 +00:00
func loadBinary(path: String, offset: UInt16, length: Int) {
2017-07-22 02:13:53 +00:00
do {
let fileContent: NSData = try NSData(contentsOfFile: path)
fileContent.getBytes(&memory[Int(offset)], range: NSRange(location: 0, length: length))
2017-07-22 02:13:53 +00:00
} catch {
print(error)
}
}
2017-07-20 06:50:28 +00:00
}