Annotation of nono/vm/vm_luna.cpp, revision 1.1.1.2

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: 
                      7: #include "vm_luna.h"
                      8: #include "aout.h"
                      9: #include "bitmap.h"
                     10: #include "bt454.h"
                     11: #include "busio.h"
1.1.1.2 ! root       12: #include "cmmu.h"
        !            13: #include "config.h"
1.1       root       14: #include "crtc2.h"
                     15: #include "ethernet.h"
                     16: #include "fuserom.h"
                     17: #include "lance.h"
                     18: #include "lcd.h"
                     19: #include "lunakbd.h"
                     20: #include "mainapp.h"
                     21: #include "mk48t02.h"
1.1.1.2 ! root       22: #include "mpu680x0.h"
        !            23: #include "mpu88xx0.h"
1.1       root       24: #include "pio.h"
1.1.1.2 ! root       25: #include "prom.h"
1.1       root       26: #include "ram.h"
                     27: #include "renderer.h"
                     28: #include "romemu_luna.h"
                     29: #include "romemu_luna88k.h"
                     30: #include "scheduler.h"
                     31: #include "sio.h"
                     32: #include "spc.h"
                     33: #include "sysclk.h"
1.1.1.2 ! root       34: #include "sysctlr.h"
        !            35: #include "tas.h"
1.1       root       36: #include "zram.h"
                     37: 
                     38: // LUNA のデバイス割り当て表 (上位8ビット)
                     39: //
                     40: // 仕様      実際
                     41: // 00  00              メインメモリ
                     42: // --  01..03  二重バスフォールトするようだ
                     43: // --  04..0f  何かよく分からないものが読める
                     44: // --  10..3f  BUSERR
                     45: // 41  40..43  PROM (B、N=128KBでミラー)
                     46: // 45  44..47  mk48t02 (B、N=2048でミラー)
                     47: // 49  48..4b  pio0 (B、N=4でミラー)
                     48: // 4d  4c..4f  pio1 (B、N=4でミラー)
                     49: // 51  50..53  sio  (BB、N=4でミラー)
                     50: // --  54..5f  0xff が読めるようだ
                     51: // 61  60..61  TAS (B、N=1でミラー)
                     52: // 63  62..63  システムクロック (B、N=1でミラー)
                     53: // --           以降TASとSysClkで2枠ずつ。また無効ビットの読み出しは
                     54: // --          必ずしも Hi とは限らず不安定のようだ。
                     55: // 71  70..7f  3ポートRAM (B、N=128KBでミラー)
                     56: // 81  80..    BUSERR (オンボード拡張スロットA)
                     57: // 83    ..8f  BUSERR (オンボード拡張スロットB)
                     58: // 91  90..9f  0xff が読めるようだ (PC-9000 拡張スロット)
                     59: //
                     60: // a1                  マスクROM
                     61: //              a0,a2,a4,... BUSERR
                     62: //              a1,a3,a5,... マスクROM(なければ0xffが読める)
                     63: // b1                  ビットマップ
                     64: //              b0,b2,b4,... BUSERR
                     65: //              b1,b3,b5,... ビットマップ (内訳は bitmap.cpp 参照)
                     66: // c1                  パレット
                     67: //              c0,c2,c4,... BUSERR
                     68: //              c1,c3,c5,... パレット (B、N=4でミラー)
                     69: // d1                  CRTC-II
                     70: //              d0,d2,d4,... BUSERR
                     71: //              d1,d3,d5,... CRTC-II (B、N=2でミラー)
                     72: //
                     73: // e1  e0..e3  SCSI (BBBB、N=16 でミラー)
                     74: // --  e4..ef  0xff が読めるようだが不安定。
                     75: // f1  f0..f3  LANCE (WW、N=2 でミラー)
                     76: // --  f4..ff  0xff が読めるようだ
                     77: 
                     78: // デバイスマップ用の識別子
                     79: enum {
                     80:        NONE,
                     81:        BUSERR,
                     82:        RAM,
                     83:        PROM,
                     84:        MK48,
                     85:        PIO0,
                     86:        PIO1,
                     87:        SIO,
                     88:        TAS,
                     89:        SYSCLK,
                     90:        ZRAM,
                     91:        MROM,
                     92:        BITMAP,
                     93:        BT454,
                     94:        CRTC2,
                     95:        SCSI,
                     96:        LANCE,
                     97:        FUSE,
1.1.1.2 ! root       98:        SYSCTL,
        !            99:        CMMU,
1.1       root      100: };
                    101: 
                    102: //
                    103: // LUNA-I
                    104: //
                    105: 
                    106: /*static*/ const uint8
                    107: VM_LUNA::maptable[256] = {
                    108:        // 01,02,03 は実際には二重バスフォールトになるがそれは未対応
                    109:        RAM,    NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 00
                    110:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 08
                    111:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10
                    112:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18
                    113:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20
                    114:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28
                    115:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30
                    116:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38
                    117: 
                    118:        PROM,   PROM,   PROM,   PROM,   MK48,   MK48,   MK48,   MK48,   // 40
                    119:        PIO0,   PIO0,   PIO0,   PIO0,   PIO1,   PIO1,   PIO1,   PIO1,   // 48
                    120:        SIO,    SIO,    SIO,    SIO,    NONE,   NONE,   NONE,   NONE,   // 50
                    121:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 58
                    122:        TAS,    TAS,    SYSCLK, SYSCLK, TAS,    TAS,    SYSCLK, SYSCLK, // 60
                    123:        TAS,    TAS,    SYSCLK, SYSCLK, TAS,    TAS,    SYSCLK, SYSCLK, // 68
                    124:        ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   // 70
                    125:        ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   // 78
                    126: 
                    127:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80
                    128:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88
                    129:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 90
                    130:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 98
                    131:        BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   // a0
                    132:        BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   // a8
                    133:        BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0
                    134:        BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8
                    135: 
                    136:        BUSERR, BT454,  BUSERR, BT454,  BUSERR, BT454,  BUSERR, BT454,  // c0
                    137:        BUSERR, BT454,  BUSERR, BT454,  BUSERR, BT454,  BUSERR, BT454,  // c8
                    138:        BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  // d0
                    139:        BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  // d8
                    140:        SCSI,   SCSI,   SCSI,   SCSI,   NONE,   NONE,   NONE,   NONE,   // e0
                    141:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // e8
                    142:        LANCE,  LANCE,  LANCE,  LANCE,  NONE,   NONE,   NONE,   NONE,   // f0
                    143:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // f8
                    144: };
                    145: 
                    146: // コンストラクタ
                    147: VM_LUNA::VM_LUNA()
                    148: {
1.1.1.2 ! root      149:        // 機種固有パラメータ
        !           150:        // MPU クロックの初期値は機種ごとに異なる。単位は MHz
        !           151:        gConfig->SetDefault("mpu-clock", 20);
        !           152:        // RAM 初期値は MAX にしておく
        !           153:        gConfig->SetDefault("ram-size", 16);
        !           154:        // SPC の入力クロック (おそらく 6.144MHz = 163ns が入ってる)
        !           155:        gConfig->Add("!spc-tCLF", 163);
        !           156:        // LUNA-I のクロック割り込みは 60Hz
        !           157:        gConfig->Add("!sysclk-period", 16.666667_msec);
        !           158: 
1.1       root      159:        // デバイス (順序に注意)
1.1.1.2 ! root      160:        // BusErrDevice は親コンストラクタで作成済み。
        !           161: 
        !           162:        gScheduler.reset(new Scheduler());                              // required by *
1.1       root      163:        gMPU.reset(new MPU680x0Device(0x41000000));
                    164:        gRAM.reset(new RAMDevice());
1.1.1.2 ! root      165:        gEthernet.reset(new BusIO_W<LanceDevice>());    // required by PROM
        !           166:        if (gMainApp.host_file || gConfig->Find("prom-image").AsString().empty()) {
        !           167:                prom.reset(new LunaPROMEmuDevice());
1.1       root      168:        } else {
1.1.1.2 ! root      169:                prom.reset(new PROMDevice());
1.1       root      170:        }
                    171:        gRTC.reset(new BusIO_B<MK48T02Device>());
                    172:        gPIO0.reset(new BusIO_B<PIO0Device>());
                    173:        gPIO1.reset(new BusIO_B<PIO1Device>());
                    174:        gSIO.reset(new BusIO_BB<SIODevice>());
                    175:        sysclk.reset(new BusIO_B<SysClkDevice>());
1.1.1.2 ! root      176:        gTAS.reset(new BusIO_B<TASDevice>());
1.1       root      177:        gZRAM.reset(new ZRAMDevice());
1.1.1.2 ! root      178:        gBitmap.reset(new BitmapDevice());                              // required by BT454
1.1       root      179:        gBT454.reset(new BusIO_B<BT454Device>());
                    180:        crtc2.reset(new BusIO_B<CRTC2Device>());
                    181:        gSPC.reset(new BusIO_BBBB<SPCDevice>());
                    182:        nulldev.reset(new NullDevice());
                    183: 
                    184:        gLCD.reset(new LCDDevice());
                    185:        gKeyboard.reset(new LunaKeyboard());
                    186:        gRenderer.reset(new LunaRenderer());
                    187: 
                    188:        // デバイスマップから devtable を作成
                    189:        for (uint i = 0; i < countof(::devtable); i++) {
                    190:                IODevice *d;
                    191:                switch (maptable[i]) {
                    192:                 case NONE:             d = nulldev.get();      break;
                    193:                 case BUSERR:   d = buserr.get();       break;
                    194:                 case RAM:              d = gRAM.get();         break;
1.1.1.2 ! root      195:                 case PROM:             d = prom.get();         break;
1.1       root      196:                 case MK48:             d = gRTC.get();         break;
                    197:                 case PIO0:             d = gPIO0.get();        break;
                    198:                 case PIO1:             d = gPIO1.get();        break;
                    199:                 case SIO:              d = gSIO.get();         break;
1.1.1.2 ! root      200:                 case TAS:              d = gTAS.get();         break;
1.1       root      201:                 case SYSCLK:   d = sysclk.get();       break;
                    202:                 case ZRAM:             d = gZRAM.get();        break;
                    203:                 case MROM:             d = nulldev.get();      break;
                    204:                 case BITMAP:   d = gBitmap.get();      break;
                    205:                 case BT454:    d = gBT454.get();       break;
                    206:                 case CRTC2:    d = crtc2.get();        break;
                    207:                 case SCSI:             d = gSPC.get();         break;
                    208:                 case LANCE:    d = gEthernet.get();    break;
                    209:                 default:
                    210:                        __unreachable();
                    211:                }
                    212:                ::devtable[i] = d;
                    213:        }
                    214: }
                    215: 
                    216: // デストラクタ
                    217: VM_LUNA::~VM_LUNA()
                    218: {
                    219: }
                    220: 
                    221: void
                    222: VM_LUNA::PowerButton()
                    223: {
                    224:        // LUNA の電源ボタンは電源オンにしか使わない。
                    225:        //
                    226:        // 電源       ボタン
                    227:        // ON   PUSH            (何も起きない)
                    228:        // OFF  PUSH            電源オン
                    229: 
                    230:        // デバイスに指示
                    231:        DevicePowerOn();
                    232: }
                    233: 
                    234: 
                    235: //
                    236: // LUNA88K
                    237: //
                    238: 
                    239: /*static*/ const uint8
                    240: VM_LUNA88K::maptable[256] = {
                    241:        RAM,    NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 00
                    242:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 08
                    243:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10
                    244:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18
                    245:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20
                    246:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28
                    247:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30
                    248:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38
                    249: 
                    250:        // LUNA88K2 は 47 に(も?) NVRAM がいるようだ
                    251:        // 69,6b,6d にも何かのコントローラ?
                    252:        PROM,   PROM,   PROM,   FUSE,   MK48,   MK48,   MK48,   MK48,   // 40
                    253:        PIO0,   PIO0,   PIO0,   PIO0,   PIO1,   PIO1,   PIO1,   PIO1,   // 48
                    254:        SIO,    SIO,    SIO,    SIO,    NONE,   NONE,   NONE,   NONE,   // 50
                    255:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 58
1.1.1.2 ! root      256:        TAS,    TAS,    SYSCLK, SYSCLK, NONE,   SYSCTL, NONE,   NONE,   // 60
        !           257:        NONE,   SYSCTL, NONE,   NONE,   NONE,   SYSCTL, NONE,   NONE,   // 68
1.1       root      258:        ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   // 70
                    259:        ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   ZRAM,   // 78
                    260: 
                    261:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80
                    262:        BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88
                    263:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 90
                    264:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // 98
                    265:        BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   // a0
                    266:        BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   BUSERR, MROM,   // a8
                    267:        BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0
                    268:        BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8
                    269: 
                    270:        // d0 にボードチェックレジスタ?
                    271:        BUSERR, BT454,  BUSERR, BT454,  BUSERR, BT454,  BUSERR, BT454,  // c0
                    272:        BUSERR, BT454,  BUSERR, BT454,  BUSERR, BT454,  BUSERR, BT454,  // c8
                    273:        BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  // d0
                    274:        BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  BUSERR, CRTC2,  // d8
                    275:        SCSI,   SCSI,   SCSI,   SCSI,   NONE,   NONE,   NONE,   NONE,   // e0
                    276:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   // e8
                    277:        LANCE,  LANCE,  LANCE,  LANCE,  NONE,   NONE,   NONE,   NONE,   // f0
1.1.1.2 ! root      278:        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   CMMU,   // f8
1.1       root      279: };
                    280: 
                    281: // コンストラクタ
                    282: VM_LUNA88K::VM_LUNA88K()
                    283: {
1.1.1.2 ! root      284:        // 機種固有パラメータ
        !           285:        // MPU クロックの初期値は機種ごとに異なる。単位は MHz
        !           286:        gConfig->SetDefault("mpu-clock", 25);
        !           287:        // RAM 初期値は MAX にしておく
        !           288:        gConfig->SetDefault("ram-size", 16);
        !           289:        // SPC の入力クロック (XXX LUNA-I と同じ?)
        !           290:        gConfig->Add("!spc-tCLF", 163);
        !           291:        // LUNA-II, LUNA88K, LUNA88K2 のクロック割り込みは 100Hz らしい
        !           292:        gConfig->Add("!sysclk-period", 10_msec);
        !           293: 
1.1       root      294:        // デバイス (順序に注意)
1.1.1.2 ! root      295:        // BusErrDevice は親コンストラクタで作成済み。
        !           296: 
        !           297:        gScheduler.reset(new Scheduler());                              // required by *
1.1       root      298:        gMPU.reset(new MPU88xx0Device(0x41000000));
                    299:        gRAM.reset(new RAMDevice());
1.1.1.2 ! root      300:        if (gMainApp.host_file || gConfig->Find("prom-image").AsString().empty()) {
        !           301:                prom.reset(new Luna88kPROMEmuDevice());
1.1       root      302:        } else {
1.1.1.2 ! root      303:                prom.reset(new PROMDevice());
1.1       root      304:        }
                    305:        gRTC.reset(new BusIO_BFFF<MK48T02Device>());
1.1.1.2 ! root      306:        gPIO0.reset(new BusIO_BFFF<PIO0Device>());
        !           307:        gPIO1.reset(new BusIO_BFFF<PIO1Device>());
1.1       root      308:        gSIO.reset(new BusIO_BFFF<SIODevice>());
                    309:        sysclk.reset(new SysClkDevice());
1.1.1.2 ! root      310:        gTAS.reset(new BusIO_BFFF<TASDevice>());
1.1       root      311:        gZRAM.reset(new ZRAMDevice());
1.1.1.2 ! root      312:        gBitmap.reset(new BitmapDevice());                              // required by BT454
1.1       root      313:        gBT454.reset(new BusIO_B<BT454Device>());
                    314:        crtc2.reset(new BusIO_BFFF<CRTC2Device>());
                    315:        gSPC.reset(new BusIO_BFFF<SPCDevice>());
1.1.1.2 ! root      316:        gEthernet.reset(new BusIO_WF<LanceDevice>());   // required by FuseROM
        !           317:        fuserom.reset(new BusIO_BFFF<FuseROMDevice>());
        !           318:        gSysCtlr.reset(new SysCtlrDevice());
        !           319:        gCMMU.reset(new CMMUDevice());
1.1       root      320:        nulldev.reset(new NullDevice());
                    321: 
                    322:        gLCD.reset(new LCDDevice());
                    323:        gKeyboard.reset(new LunaKeyboard());
                    324:        gRenderer.reset(new LunaRenderer());
                    325: 
                    326:        // デバイスマップから devtable を作成
                    327:        for (uint i = 0; i < countof(::devtable); i++) {
                    328:                IODevice *d;
                    329:                switch (maptable[i]) {
                    330:                 case NONE:             d = nulldev.get();      break;
                    331:                 case BUSERR:   d = buserr.get();       break;
                    332:                 case RAM:              d = gRAM.get();         break;
1.1.1.2 ! root      333:                 case PROM:             d = prom.get();         break;
1.1       root      334:                 case MK48:             d = gRTC.get();         break;
                    335:                 case PIO0:             d = gPIO0.get();        break;
                    336:                 case PIO1:             d = gPIO1.get();        break;
                    337:                 case SIO:              d = gSIO.get();         break;
1.1.1.2 ! root      338:                 case TAS:              d = gTAS.get();         break;
1.1       root      339:                 case SYSCLK:   d = sysclk.get();       break;
                    340:                 case ZRAM:             d = gZRAM.get();        break;
                    341:                 case MROM:             d = nulldev.get();      break;
                    342:                 case BITMAP:   d = gBitmap.get();      break;
                    343:                 case BT454:    d = gBT454.get();       break;
                    344:                 case CRTC2:    d = crtc2.get();        break;
                    345:                 case SCSI:             d = gSPC.get();         break;
1.1.1.2 ! root      346:                 case LANCE:    d = gEthernet.get();    break;
1.1       root      347:                 case FUSE:             d = fuserom.get();      break;
1.1.1.2 ! root      348:                 case SYSCTL:   d = gSysCtlr.get();     break;
        !           349:                 case CMMU:             d = gCMMU.get();        break;
1.1       root      350:                 default:
                    351:                        __unreachable();
                    352:                }
                    353:                ::devtable[i] = d;
                    354:        }
                    355: }
                    356: 
                    357: // デストラクタ
                    358: VM_LUNA88K::~VM_LUNA88K()
                    359: {
                    360: }
                    361: 
                    362: void
                    363: VM_LUNA88K::PowerButton()
                    364: {
                    365:        // デバイスに指示
                    366:        DevicePowerOn();
                    367: }

unix.superglobalmegacorp.com

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