Annotation of nono/vm/vm_luna.cpp, revision 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.