|
|
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:
1.1.1.6 ! root 18: ROMDevice::ROMDevice(const std::string& objname_)
! 19: : inherited(objname_)
1.1 root 20: {
21: mask = 0xffffffff;
22: }
23:
24: ROMDevice::~ROMDevice()
25: {
26: }
27:
1.1.1.4 root 28: void
29: ROMDevice::ResetHard()
30: {
31: wait = 0;
32: }
33:
1.1 root 34: // name の ROM を探してロードする。
35: // name はパスを含まないファイル名のみ。パスはこちらで探す。
36: // mem は file をさす。
37: // 失敗した場合はエラーメッセージを表示して false を返す。
38: bool
39: ROMDevice::LoadROM(const char *name, int size)
40: {
1.1.1.3 root 41: filename = gMainApp.SearchFile(name);
1.1 root 42: if (filename.empty()) {
1.1.1.2 root 43: warnx("%s not found", name);
1.1 root 44: return false;
45: }
46:
47: // オープン
1.1.1.3 root 48: file.SetFilename(filename);
49: file.SetDispname(string_format("ROM \"%s\"", filename.c_str()));
50: mem = file.OpenRdOnly((off_t)size);
51: if (mem == NULL) {
1.1 root 52: return false;
53: }
54:
55: return true;
56: }
57:
58: uint64
59: ROMDevice::Read8(uint32 addr)
60: {
1.1.1.4 root 61: gMPU->AddCycle(wait);
1.1 root 62: return mem[addr & mask];
63: }
64:
65: uint64
66: ROMDevice::Read16(uint32 addr)
67: {
1.1.1.4 root 68: gMPU->AddCycle(wait);
1.1 root 69: uint16 data;
70: data = *(uint16 *)&mem[addr & mask];
71: return be16toh(data);
72: }
73:
74: uint64
75: ROMDevice::Read32(uint32 addr)
76: {
1.1.1.4 root 77: gMPU->AddCycle(wait);
1.1 root 78: uint32 data;
79: data = *(uint32 *)&mem[addr & mask];
80: return be32toh(data);
81: }
82:
83: uint64
84: ROMDevice::Write8(uint32 addr, uint32 data)
85: {
1.1.1.4 root 86: gMPU->AddCycle(wait); // ?
1.1 root 87: return (uint64)-1;
88: }
89:
90: uint64
91: ROMDevice::Write16(uint32 addr, uint32 data)
92: {
1.1.1.4 root 93: gMPU->AddCycle(wait); // ?
1.1 root 94: return (uint64)-1;
95: }
96:
97: uint64
98: ROMDevice::Write32(uint32 addr, uint32 data)
99: {
1.1.1.4 root 100: gMPU->AddCycle(wait); // ?
1.1 root 101: return (uint64)-1;
102: }
103:
104: uint64
105: ROMDevice::Peek8(uint32 addr)
106: {
107: return mem[addr & mask];
108: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.