|
|
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: if (inherited::Init() == false) {
76: return false;
77: }
78:
79: iplrom1 = GetIPLROM1Device();
80:
1.1.1.5 root 81: return true;
82: }
83:
1.1.1.8 root 84: // リセット
1.1.1.5 root 85: void
1.1.1.8 root 86: IPLROM0Device::ResetHard(bool poweron)
1.1.1.5 root 87: {
1.1.1.11 root 88: auto mainbus = GetMainbusDevice();
89: mainbus->SwitchBootPageToROM();
1.1.1.7 root 90: }
91:
92: // Read の共通処理。
93: // アドレスのデコードと RAM への切り替え判定を行う。
94: uint32
95: IPLROM0Device::ReadDecoder(uint32 addr)
96: {
97: // ROM アドレスがアクセスされたら切り替える
98: if (addr >= 0xff0000) {
1.1.1.11 root 99: auto mainbus = GetMainbusDevice();
100: mainbus->SwitchBootPageToRAM();
1.1.1.7 root 101: }
102:
103: // どちらにしてもアクセスは ROM のアドレス
104: return addr | 0xff0000;
1.1.1.5 root 105: }
106:
1.1.1.11 root 107: busdata
1.1.1.12! root 108: IPLROM0Device::Read(busaddr addr)
1.1.1.5 root 109: {
1.1.1.12! root 110: addr.ChangeAddr(ReadDecoder(addr.Addr()));
! 111: return iplrom1->Read(addr);
1.1.1.5 root 112: }
113:
114: // Write は RAM 領域へも ROM 領域へも発生しないはずなので基底のを使う。
115:
1.1.1.11 root 116: busdata
1.1.1.12! root 117: IPLROM0Device::Peek1(uint32 addr)
1.1.1.5 root 118: {
1.1.1.7 root 119: addr |= 0xff0000;
1.1.1.12! root 120: return iplrom1->Peek1(addr);
1.1.1.5 root 121: }
122:
123:
124: //
1.1.1.9 root 125: // IPLROM(1) 0xfe0000..0xffffff 担当
1.1 root 126: //
127:
1.1.1.8 root 128: // コンストラクタ
1.1 root 129: IPLROM1Device::IPLROM1Device()
1.1.1.10 root 130: : inherited(OBJ_IPLROM1)
1.1 root 131: {
1.1.1.7 root 132: // X680x0 では ROM への書き込みはバスエラー
133: write_op = -1;
1.1 root 134: }
135:
1.1.1.8 root 136: // デストラクタ
1.1 root 137: IPLROM1Device::~IPLROM1Device()
138: {
139: }
140:
1.1.1.10 root 141: // 初期化
1.1 root 142: bool
143: IPLROM1Device::Init()
144: {
1.1.1.10 root 145: if (inherited::Init() == false) {
146: return false;
147: }
148:
1.1 root 149: std::string name;
1.1.1.10 root 150: uint devlen = 0x020000;
151: mask = devlen - 1;
1.1 root 152:
1.1.1.9 root 153: const ConfigItem& item = gConfig->Find("iplrom1-image");
154: name = item.AsString();
155: if (name.empty()) {
156: // 指定がなければ、内蔵 IPLROM を使う。
157: mem = Builtin::IPLROM30;
158: return true;
1.1 root 159: }
1.1.1.9 root 160:
161: // 外部ファイルが指定されれば、それを使う。
162: return LoadROM(name.c_str(), devlen);
1.1 root 163: }
164:
165:
166: //
1.1.1.9 root 167: // IPLROM(2) 0xfc0000..0xfdffff 担当
1.1 root 168: //
169:
1.1.1.8 root 170: // コンストラクタ
1.1 root 171: IPLROM2Device::IPLROM2Device()
1.1.1.10 root 172: : inherited(OBJ_IPLROM2)
1.1 root 173: {
1.1.1.7 root 174: // X680x0 では ROM への書き込みはバスエラー
175: write_op = -1;
1.1 root 176: }
177:
1.1.1.8 root 178: // デストラクタ
1.1 root 179: IPLROM2Device::~IPLROM2Device()
180: {
181: }
182:
1.1.1.10 root 183: // 初期化
1.1 root 184: bool
185: IPLROM2Device::Init()
186: {
1.1.1.10 root 187: if (inherited::Init() == false) {
188: return false;
189: }
190:
191: uint devlen = 0x020000;
192: mask = devlen - 1;
193:
1.1.1.9 root 194: const ConfigItem& item = gConfig->Find("iplrom2-image");
195: std::string name = item.AsString();
196: if (name.empty()) {
197: printf("iplrom2: not yet\n");
1.1 root 198: return false;
199: }
1.1.1.9 root 200:
201: // 外部ファイルが指定されれば、それを使う。
202: return LoadROM(name.c_str(), devlen);
1.1 root 203: }
204:
205:
206: //
207: // CGROM
208: //
209:
1.1.1.8 root 210: // コンストラクタ
1.1 root 211: CGROMDevice::CGROMDevice()
1.1.1.10 root 212: : inherited(OBJ_CGROM)
1.1 root 213: {
1.1.1.7 root 214: // X680x0 では ROM への書き込みはバスエラー
215: write_op = -1;
1.1 root 216: }
217:
1.1.1.8 root 218: // デストラクタ
1.1 root 219: CGROMDevice::~CGROMDevice()
220: {
221: }
222:
1.1.1.10 root 223: // 初期化
1.1 root 224: bool
225: CGROMDevice::Init()
226: {
1.1.1.10 root 227: if (inherited::Init() == false) {
228: return false;
229: }
230:
231: uint devlen = 768 * 1024;
232: mask = 1024 * 1024 - 1;
233:
1.1.1.9 root 234: const ConfigItem& item = gConfig->Find("cgrom-image");
235: std::string name = item.AsString();
236: if (name.empty()) {
237: // 指定がなければ、内蔵 CGROM を使う。
238: mem = Builtin::CGROM;
239: return true;
240: }
241:
242: // 外部ファイルが指定されれば、それを使う。
243: if (LoadROM(name.c_str(), devlen) == false) {
244: // 指定したファイルが読めなければエラー。
1.1 root 245: return false;
246: }
1.1.1.9 root 247:
248: // X68030 の CGROM には、X68000 のものには収録されていない 6x12 フォント
249: // が収録されている。6x12 フォント以外は(たぶん)同じなのでほとんどの場面
250: // で困ることはないが、それ故に忘れた頃に一部の文字だけ表示されなくて
251: // 「???」ということになりがちなので、6x12 フォントが収録されてなさそう
252: // なら警告を出しておく (処理は続行する)。
253: uint8 val = 0;
254: for (int i = 0; i < 12; i++) {
255: val |= imagebuf[0xbf400 + ('0' * 12) + i];
256: }
257: if (val == 0) {
258: warnx("warning: 6x12 font not found in CGROM30.DAT");
259: }
260:
1.1 root 261: return true;
262: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.