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

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

unix.superglobalmegacorp.com

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