Annotation of nono/vm/romimg_x68k.cpp, revision 1.1.1.14

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.