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

unix.superglobalmegacorp.com

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