|
|
1.1 root 1: //
2: // nono
1.1.1.2 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
1.1.1.8 ! root 7: //
1.1.1.7 root 8: // X680x0 の各種 ROM
9: //
1.1.1.8 ! root 10:
1.1.1.7 root 11: // IODevice
12: // |
13: // +-- ROMDevice (LoadROM()、ウェイト、マスク等を持つ)
14: // | |
15: // | +-- PROMDevice (LUNA* の PROM)
16: // | |
17: // | | +---------------+
18: // | +--| IPLROM1Device | (X680x0 の IPLROM 後半)
19: // | | +---------------+
20: // | |
21: // | | +---------------+
22: // | +--| IPLROM2Device | (X680x0 の IPLROM 前半)
23: // | | +---------------+
24: // | |
25: // | | +-------------+
26: // | +--| CGROMDevice | (X680x0 の CGROM)
27: // | | +-------------+
28: // | |
29: // | +-- LunaPROMEmuDevice (LUNA PROM エミュレーションの共通部分)
30: // | |
31: // | +-- Luna1PROMEmuDevice (LUNA1 の PROM エミュレーション)
32: // | +-- Luna88kPROMEmuDevice (LUNA88K の PROM エミュレーション)
33: // |
34: // +-- PROM0Device (LUNA* のブートページ切り替え用プロキシ)
35: // |
36: // | +---------------+
37: // +--| IPLROM0Device | (X680x0 のブートページ切り替え用プロキシ)
38: // +---------------+
39:
1.1 root 40: #include "romimg_x68k.h"
41: #include "cgrom.h"
42: #include "mainapp.h"
43:
1.1.1.8 ! root 44: // グローバル参照用
! 45: CGROMDevice *gCGROM;
! 46: IPLROM0Device *gIPLROM0;
! 47: IPLROM1Device *gIPLROM1;
! 48: IPLROM2Device *gIPLROM2;
1.1.1.3 root 49:
1.1 root 50: //
1.1.1.8 ! root 51: // IPLROM0
! 52: //
1.1.1.5 root 53: // IPLROM0 は IPLROM(1) のブートページ担当。
54: // これ自身はメモリ領域を持たず IPLROM1 へのプロキシとして動作する。
55: //
56: // X680x0 のブートページは $000000..$00ffff の 64KB で、
57: // ここへのアクセスは $ff0000..$ffffff (IPLROM1 の後半 64KB) が見える。
58: // ROM へアクセスがあればブートページを RAM に切り替える。
59: // そのため、RAM 側も ROM 側もこいつが応対する必要がある。
60:
1.1.1.8 ! root 61: // コンストラクタ
1.1.1.5 root 62: IPLROM0Device::IPLROM0Device()
1.1.1.8 ! root 63: : inherited("IPLROM(BOOT)")
1.1.1.5 root 64: {
1.1.1.6 root 65: ClearAlias();
1.1.1.8 ! root 66: AddAlias("IPLROMBOOT");
1.1.1.5 root 67: }
68:
1.1.1.8 ! root 69: // デストラクタ
1.1.1.5 root 70: IPLROM0Device::~IPLROM0Device()
71: {
1.1.1.8 ! root 72: gIPLROM0 = NULL;
1.1.1.5 root 73: }
74:
75: bool
76: IPLROM0Device::Init()
77: {
1.1.1.8 ! root 78: iplrom1 = gIPLROM1;
1.1.1.5 root 79: return true;
80: }
81:
1.1.1.8 ! root 82: // リセット
1.1.1.5 root 83: void
1.1.1.8 ! root 84: IPLROM0Device::ResetHard(bool poweron)
1.1.1.5 root 85: {
1.1.1.7 root 86: gVM->SwitchBootPageToROM(this);
87: }
88:
89: // Read の共通処理。
90: // アドレスのデコードと RAM への切り替え判定を行う。
91: uint32
92: IPLROM0Device::ReadDecoder(uint32 addr)
93: {
94: // ROM アドレスがアクセスされたら切り替える
95: if (addr >= 0xff0000) {
96: gVM->SwitchBootPageToRAM(this);
97: }
98:
99: // どちらにしてもアクセスは ROM のアドレス
100: return addr | 0xff0000;
1.1.1.5 root 101: }
102:
103: uint64
104: IPLROM0Device::Read8(uint32 addr)
105: {
1.1.1.7 root 106: addr = ReadDecoder(addr);
107: return iplrom1->Read8(addr);
1.1.1.5 root 108: }
109:
110: uint64
111: IPLROM0Device::Read16(uint32 addr)
112: {
1.1.1.7 root 113: addr = ReadDecoder(addr);
114: return iplrom1->Read16(addr);
1.1.1.5 root 115: }
116:
117: uint64
118: IPLROM0Device::Read32(uint32 addr)
119: {
1.1.1.7 root 120: addr = ReadDecoder(addr);
121: return iplrom1->Read32(addr);
1.1.1.5 root 122: }
123:
124: // Write は RAM 領域へも ROM 領域へも発生しないはずなので基底のを使う。
125:
126: uint64
127: IPLROM0Device::Peek8(uint32 addr)
128: {
1.1.1.7 root 129: addr |= 0xff0000;
130: return iplrom1->Peek8(addr);
1.1.1.5 root 131: }
132:
133:
134: //
1.1 root 135: // IPLROM(1)
136: //
137:
1.1.1.8 ! root 138: // コンストラクタ
1.1 root 139: IPLROM1Device::IPLROM1Device()
1.1.1.6 root 140: : inherited("IPLROM(1)")
1.1 root 141: {
1.1.1.6 root 142: ClearAlias();
143: AddAlias("IPLROM1");
144:
1.1 root 145: devaddr = 0xfe0000;
146: devlen = 0x020000;
147: mask = devlen - 1;
1.1.1.7 root 148:
149: // X680x0 では ROM への書き込みはバスエラー
150: write_op = -1;
1.1 root 151: }
152:
1.1.1.8 ! root 153: // デストラクタ
1.1 root 154: IPLROM1Device::~IPLROM1Device()
155: {
1.1.1.8 ! root 156: gIPLROM1 = NULL;
1.1 root 157: }
158:
159: bool
160: IPLROM1Device::Init()
161: {
162: std::string name;
163:
164: if (gMainApp.benchmark_mode != 0) {
165: name = string_format("BENCH%02d.ROM", gMainApp.benchmark_mode);
166: } else {
167: name = "IPLROM30.DAT";
168: }
169:
170: if (LoadROM(name.c_str(), 128 * 1024) == false) {
171: return false;
172: }
173: return true;
174: }
175:
176:
177: //
178: // IPLROM(2)
179: //
180:
1.1.1.8 ! root 181: // コンストラクタ
1.1 root 182: IPLROM2Device::IPLROM2Device()
1.1.1.6 root 183: : inherited("IPLROM(2)")
1.1 root 184: {
1.1.1.6 root 185: ClearAlias();
186: AddAlias("IPLROM2");
187:
1.1 root 188: devaddr = 0xfc0000;
189: devlen = 0x020000;
190: mask = devlen - 1;
1.1.1.7 root 191:
192: // X680x0 では ROM への書き込みはバスエラー
193: write_op = -1;
1.1 root 194: }
195:
1.1.1.8 ! root 196: // デストラクタ
1.1 root 197: IPLROM2Device::~IPLROM2Device()
198: {
1.1.1.8 ! root 199: gIPLROM2 = NULL;
1.1 root 200: }
201:
202: bool
203: IPLROM2Device::Init()
204: {
205: if (gMainApp.benchmark_mode != 0) {
206: return true;
207: }
208:
209: if (LoadROM("ROM30.DAT", 128 * 1024) == false) {
210: return false;
211: }
212: return true;
213: }
214:
215:
216: //
217: // CGROM
218: //
219:
1.1.1.8 ! root 220: // コンストラクタ
1.1 root 221: CGROMDevice::CGROMDevice()
1.1.1.6 root 222: : inherited("CGROM")
1.1 root 223: {
224: devaddr = 0xf00000;
225: devlen = 768 * 1024;
226: mask = 1024 * 1024 - 1;
1.1.1.7 root 227:
228: // X680x0 では ROM への書き込みはバスエラー
229: write_op = -1;
1.1 root 230: }
231:
1.1.1.8 ! root 232: // デストラクタ
1.1 root 233: CGROMDevice::~CGROMDevice()
234: {
1.1.1.8 ! root 235: gCGROM = NULL;
1.1 root 236: }
237:
238: bool
239: CGROMDevice::Init()
240: {
241: #if 0
242: mem = builtin_cgrom;
243: #else
244: if (LoadROM("CGROM30.DAT", 768 * 1024) == false) {
245: return false;
246: }
247: #endif
248: return true;
249: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.