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

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"
        !            33: #include "busio.h"
        !            34: #include "cmmu.h"
        !            35: #include "config.h"
        !            36: #include "crtc2.h"
        !            37: #include "fuserom.h"
        !            38: #include "interrupt.h"
        !            39: #include "lance.h"
        !            40: #include "lunafb.h"
        !            41: #include "mainapp.h"
        !            42: #include "mainram.h"
        !            43: #include "mk48t02.h"
        !            44: #include "msxdos.h"
        !            45: #include "partialram.h"
        !            46: #include "pio.h"
        !            47: #include "prom.h"
        !            48: #include "romemu_luna1.h"
        !            49: #include "romemu_luna88k.h"
        !            50: #include "sio.h"
        !            51: #include "spc.h"
        !            52: #include "subram.h"
        !            53: #include "sysclk.h"
        !            54: #include "sysctlr.h"
        !            55: #include "tas.h"
        !            56: 
        !            57: //
        !            58: // LUNA 共通部
        !            59: //
        !            60: 
        !            61: // デバイスマップ用の識別子
        !            62: enum {
        !            63:        NONE,
        !            64:        BUSERR,
        !            65:        PROM,
        !            66:        MK48,
        !            67:        PIO0,
        !            68:        PIO1,
        !            69:        SIO,
        !            70:        TAS,
        !            71:        SYSCLK,
        !            72:        SUBRAM,
        !            73:        MROM,
        !            74:        LUNAFB,
        !            75:        BT45x,
        !            76:        CRTC2,
        !            77:        SCSI,
        !            78:        LANCE,
        !            79:        FUSE,
        !            80:        SYSCTL,
        !            81:        CMMU,
        !            82: };
        !            83: 
        !            84: // コンストラクタ
        !            85: LunaMainbus::LunaMainbus()
        !            86: {
        !            87:        NEWDV(BusErr, new BusErrDevice());
        !            88:        NEWDV(NopIO, new NopIODevice());
        !            89: 
        !            90:        // 2MB ずつ 32bit 全域。
        !            91:        acc.resize(2048);
        !            92:        monitor_accstat.SetSize(80, 2 + 32);
        !            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:
        !           128:                        PANIC("corrupted maptable[%d]=%d", i, maptable[i]);
        !           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 は容量が確定した後のここで配置。
        !           142:        int ram_size_MB = mainram->GetSizeMB();
        !           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(BT45x, new BT45xDevice());                                // required by Lunafb
        !           297:        NEWDV(PlaneVRAM, new LunafbDevice());
        !           298:        NEWDV(CRTC2, new BusIO_B<CRTC2Device>());
        !           299:        NEWDV(SPC, new BusIO_BBBB<SPCDevice>());
        !           300:        NEWDV(Ethernet, new BusIO_W<LanceDevice>());
        !           301: 
        !           302:        // デバイスマップから devtable を作成
        !           303:        MakeDevtable(maptable);
        !           304: }
        !           305: 
        !           306: // デストラクタ
        !           307: Luna1Mainbus::~Luna1Mainbus()
        !           308: {
        !           309: }
        !           310: 
        !           311: 
        !           312: //
        !           313: // LUNA-88K
        !           314: //
        !           315: 
        !           316: // 00..03              RAM (64MB 実機の場合)
        !           317: // 04..3f              アドレスの残像? (64MB 実機の場合)
        !           318: // 40,41               PROM (B、N=256KB でミラー)
        !           319: // 42,43               FUSEROM (BFFF、N=256 でミラー)
        !           320: // 44,45               NVRAM (BFFF、N=2048 でミラー)
        !           321: // 46,47               アドレスの残像?
        !           322: // 48,49               PIO0 (BFFF、N=4 でミラー)
        !           323: // 4a,4b               アドレスの残像?
        !           324: // 4c,4d               PIO1 (BFFF、N=4 でミラー)
        !           325: // 4e,4f               アドレスの残像?
        !           326: // 50,51               SIO (BFFF、N=4 でミラー)
        !           327: // 52..5f              アドレスの残像?
        !           328: // 60,61               TAS? (BFFF、N=1 ?)
        !           329: // 62,63               SysClk (BFFF、N=1 ?)
        !           330: // 64,65,66,67 SysCtlr? (BFFF、N=4 ?)
        !           331: // 68,69,6a,6b SysCtlr? (L、N=4 ?)
        !           332: // 6c,6d               CPU リセット
        !           333: // 6e,6f               68-6b と同じパターンの気がする
        !           334: // 70-7f               SubRAM
        !           335: // 80-9f               アドレスの残像?
        !           336: // a0-af               偶数(a0,a2,..)は残像、奇数(a1,a3,..)は ff
        !           337: // b0-bf               偶数(b0,b2,..)は残像、奇数(b1,b3,..)は LUNAFB
        !           338: // c0-cf               偶数(c0,c2,..)は残像、奇数(c1,c3,..)は BT454(BFFF、N=4)
        !           339: // d0-df               偶数(d0,d2,..)は残像、奇数(d1,d3,..)はたぶん CRTC2
        !           340: //                             (CRTC2 は今の所 $ff しか観測できていないので詳細不明)
        !           341: // e0,e1               SPC (BFFF、N=16 でミラー)
        !           342: // e2-e7               繋がってない? 概ね $f4'00'c0'01 が読める。
        !           343: //                             FUSEROM などの繋がってないところと同じパターンが読める。
        !           344: // f0,f1               たぶん Lance (BFFF、N=2)
        !           345: // f2-fd               $ff
        !           346: // fe                  $fe00'0000-$fef7'ffff まではアドレスの残像
        !           347: //                             $fef8'0000-$feff'ffff までは $ff
        !           348: // ff                  たぶん CMMU 以外はアドレスの残像
        !           349: //
        !           350: // アドレスの残像(?) は
        !           351: // - バイトアクセスならアドレスの下位 8bit、
        !           352: // - ワードアクセスならアドレスの下位 16bit、
        !           353: // - ロングワードアクセスならアドレス 32bit
        !           354: // が見え、時々 $ffffffff が混ざるようだ ($00..$ff までのうち2個程度)。
        !           355: // 一方、デバイスに接続されていない下位24ビットあるいは28ビットに
        !           356: // $f400c001 が見えるエリアも多いが、$f400c001 は jmp r1 命令なので、おそらく
        !           357: // PROM モニターがこのダンプを表示する際のプログラムコードがデータバスバッファ
        !           358: // を通過したのが見えている可能性がある。
        !           359: // いずれも再現は難しいので見なかったことにする。
        !           360: 
        !           361: /*static*/ const uint8
        !           362: Luna88kMainbus::maptable[256] = {
        !           363:        // RAM は Init() で動的に配置する (64MB なら 00..03 の4枠)。
        !           364:        // RAM 未実装領域については要調査。少なくとも末尾に BUSERR がないと
        !           365:        // OpenBSD カーネルが起動しない。
        !           366:        // 先頭 64MB の空間 (00..03) だけは、PROM 1.20 ではメモリが無いときでも
        !           367:        // バスエラーにならないことを期待しているので NONE にしておく。
        !           368:        NONE,   NONE,   NONE,   NONE,   BUSERR, BUSERR, BUSERR, BUSERR, // 00
        !           369:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 08
        !           370:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10
        !           371:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18
        !           372:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20
        !           373:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28
        !           374:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30
        !           375:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38
        !           376: 
        !           377:        // LUNA-88K2 は 47 に(も?) NVRAM がいるようだ
        !           378:        // 69,6b,6d にも何かのコントローラ?
        !           379:        PROM,   PROM,   FUSE,   FUSE,   MK48,   MK48,   NONE,   NONE,   // 40
        !           380:        PIO0,   PIO0,   NONE,   NONE,   PIO1,   PIO1,   NONE,   NONE,   // 48
        !           381:        SIO,    SIO,    NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 50
        !           382:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 58
        !           383:        TAS,    TAS,    SYSCLK, SYSCLK, SYSCTL, SYSCTL, SYSCTL, SYSCTL, // 60
        !           384:        SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, // 68
        !           385:        SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 70
        !           386:        SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 78
        !           387: 
        !           388:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 80
        !           389:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 88
        !           390:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 90
        !           391:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 98
        !           392:        NONE,   MROM,   NONE,   MROM,   NONE,   MROM,   NONE,   MROM,   // a0
        !           393:        NONE,   MROM,   NONE,   MROM,   NONE,   MROM,   NONE,   MROM,   // a8
        !           394:        NONE,   LUNAFB, NONE,   LUNAFB, NONE,   LUNAFB, NONE,   LUNAFB, // b0
        !           395:        NONE,   LUNAFB, NONE,   LUNAFB, NONE,   LUNAFB, NONE,   LUNAFB, // b8
        !           396: 
        !           397:        // d0 にボードチェックレジスタ?
        !           398:        NONE,   BT45x,  NONE,   BT45x,  NONE,   BT45x,  NONE,   BT45x,  // c0
        !           399:        NONE,   BT45x,  NONE,   BT45x,  NONE,   BT45x,  NONE,   BT45x,  // c8
        !           400:        NONE,   CRTC2,  NONE,   CRTC2,  NONE,   CRTC2,  NONE,   CRTC2,  // d0
        !           401:        NONE,   CRTC2,  NONE,   CRTC2,  NONE,   CRTC2,  NONE,   CRTC2,  // d8
        !           402:        SCSI,   SCSI,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // e0
        !           403:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // e8
        !           404:        LANCE,  LANCE,  NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // f0
        !           405:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   CMMU,   // f8
        !           406: };
        !           407: 
        !           408: // コンストラクタ
        !           409: Luna88kMainbus::Luna88kMainbus()
        !           410: {
        !           411:        // デバイス (順序に注意)
        !           412:        // BusErrDevice, NopIODevice は親コンストラクタで作成済み。
        !           413: 
        !           414:        NEWDV(Interrupt, new SysCtlrDevice());
        !           415:        NEWDV(RTC, new BusIO_BFFF<MK48T02Device>());    // required by SysClk
        !           416:        NEWDV(SysClk, new BusIO_BFFF<SysClkDevice>());  // required by PROMEmu
        !           417:        if (gMainApp.exec_file || gConfig->Find("prom-image").AsString().empty()) {
        !           418:                NEWDV(PROM, new Luna88kPROMEmuDevice());
        !           419:        } else {
        !           420:                NEWDV(PROM, new PROMDevice());                          // required by RAM
        !           421:        }
        !           422:        NEWDV(PROM0, new PROM0Device());
        !           423:        NEWDV(MainRAM, new MainRAMDevice());                    // required by PartialRAM
        !           424:        NEWDV(PartialRAM, new PartialRAMDevice());
        !           425:        NEWDV(FuseROM, new BusIO_BFFF<FuseROMDevice>());
        !           426:        NEWDV(PIO0, new BusIO_BFFF<PIO0Device>());
        !           427:        NEWDV(PIO1, new BusIO_BFFF<PIO1Device>());
        !           428:        NEWDV(SIO, new BusIO_BFFF<SIODevice>());
        !           429:        NEWDV(TAS, new BusIO_BFFF<TASDevice>());
        !           430:        NEWDV(SubRAM, new SubRAMDevice(128));
        !           431:        NEWDV(BT45x, new BT45xDevice());                                // required by Lunafb
        !           432:        NEWDV(PlaneVRAM, new LunafbDevice());
        !           433:        NEWDV(CRTC2, new BusIO_BFFF<CRTC2Device>());
        !           434:        NEWDV(SPC, new BusIO_BFFF<SPCDevice>());
        !           435:        NEWDV(Ethernet, new BusIO_WF<LanceDevice>());
        !           436:        NEWDV(CMMU, new CMMUDevice());
        !           437: 
        !           438:        // デバイスマップから devtable を作成
        !           439:        MakeDevtable(maptable);
        !           440: }
        !           441: 
        !           442: // デストラクタ
        !           443: Luna88kMainbus::~Luna88kMainbus()
        !           444: {
        !           445: }

unix.superglobalmegacorp.com

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