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

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

unix.superglobalmegacorp.com

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