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

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

unix.superglobalmegacorp.com

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