|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #include "rom.h"
1.1.1.3 root 8: #include "mainapp.h"
1.1.1.5 ! root 9: #include "mpu.h"
1.1 root 10:
11: //
12: // ROM 共通部
13: //
14: // ROM はビッグエンディアンのままメモリに置かれるので、
15: // 必要ならアクセス時に都度変換すること。
16: //
17:
18: ROMDevice::ROMDevice()
19: {
20: logname = "rom";
21:
22: mask = 0xffffffff;
23: }
24:
25: ROMDevice::~ROMDevice()
26: {
27: }
28:
1.1.1.4 root 29: void
30: ROMDevice::ResetHard()
31: {
32: wait = 0;
33: }
34:
1.1 root 35: // name の ROM を探してロードする。
36: // name はパスを含まないファイル名のみ。パスはこちらで探す。
37: // mem は file をさす。
38: // 失敗した場合はエラーメッセージを表示して false を返す。
39: bool
40: ROMDevice::LoadROM(const char *name, int size)
41: {
1.1.1.3 root 42: filename = gMainApp.SearchFile(name);
1.1 root 43: if (filename.empty()) {
1.1.1.2 root 44: warnx("%s not found", name);
1.1 root 45: return false;
46: }
47:
48: // オープン
1.1.1.3 root 49: file.SetFilename(filename);
50: file.SetDispname(string_format("ROM \"%s\"", filename.c_str()));
51: mem = file.OpenRdOnly((off_t)size);
52: if (mem == NULL) {
1.1 root 53: return false;
54: }
55:
56: return true;
57: }
58:
59: uint64
60: ROMDevice::Read8(uint32 addr)
61: {
1.1.1.4 root 62: gMPU->AddCycle(wait);
1.1 root 63: return mem[addr & mask];
64: }
65:
66: uint64
67: ROMDevice::Read16(uint32 addr)
68: {
1.1.1.4 root 69: gMPU->AddCycle(wait);
1.1 root 70: uint16 data;
71: data = *(uint16 *)&mem[addr & mask];
72: return be16toh(data);
73: }
74:
75: uint64
76: ROMDevice::Read32(uint32 addr)
77: {
1.1.1.4 root 78: gMPU->AddCycle(wait);
1.1 root 79: uint32 data;
80: data = *(uint32 *)&mem[addr & mask];
81: return be32toh(data);
82: }
83:
84: uint64
85: ROMDevice::Write8(uint32 addr, uint32 data)
86: {
1.1.1.4 root 87: gMPU->AddCycle(wait); // ?
1.1 root 88: return (uint64)-1;
89: }
90:
91: uint64
92: ROMDevice::Write16(uint32 addr, uint32 data)
93: {
1.1.1.4 root 94: gMPU->AddCycle(wait); // ?
1.1 root 95: return (uint64)-1;
96: }
97:
98: uint64
99: ROMDevice::Write32(uint32 addr, uint32 data)
100: {
1.1.1.4 root 101: gMPU->AddCycle(wait); // ?
1.1 root 102: return (uint64)-1;
103: }
104:
105: uint64
106: ROMDevice::Peek8(uint32 addr)
107: {
108: return mem[addr & mask];
109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.