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

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

unix.superglobalmegacorp.com

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