|
|
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
1.1.1.12 root 12: // |
13: // +- ROMDevice (LoadROM()、ウェイト、マスク等を持つ)
14: // | +- PROMDevice (LUNA* の PROM)
15: // | |
16: // | | +---------------+
17: // | +-| IPLROM1Device | (X680x0 の IPLROM 後半)
18: // | | +---------------+
19: // | |
20: // | | +---------------+
21: // | +-| IPLROM2Device | (X680x0 の IPLROM 前半)
22: // | | +---------------+
23: // | |
24: // | | +-------------+
25: // | +-| CGROMDevice | (X680x0 の CGROM)
26: // | | +-------------+
27: // | |
28: // | +- ROMEmuDevice
29: // | +- LunaPROMEmuDevice (LUNA PROM エミュレーションの共通部分)
30: // | | +- Luna1PROMEmuDevice (LUNA-I の PROM エミュレーション)
31: // | | +- Luna88kPROMEmuDevice (LUNA-88K の PROM エミュレーション)
32: // | +- NewsROMEmuDevice (NEWS の ROM エミュレーション)
33: // | +- ROM30EmuDevice (X68030 の ROM30 エミュレーション)
34: // | +- Virt68kROMEmuDevice (virt-m68k の IPLROM 相当の何か)
35: // |
36: // +- PROM0Device (LUNA* のブートページ切り替え用プロキシ)
37: // |
38: // | +---------------+
39: // +-| IPLROM0Device | (X680x0 のブートページ切り替え用プロキシ)
40: // +---------------+
1.1.1.7 root 41:
1.1 root 42: #include "romimg_x68k.h"
1.1.1.9 root 43: #include "builtinrom.h"
44: #include "config.h"
1.1.1.11 root 45: #include "mainbus.h"
1.1 root 46:
47: //
1.1.1.8 root 48: // IPLROM0
49: //
1.1.1.5 root 50: // IPLROM0 は IPLROM(1) のブートページ担当。
51: // これ自身はメモリ領域を持たず IPLROM1 へのプロキシとして動作する。
52: //
53: // X680x0 のブートページは $000000..$00ffff の 64KB で、
54: // ここへのアクセスは $ff0000..$ffffff (IPLROM1 の後半 64KB) が見える。
55: // ROM へアクセスがあればブートページを RAM に切り替える。
56: // そのため、RAM 側も ROM 側もこいつが応対する必要がある。
57:
1.1.1.8 root 58: // コンストラクタ
1.1.1.5 root 59: IPLROM0Device::IPLROM0Device()
1.1.1.10 root 60: : inherited(OBJ_IPLROM_BOOT)
1.1.1.5 root 61: {
1.1.1.10 root 62: // 通常ここからログを出すことはない
1.1.1.6 root 63: ClearAlias();
1.1.1.5 root 64: }
65:
1.1.1.8 root 66: // デストラクタ
1.1.1.5 root 67: IPLROM0Device::~IPLROM0Device()
68: {
69: }
70:
1.1.1.10 root 71: // 初期化
1.1.1.5 root 72: bool
73: IPLROM0Device::Init()
74: {
1.1.1.10 root 75: iplrom1 = GetIPLROM1Device();
76:
1.1.1.5 root 77: return true;
78: }
79:
1.1.1.8 root 80: // リセット
1.1.1.5 root 81: void
1.1.1.8 root 82: IPLROM0Device::ResetHard(bool poweron)
1.1.1.5 root 83: {
1.1.1.11 root 84: auto mainbus = GetMainbusDevice();
85: mainbus->SwitchBootPageToROM();
1.1.1.7 root 86: }
87:
88: // Read の共通処理。
89: // アドレスのデコードと RAM への切り替え判定を行う。
90: uint32
91: IPLROM0Device::ReadDecoder(uint32 addr)
92: {
93: // ROM アドレスがアクセスされたら切り替える
94: if (addr >= 0xff0000) {
1.1.1.11 root 95: auto mainbus = GetMainbusDevice();
96: mainbus->SwitchBootPageToRAM();
1.1.1.7 root 97: }
98:
99: // どちらにしてもアクセスは ROM のアドレス
100: return addr | 0xff0000;
1.1.1.5 root 101: }
102:
1.1.1.11 root 103: busdata
1.1.1.12 root 104: IPLROM0Device::Read(busaddr addr)
1.1.1.5 root 105: {
1.1.1.12 root 106: addr.ChangeAddr(ReadDecoder(addr.Addr()));
107: return iplrom1->Read(addr);
1.1.1.5 root 108: }
109:
110: // Write は RAM 領域へも ROM 領域へも発生しないはずなので基底のを使う。
111:
1.1.1.11 root 112: busdata
1.1.1.12 root 113: IPLROM0Device::Peek1(uint32 addr)
1.1.1.5 root 114: {
1.1.1.7 root 115: addr |= 0xff0000;
1.1.1.12 root 116: return iplrom1->Peek1(addr);
1.1.1.5 root 117: }
118:
119:
120: //
1.1.1.9 root 121: // IPLROM(1) 0xfe0000..0xffffff 担当
1.1 root 122: //
123:
1.1.1.8 root 124: // コンストラクタ
1.1 root 125: IPLROM1Device::IPLROM1Device()
1.1.1.10 root 126: : inherited(OBJ_IPLROM1)
1.1 root 127: {
1.1.1.7 root 128: // X680x0 では ROM への書き込みはバスエラー
1.1.1.14! root 129: write_op = BusData::BusErr;
1.1 root 130: }
131:
1.1.1.8 root 132: // デストラクタ
1.1 root 133: IPLROM1Device::~IPLROM1Device()
134: {
135: }
136:
1.1.1.10 root 137: // 初期化
1.1 root 138: bool
139: IPLROM1Device::Init()
140: {
141: std::string name;
1.1.1.10 root 142: uint devlen = 0x020000;
143: mask = devlen - 1;
1.1 root 144:
1.1.1.9 root 145: const ConfigItem& item = gConfig->Find("iplrom1-image");
146: name = item.AsString();
147: if (name.empty()) {
148: // 指定がなければ、内蔵 IPLROM を使う。
149: mem = Builtin::IPLROM30;
150: return true;
1.1 root 151: }
1.1.1.9 root 152:
153: // 外部ファイルが指定されれば、それを使う。
154: return LoadROM(name.c_str(), devlen);
1.1 root 155: }
156:
157:
158: //
1.1.1.9 root 159: // IPLROM(2) 0xfc0000..0xfdffff 担当
1.1 root 160: //
161:
1.1.1.8 root 162: // コンストラクタ
1.1 root 163: IPLROM2Device::IPLROM2Device()
1.1.1.10 root 164: : inherited(OBJ_IPLROM2)
1.1 root 165: {
1.1.1.7 root 166: // X680x0 では ROM への書き込みはバスエラー
1.1.1.14! root 167: write_op = BusData::BusErr;
1.1 root 168: }
169:
1.1.1.8 root 170: // デストラクタ
1.1 root 171: IPLROM2Device::~IPLROM2Device()
172: {
173: }
174:
1.1.1.10 root 175: // 初期化
1.1 root 176: bool
177: IPLROM2Device::Init()
178: {
1.1.1.10 root 179: uint devlen = 0x020000;
180: mask = devlen - 1;
181:
1.1.1.9 root 182: const ConfigItem& item = gConfig->Find("iplrom2-image");
183: std::string name = item.AsString();
184: if (name.empty()) {
185: printf("iplrom2: not yet\n");
1.1 root 186: return false;
187: }
1.1.1.9 root 188:
189: // 外部ファイルが指定されれば、それを使う。
190: return LoadROM(name.c_str(), devlen);
1.1 root 191: }
192:
193:
194: //
195: // CGROM
196: //
197:
1.1.1.8 root 198: // コンストラクタ
1.1 root 199: CGROMDevice::CGROMDevice()
1.1.1.10 root 200: : inherited(OBJ_CGROM)
1.1 root 201: {
1.1.1.7 root 202: // X680x0 では ROM への書き込みはバスエラー
1.1.1.14! root 203: write_op = BusData::BusErr;
1.1 root 204: }
205:
1.1.1.8 root 206: // デストラクタ
1.1 root 207: CGROMDevice::~CGROMDevice()
208: {
209: }
210:
1.1.1.10 root 211: // 初期化
1.1 root 212: bool
213: CGROMDevice::Init()
214: {
1.1.1.10 root 215: uint devlen = 768 * 1024;
216: mask = 1024 * 1024 - 1;
217:
1.1.1.9 root 218: const ConfigItem& item = gConfig->Find("cgrom-image");
219: std::string name = item.AsString();
220: if (name.empty()) {
221: // 指定がなければ、内蔵 CGROM を使う。
222: mem = Builtin::CGROM;
223: return true;
224: }
225:
226: // 外部ファイルが指定されれば、それを使う。
227: if (LoadROM(name.c_str(), devlen) == false) {
228: // 指定したファイルが読めなければエラー。
1.1 root 229: return false;
230: }
1.1.1.9 root 231:
232: // X68030 の CGROM には、X68000 のものには収録されていない 6x12 フォント
233: // が収録されている。6x12 フォント以外は(たぶん)同じなのでほとんどの場面
234: // で困ることはないが、それ故に忘れた頃に一部の文字だけ表示されなくて
235: // 「???」ということになりがちなので、6x12 フォントが収録されてなさそう
236: // なら警告を出しておく (処理は続行する)。
237: uint8 val = 0;
238: for (int i = 0; i < 12; i++) {
239: val |= imagebuf[0xbf400 + ('0' * 12) + i];
240: }
241: if (val == 0) {
242: warnx("warning: 6x12 font not found in CGROM30.DAT");
243: }
244:
1.1 root 245: return true;
246: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.