Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // GamePak, A Class That Emulates An NES Game Pak
- // Copyright (C) 2018 Sam Breadman
- import Foundation
- public class GamePak {
- var prgData: [UInt8]
- var prgBankCount: Int
- var lowPrgBankIndex: Int
- var highPrgBankIndex: Int
- var sramData: [UInt8]
- let hasBattery: Bool
- var chrData: [UInt8]
- let mirrorType: UInt8
- public init(_ fileName: String) {
- let fileUrl = Bundle.main.url(forResource: fileName, withExtension: "nes")
- let fileData = try! Data(contentsOf: fileUrl!)
- let prgDataSize = Int(fileData[0x4]) * 0x4000
- self.prgData = Array(repeating: 0x0, count: prgDataSize)
- for i in 0x0..<prgDataSize {
- prgData[i] = fileData[0x10 + i]
- }
- self.prgBankCount = prgData.count / 0x4000
- self.lowPrgBankIndex = 0x0
- self.highPrgBankIndex = self.prgBankCount - 0x1
- self.sramData = Array(repeating: 0x0, count: 0x1FFF)
- self.hasBattery = (fileData[0x6] >> 0x1) & 0x1 == 0x1
- let chrDataSize = Int(fileData[0x5]) * 0x2000
- self.chrData = Array(repeating: 0x0, count: chrDataSize)
- for i in 0x0..<chrDataSize {
- chrData[i] = fileData[0x10 + prgDataSize + i]
- }
- let lowMirrorTypeNibble: UInt8 = fileData[0x6] & 0x1
- let highMirrorTypeNibble: UInt8 = (fileData[0x6] >> 0x3) & 0x1
- self.mirrorType = lowMirrorTypeNibble | (highMirrorTypeNibble << 0x1)
- }
- public func read(fromAddress address: UInt16) -> (UInt8) {
- if address < 0x2000 {
- return self.chrData[Int(address)]
- } else if address >= 0xC000 {
- let index = self.highPrgBankIndex * 0x4000 + Int(address - 0xC000)
- return self.prgData[index]
- } else if address >= 0x8000 {
- let index = self.lowPrgBankIndex * 0x4000 + Int(address - 0x8000)
- return self.prgData[index]
- } else if address >= 0x6000 {
- let index = Int(address) - 0x6000
- return sramData[index]
- } else {
- fatalError("Attempt to read outside mapper bounds")
- }
- }
- public func write(_ value: UInt8, toAddress address: UInt16) {
- if address < 0x2000 {
- self.chrData[Int(address)] = value
- } else if address >= 0x8000 {
- self.lowPrgBankIndex = Int(value) % self.prgBankCount
- } else if address >= 0x6000 {
- let index = Int(address) - 0x6000
- sramData[index] = value
- } else {
- fatalError("Attempt to write outside mapper bounds")
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement