-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCartridge.py
More file actions
93 lines (76 loc) · 2.64 KB
/
Copy pathCartridge.py
File metadata and controls
93 lines (76 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import struct
from Mapper_000 import Mapper_000
# from ctypes import *
# class CARTHEADER(Structure):
# _fields_ = [
# ("name", c_char*4),
# ("prg_rom_chunks", c_uint8),
# ("chr_rom_chunks", c_uint8),
# ("mapper1", c_uint8),
# ("mapper2", c_uint8),
# ("prg_ram_size", c_uint8),
# ("tv_system_1", c_uint8),
# ("tv_system_2", c_uint8),
# ("unused", c_char*5)
# ]
class Cartridge:
MIRROR_HORIZONTAL = 0
MIRROR_VERTICAL = 1
MIRROR_ONESCREEN_LO = 2
MIRROR_ONESCREEN_HI = 3
def __init__(self, filename):
def readFile(filename):
try:
f = open(filename, 'rb')
except:
return
headerData = f.read(16)
header = struct.unpack('>4sBBBBBBB5s', headerData)
if header[3] & 0x04 > 0:
f.read(512)
self.mapperID = ((header[4] >> 4) << 4) | (header[3] >> 4)
self.mirror = self.MIRROR_VERTICAL if (header[3] & 0x01) > 0 else self.MIRROR_HORIZONTAL
fileType = 1 # assume filetype 1 for now
if fileType == 0:
pass
elif fileType == 1:
self.prgBanks = header[1]
self.prgMemory = list(f.read(self.prgBanks * 16384))
self.chrBanks = header[2]
self.chrMemory = list(f.read(self.chrBanks * 8192))
elif fileType == 2:
pass
f.close()
self.prgMemory = []
self.chrMemory = []
self.mapperID = 0
self.prgBanks = 0
self.chrBanks = 0
readFile(filename)
self.mapper = None
if self.mapperID == 0:
self.mapper = Mapper_000(self.prgBanks, self.chrBanks)
def cpuRead(self, addr):
mapped_addr = self.mapper.cpuMapRead(addr)
if mapped_addr is not None:
data = self.prgMemory[mapped_addr]
return data
return None
def cpuWrite(self, addr, data):
mapped_addr = self.mapper.cpuMapWrite(addr)
if mapped_addr is not None:
self.prgMemory[mapped_addr] = data
return data
return None
def ppuRead(self, addr):
mapped_addr = self.mapper.ppuMapRead(addr)
if mapped_addr is not None:
data = self.chrMemory[mapped_addr]
return data
return None
def ppuWrite(self, addr, data):
mapped_addr = self.mapper.ppuMapWrite(addr)
if mapped_addr is not None:
self.chrMemory[mapped_addr] = data
return data
return None