Annotation of nono/vm/mainbus_luna.cpp, revision 1.1.1.5

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // メインバス (LUNA)
                      9: //
                     10: 
                     11: // IODevice
                     12: //   +-- MainbusBaseDevice (InitMainbus() と FC アクセスを持つ)
                     13: //   |    +-- MainbusDevice (これがメインバス、システムに1つ)
                     14: //   |    |    +-- Mainbus24Device (上位8ビットがテーブルで表せるメインバス)
                     15: //   |    |    |    |  +-------------+
                     16: //   |    |    |    +--| LunaMainbus | (LUNA 共通部)
                     17: //   |    |    |    |  +-------------+
                     18: //   |    |    |    |    |  +--------------+
                     19: //   |    |    |    |    +--| Luna1Mainbus | (LUNA-I)
                     20: //   |    |    |    |    |  +--------------+
                     21: //   |    |    |    |    |  +----------------+
                     22: //   |    |    |    |    +--| Luna88kMainbus | (LUNA-88K)
                     23: //   |    |    |    |       +----------------+
                     24: //   |    |    |    |
                     25: //   |    |    |    +-- NewsMainbus
                     26: //   |    |    |    +-- Virt68kMainbus
                     27: //   |    |    +-- X68kMainbus
                     28: //   |    +-- X68kIODevice
                     29: //   +-- XPbusDevice
                     30: 
                     31: #include "mainbus_luna.h"
                     32: #include "bt45x.h"
1.1.1.5 ! root       33: #include "buserr.h"
1.1       root       34: #include "busio.h"
                     35: #include "cmmu.h"
                     36: #include "config.h"
                     37: #include "crtc2.h"
                     38: #include "fuserom.h"
                     39: #include "interrupt.h"
                     40: #include "lance.h"
                     41: #include "lunafb.h"
                     42: #include "mainapp.h"
                     43: #include "mainram.h"
                     44: #include "mk48t02.h"
                     45: #include "msxdos.h"
1.1.1.5 ! root       46: #include "nop.h"
1.1       root       47: #include "partialram.h"
                     48: #include "pio.h"
                     49: #include "prom.h"
                     50: #include "romemu_luna1.h"
                     51: #include "romemu_luna88k.h"
                     52: #include "sio.h"
                     53: #include "spc.h"
                     54: #include "subram.h"
                     55: #include "sysclk.h"
                     56: #include "sysctlr.h"
                     57: #include "tas.h"
                     58: 
                     59: //
                     60: // LUNA 共通部
                     61: //
                     62: 
                     63: // デバイスマップ用の識別子
                     64: enum {
                     65:        NONE,
                     66:        BUSERR,
                     67:        PROM,
                     68:        MK48,
                     69:        PIO0,
                     70:        PIO1,
                     71:        SIO,
                     72:        TAS,
                     73:        SYSCLK,
                     74:        SUBRAM,
                     75:        MROM,
                     76:        LUNAFB,
                     77:        BT45x,
                     78:        CRTC2,
                     79:        SCSI,
                     80:        LANCE,
                     81:        FUSE,
                     82:        SYSCTL,
                     83:        CMMU,
                     84: };
                     85: 
                     86: // コンストラクタ
                     87: LunaMainbus::LunaMainbus()
                     88: {
                     89:        NEWDV(BusErr, new BusErrDevice());
                     90:        NEWDV(NopIO, new NopIODevice());
                     91: 
1.1.1.3   root       92:        accstat_monitor->SetSize(80, 2 + 32);
1.1       root       93: }
                     94: 
                     95: // デストラクタ
                     96: LunaMainbus::~LunaMainbus()
                     97: {
                     98: }
                     99: 
                    100: // デバイスマップから devtable を作成 (ここは共通にできる)
                    101: void
                    102: LunaMainbus::MakeDevtable(const uint8 *maptable)
                    103: {
                    104:        for (int i = 0; i < devtable.size(); i++) {
                    105:                IODevice *d;
                    106:                switch (maptable[i]) {
                    107:                 case NONE:             d = pNopIO.get();               break;
                    108:                 case BUSERR:   d = pBusErr.get();              break;
                    109:                 case PROM:             d = pPROM.get();                break;
                    110:                 case MK48:             d = pRTC.get();                 break;
                    111:                 case PIO0:             d = pPIO0.get();                break;
                    112:                 case PIO1:             d = pPIO1.get();                break;
                    113:                 case SIO:              d = pSIO.get();                 break;
                    114:                 case TAS:              d = pTAS.get();                 break;
                    115:                 case SYSCLK:   d = pSysClk.get();              break;
                    116:                 case SUBRAM:   d = pSubRAM.get();              break;
                    117:                 case MROM:             d = pNopIO.get();               break;
                    118:                 case LUNAFB:   d = pPlaneVRAM.get();   break;
                    119:                 case BT45x:    d = pBT45x.get();               break;
                    120:                 case CRTC2:    d = pCRTC2.get();               break;
                    121:                 case SCSI:             d = pSPC.get();                 break;
                    122:                 case LANCE:    d = pEthernet.get();    break;
                    123:                 case SYSCTL:   d = pInterrupt.get();   break;
                    124:                 // これらはサブクラスが所有しているので Get で取得する必要がある。
                    125:                 case FUSE:             d = GetFuseROMDevice(); break;
                    126:                 case CMMU:             d = GetCMMUDevice();    break;
                    127:                 default:
1.1.1.2   root      128:                        PANIC("corrupted maptable[%u]=%d", i, maptable[i]);
1.1       root      129:                }
                    130:                devtable[i] = d;
                    131:        }
                    132: }
                    133: 
                    134: // メインバスの初期化
                    135: bool
                    136: LunaMainbus::InitMainbus()
                    137: {
                    138:        auto mainram = dynamic_cast<MainRAMDevice *>(pMainRAM.get());
                    139:        auto partial = dynamic_cast<PartialRAMDevice *>(pPartialRAM.get());
                    140: 
                    141:        // RAM は容量が確定した後のここで配置。
1.1.1.4   root      142:        uint ram_size_MB = mainram->GetSizeMB();
1.1       root      143:        int i = 0;
                    144:        while (ram_size_MB >= 16) {
                    145:                // 16MB あれば RAM が直接担当
                    146:                devtable[i++] = mainram;
                    147:                ram_size_MB -= 16;
                    148:        }
                    149:        // 16MB 未満なら PartialRAM が担当
                    150:        if (ram_size_MB > 0) {
                    151:                devtable[i] = partial;
                    152:        }
                    153: 
                    154:        // 先頭 (mainram or partial) をブートページ切り替え用に覚えておく。
                    155:        ram0 = devtable[0];
                    156: 
                    157:        // アクセス状況用のマップを作成。
                    158:        InitAccStat();
                    159: 
                    160:        return true;
                    161: }
                    162: 
                    163: // ブートページを切り替える。
                    164: void
                    165: LunaMainbus::SwitchBootPage(bool isrom)
                    166: {
                    167:        // 共通処理
                    168:        inherited::SwitchBootPage(isrom);
                    169: 
                    170:        // ROM は 128KB しかないので 16MB まるごと切り替わったりはしないとは
                    171:        // 思うけど、具体的にどの範囲が切り替わるのかを知る方法がないのと
                    172:        // 大して副作用もないので、先頭の 1ブロックをまるごと切り替えておく。
                    173:        if (isrom) {
                    174:                auto prom0 = GetPROM0Device();
                    175:                devtable[0x00] = prom0;
                    176:                devtable[0x41] = prom0;
                    177:        } else {
                    178:                auto prom = GetPROMDevice();
                    179:                devtable[0x00] = ram0;
                    180:                devtable[0x41] = prom;
                    181:        }
                    182: }
                    183: 
                    184: 
                    185: //
                    186: // LUNA-I
                    187: //
                    188: 
                    189: // LUNA-I のデバイス割り当て表 (上位8ビット)
                    190: //
                    191: // 仕様      実際
                    192: // 00  00              メインメモリ
                    193: // --  01..03  二重バスフォールトするようだ
                    194: // --  04..0f  何かよく分からないものが読める
                    195: // --  10..3f  BUSERR
                    196: // 41  40..43  PROM (B、N=128KBでミラー)
                    197: // 45  44..47  mk48t02 (B、N=2048でミラー)
                    198: // 49  48..4b  pio0 (B、N=4でミラー)
                    199: // 4d  4c..4f  pio1 (B、N=4でミラー)
                    200: // 51  50..53  sio  (BB、N=4でミラー)
                    201: // --  54..5f  0xff が読めるようだ
                    202: // 61  60..61  TAS (B、N=1でミラー)
                    203: // 63  62..63  システムクロック (B、N=1でミラー)
                    204: // --           以降TASとSysClkで2枠ずつ。また無効ビットの読み出しは
                    205: // --          必ずしも Hi とは限らず不安定のようだ。
                    206: // 71  70..7f  3ポートRAM (B、N=128KBでミラー)
                    207: // 81  80..    BUSERR (オンボード拡張スロットA)
                    208: // 83    ..8f  BUSERR (オンボード拡張スロットB)
                    209: // 91  90..9f  0xff が読めるようだ (PC-9000 拡張スロット)
                    210: //
                    211: // a1                  マスクROM
                    212: //              a0,a2,a4,... BUSERR
                    213: //              a1,a3,a5,... マスクROM(なければ0xffが読める)
                    214: // b1                  ビットマップ
                    215: //              b0,b2,b4,... BUSERR
                    216: //              b1,b3,b5,... ビットマップ (内訳は lunafb.cpp 参照)
                    217: // c1                  パレット
                    218: //              c0,c2,c4,... BUSERR
                    219: //              c1,c3,c5,... パレット (B、N=4でミラー)
                    220: // d1                  CRTC-II
                    221: //              d0,d2,d4,... BUSERR
                    222: //              d1,d3,d5,... CRTC-II (B、N=2でミラー)
                    223: //
                    224: // e1  e0..e3  SCSI (BBBB、N=16 でミラー)
                    225: // --  e4..ef  0xff が読めるようだが不安定。
                    226: // f1  f0..f3  LANCE (WW、N=2 でミラー)
                    227: // --  f4..ff  0xff が読めるようだ
                    228: 
                    229: /*static*/ const uint8
                    230: Luna1Mainbus::maptable[256] = {
                    231:        // (00,)01,02,03 は実際にはたぶんパリティチェックが入っていて(?)
                    232:        // 非実装領域にアクセスすると二重バスフォールトになるがそれは未対応。
                    233:        // RAM は Init() で動的に配置する。
                    234:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 00
                    235:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 08
                    236:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10
                    237:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18
                    238:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20
                    239:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28
                    240:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30
                    241:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38
                    242: 
                    243:        PROM,   PROM,   PROM,   PROM,   MK48,   MK48,   MK48,   MK48,   // 40
                    244:        PIO0,   PIO0,   PIO0,   PIO0,   PIO1,   PIO1,   PIO1,   PIO1,   // 48
                    245:        SIO,    SIO,    SIO,    SIO,    NONE,   NONE,   NONE,   NONE,   // 50
                    246:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 58
                    247:        TAS,    TAS,    SYSCLK, SYSCLK, TAS,    TAS,    SYSCLK, SYSCLK, // 60
                    248:        TAS,    TAS,    SYSCLK, SYSCLK, TAS,    TAS,    SYSCLK, SYSCLK, // 68
                    249:        SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 70
                    250:        SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 78
                    251: 
                    252:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80
                    253:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88
                    254:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 90
                    255:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 98
                    256:        BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   // a0
                    257:        BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   // a8
                    258:        BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b0
                    259:        BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b8
                    260: 
                    261:        BUSERR, BT45x,  BUSERR, BT45x,  BUSERR, BT45x,  BUSERR, BT45x,  // c0
                    262:        BUSERR, BT45x,  BUSERR, BT45x,  BUSERR, BT45x,  BUSERR, BT45x,  // c8
                    263:        BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  // d0
                    264:        BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  // d8
                    265:        SCSI,   SCSI,   SCSI,   SCSI,   NONE,   NONE,   NONE,   NONE,   // e0
                    266:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // e8
                    267:        LANCE,  LANCE,  LANCE,  LANCE,  NONE,   NONE,   NONE,   NONE,   // f0
                    268:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // f8
                    269: };
                    270: 
                    271: // コンストラクタ
                    272: Luna1Mainbus::Luna1Mainbus()
                    273: {
                    274:        // デバイス (順序に注意)
                    275:        // BusErrDevice, NopIODevice は親コンストラクタで作成済み。
                    276: 
                    277:        NEWDV(Interrupt, new LunaInterrupt());
                    278:        NEWDV(RTC, new BusIO_B<MK48T02Device>());               // required by SysClk
                    279:        NEWDV(SysClk, new BusIO_B<SysClkDevice>());             // required by PROMEmu
                    280:        if (gMainApp.msxdos_mode) {
                    281:                NEWDV(PROM, new MSXDOSDevice());
                    282:        } else if (gMainApp.exec_file ||
                    283:                   gConfig->Find("prom-image").AsString().empty()) {
                    284:                NEWDV(PROM, new Luna1PROMEmuDevice());
                    285:        } else {
                    286:                NEWDV(PROM, new PROMDevice());                          // required by RAM,BT45x
                    287:        }
                    288:        NEWDV(PROM0, new PROM0Device());
                    289:        NEWDV(MainRAM, new MainRAMDevice());                    // required by PartialRAM
                    290:        NEWDV(PartialRAM, new PartialRAMDevice());
                    291:        NEWDV(PIO0, new BusIO_B<PIO0Device>());
                    292:        NEWDV(PIO1, new BusIO_B<PIO1Device>());
                    293:        NEWDV(SIO, new BusIO_BB<SIODevice>());
                    294:        NEWDV(TAS, new BusIO_B<TASDevice>());
                    295:        NEWDV(SubRAM, new SubRAMDevice(128));
                    296:        NEWDV(CRTC2, new BusIO_B<CRTC2Device>());
                    297:        NEWDV(SPC, new BusIO_BBBB<SPCDevice>());
                    298:        NEWDV(Ethernet, new BusIO_W<LanceDevice>());
                    299: }
                    300: 
                    301: // デストラクタ
                    302: Luna1Mainbus::~Luna1Mainbus()
                    303: {
                    304: }
                    305: 
1.1.1.2   root      306: // 動的なコンストラクション
                    307: bool
                    308: Luna1Mainbus::Create()
                    309: {
                    310:        int nplane = BT45xDevice::GetConfigPlaneCount();
                    311:        if (nplane < 0) {
                    312:                return false;
                    313:        }
                    314:        if (nplane == 8) {                                                              // required by Lunafb
                    315:                NEWDV(BT45x, new BusIO_BFFF<BT458Device>());
                    316:        } else {
                    317:                NEWDV(BT45x, new BusIO_B<BT454Device>());
                    318:        }
                    319:        NEWDV(PlaneVRAM, new LunafbDevice());
                    320: 
                    321:        // 全部揃ったここで、デバイスマップから devtable を作成。
                    322:        MakeDevtable(maptable);
                    323:        return true;
                    324: }
1.1       root      325: 
                    326: //
                    327: // LUNA-88K
                    328: //
                    329: 
                    330: // 00..03              RAM (64MB 実機の場合)
1.1.1.5 ! root      331: // 04..3f              バスエラー
1.1       root      332: // 40,41               PROM (B、N=256KB でミラー)
                    333: // 42,43               FUSEROM (BFFF、N=256 でミラー)
                    334: // 44,45               NVRAM (BFFF、N=2048 でミラー)
1.1.1.5 ! root      335: // 46,47               バスエラー
1.1       root      336: // 48,49               PIO0 (BFFF、N=4 でミラー)
1.1.1.5 ! root      337: // 4a,4b               バスエラー
1.1       root      338: // 4c,4d               PIO1 (BFFF、N=4 でミラー)
1.1.1.5 ! root      339: // 4e,4f               バスエラー
1.1       root      340: // 50,51               SIO (BFFF、N=4 でミラー)
1.1.1.5 ! root      341: // 52..5f              バスエラー
1.1       root      342: // 60,61               TAS? (BFFF、N=1 ?)
                    343: // 62,63               SysClk (BFFF、N=1 ?)
1.1.1.5 ! root      344: // 64,65,66,67 SysCtlr? (L、N=1 ?)
1.1       root      345: // 68,69,6a,6b SysCtlr? (L、N=4 ?)
                    346: // 6c,6d               CPU リセット
1.1.1.5 ! root      347: // 6e,6f               $ff (?)
1.1       root      348: // 70-7f               SubRAM
1.1.1.5 ! root      349: // 80-9f               バスエラー
        !           350: // a0-af               偶数(a0,a2,..)はバスエラー、奇数(a1,a3,..)は $ff
        !           351: // b0-bf               偶数(b0,b2,..)はバスエラー、奇数(b1,b3,..)は LUNAFB
        !           352: // c0-cf               偶数(c0,c2,..)はバスエラー、奇数(c1,c3,..)は BT454(BFFF、N=4)
        !           353: // d0-df               偶数(d0,d2,..)はバスエラー、奇数(d1,d3,..)はたぶん CRTC2
1.1       root      354: //                             (CRTC2 は今の所 $ff しか観測できていないので詳細不明)
                    355: // e0,e1               SPC (BFFF、N=16 でミラー)
1.1.1.5 ! root      356: // e2-ef               $ff
1.1       root      357: // f0,f1               たぶん Lance (BFFF、N=2)
                    358: // f2-fd               $ff
1.1.1.5 ! root      359: // fe                  $fe00'0000-$fef7'ffff まではアドレス(*)
1.1       root      360: //                             $fef8'0000-$feff'ffff までは $ff
1.1.1.5 ! root      361: // ff                  たぶん CMMU 以外はアドレス(*)
1.1       root      362: //
1.1.1.5 ! root      363: // バスエラーの領域は 3% くらいの確率で $ffffffff が読めることがある。まじか。
        !           364: // (OpenBSD の CMMU 検出がバスエラーが起きるはずなのに起きなかった時のことを
        !           365: // 考慮したコードになってるのはこのためだろうか…)
        !           366: //
        !           367: // アドレス(*) のところは、32ビットアドレスが読み出せる。バイトアクセスしても
        !           368: // そのバイトに応じたところが読み出せるので 32ビットの (フルワード単位の)
        !           369: // アドレスがデータバスに乗って返って来ているようだ…。
        !           370: // 以下 PROM でのダンプ結果 (boot の machine read コマンドでも同じ)。
        !           371: //     0> dw fe000000 fe00000f
        !           372: //     fe000000:  fe000000  fe000004  fe000008  fe00000c
        !           373: //     0> d fe000000 fe00000f
        !           374: //     fe000000:  fe 00 00 00 fe 00 00 04 fe 00 00 08 fe 00 00 0c
1.1       root      375: 
                    376: /*static*/ const uint8
                    377: Luna88kMainbus::maptable[256] = {
                    378:        // RAM は Init() で動的に配置する (64MB なら 00..03 の4枠)。
                    379:        // 先頭 64MB の空間 (00..03) だけは、PROM 1.20 ではメモリが無いときでも
                    380:        // バスエラーにならないことを期待しているので NONE にしておく。
1.1.1.5 ! root      381:        // それ以降はバスエラー。
1.1       root      382:        NONE,   NONE,   NONE,   NONE,   BUSERR, BUSERR, BUSERR, BUSERR, // 00
                    383:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 08
                    384:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10
                    385:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18
                    386:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20
                    387:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28
                    388:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30
                    389:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38
                    390: 
                    391:        // LUNA-88K2 は 47 に(も?) NVRAM がいるようだ
                    392:        // 69,6b,6d にも何かのコントローラ?
1.1.1.5 ! root      393:        PROM,   PROM,   FUSE,   FUSE,   MK48,   MK48,   BUSERR, BUSERR, // 40
        !           394:        PIO0,   PIO0,   BUSERR, BUSERR, PIO1,   PIO1,   BUSERR, BUSERR, // 48
        !           395:        SIO,    SIO,    BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 50
        !           396:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 58
1.1       root      397:        TAS,    TAS,    SYSCLK, SYSCLK, SYSCTL, SYSCTL, SYSCTL, SYSCTL, // 60
                    398:        SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, // 68
                    399:        SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 70
                    400:        SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 78
                    401: 
1.1.1.5 ! root      402:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80
        !           403:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88
        !           404:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 90
        !           405:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 98
        !           406:        BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   // a0
        !           407:        BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   // a8
        !           408:        BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b0
        !           409:        BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b8
1.1       root      410: 
                    411:        // d0 にボードチェックレジスタ?
1.1.1.5 ! root      412:        BUSERR, BT45x,  BUSERR, BT45x,  BUSERR, BT45x,  BUSERR, BT45x,  // c0
        !           413:        BUSERR, BT45x,  BUSERR, BT45x,  BUSERR, BT45x,  BUSERR, BT45x,  // c8
        !           414:        BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  // d0
        !           415:        BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  // d8
1.1       root      416:        SCSI,   SCSI,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // e0
                    417:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // e8
                    418:        LANCE,  LANCE,  NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // f0
                    419:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   CMMU,   // f8
                    420: };
                    421: 
                    422: // コンストラクタ
                    423: Luna88kMainbus::Luna88kMainbus()
                    424: {
                    425:        // デバイス (順序に注意)
                    426:        // BusErrDevice, NopIODevice は親コンストラクタで作成済み。
                    427: 
                    428:        NEWDV(Interrupt, new SysCtlrDevice());
                    429:        NEWDV(RTC, new BusIO_BFFF<MK48T02Device>());    // required by SysClk
                    430:        NEWDV(SysClk, new BusIO_BFFF<SysClkDevice>());  // required by PROMEmu
                    431:        if (gMainApp.exec_file || gConfig->Find("prom-image").AsString().empty()) {
                    432:                NEWDV(PROM, new Luna88kPROMEmuDevice());
                    433:        } else {
                    434:                NEWDV(PROM, new PROMDevice());                          // required by RAM
                    435:        }
                    436:        NEWDV(PROM0, new PROM0Device());
                    437:        NEWDV(MainRAM, new MainRAMDevice());                    // required by PartialRAM
                    438:        NEWDV(PartialRAM, new PartialRAMDevice());
                    439:        NEWDV(FuseROM, new BusIO_BFFF<FuseROMDevice>());
                    440:        NEWDV(PIO0, new BusIO_BFFF<PIO0Device>());
                    441:        NEWDV(PIO1, new BusIO_BFFF<PIO1Device>());
                    442:        NEWDV(SIO, new BusIO_BFFF<SIODevice>());
                    443:        NEWDV(TAS, new BusIO_BFFF<TASDevice>());
                    444:        NEWDV(SubRAM, new SubRAMDevice(128));
                    445:        NEWDV(CRTC2, new BusIO_BFFF<CRTC2Device>());
                    446:        NEWDV(SPC, new BusIO_BFFF<SPCDevice>());
                    447:        NEWDV(Ethernet, new BusIO_WF<LanceDevice>());
                    448:        NEWDV(CMMU, new CMMUDevice());
                    449: }
                    450: 
                    451: // デストラクタ
                    452: Luna88kMainbus::~Luna88kMainbus()
                    453: {
                    454: }
1.1.1.2   root      455: 
                    456: // 動的なコンストラクション
                    457: bool
                    458: Luna88kMainbus::Create()
                    459: {
                    460:        int nplane = BT45xDevice::GetConfigPlaneCount();
                    461:        if (nplane < 0) {
                    462:                return false;
                    463:        }
                    464:        if (nplane == 8) {                                                              // required by Lunafb
                    465:                NEWDV(BT45x, new BusIO_BFFF<BT458Device>());
                    466:        } else {
                    467:                NEWDV(BT45x, new BusIO_B<BT454Device>());
                    468:        }
                    469:        NEWDV(PlaneVRAM, new LunafbDevice());
                    470: 
                    471:        // 全部揃ったここで、デバイスマップから devtable を作成。
                    472:        MakeDevtable(maptable);
                    473:        return true;
                    474: }

unix.superglobalmegacorp.com

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