Annotation of nono/vm/vm.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2017 [email protected]
        !             4: //
        !             5: 
        !             6: #include "vm.h"
        !             7: #include "bitmap.h"
        !             8: #include "bt454.h"
        !             9: #include "bus.h"
        !            10: #include "crtc2.h"
        !            11: #include "ethernet.h"
        !            12: #include "human68k.h"
        !            13: #include "lance.h"
        !            14: #include "lcd.h"
        !            15: #include "lunakbd.h"
        !            16: #include "lunarom.h"
        !            17: #include "mk48t02.h"
        !            18: #include "mpu.h"
        !            19: #include "ppi.h"
        !            20: #include "ram.h"
        !            21: #include "renderer.h"
        !            22: #include "rp5c15.h"
        !            23: #include "scsitarget.h"
        !            24: #include "sio.h"
        !            25: #include "spc.h"
        !            26: #include "sysclk.h"
        !            27: #include "scheduler.h"
        !            28: #include "x68kkbd.h"
        !            29: #include "xiospace.h"
        !            30: #include "zram.h"
        !            31: 
        !            32: VM *gVM;
        !            33: 
        !            34: // コンストラクタ
        !            35: VM::VM(vmtype_t type)
        !            36: {
        !            37:        vmtype = type;
        !            38: 
        !            39:        // どこでやるのがいいかわからんけど、このコンストラクタはメインスレッドで
        !            40:        // 作られるので、ここでメインスレッドの名前を設定。
        !            41:        pthread_setname_np("Main");
        !            42: 
        !            43:        // Scheduler は必ず先頭。(Scheduler::Init のコメント参照)
        !            44:        gScheduler = new Scheduler();
        !            45:        buserr = new BusErrDevice();
        !            46: 
        !            47:        // まず全域をバスエラーで初期化。
        !            48:        // この後継承先で必要に応じて上書きする。
        !            49:        for (int i = 0; i < countof(::devtable); i++) {
        !            50:                ::devtable[i] = buserr;
        !            51:        }
        !            52: }
        !            53: 
        !            54: // デストラクタ
        !            55: VM::~VM()
        !            56: {
        !            57: }
        !            58: 
        !            59: // コンストラクタ後の初期化
        !            60: bool
        !            61: VM::Create()
        !            62: {
        !            63:        for (const auto& d : gDevices) {
        !            64:                if (!d->Create()) {
        !            65:                        return false;
        !            66:                }
        !            67:        }
        !            68: 
        !            69:        return true;
        !            70: }
        !            71: 
        !            72: // 初期化
        !            73: bool
        !            74: VM::Init()
        !            75: {
        !            76:        for (const auto& d : gDevices) {
        !            77:                if (!d->Init()) {
        !            78:                        return false;
        !            79:                }
        !            80:        }
        !            81: 
        !            82:        return true;
        !            83: }
        !            84: 
        !            85: // 設定の適用
        !            86: bool
        !            87: VM::Apply()
        !            88: {
        !            89:        for (const auto& d : gDevices) {
        !            90:                if (!d->Apply()) {
        !            91:                        return false;
        !            92:                }
        !            93:        }
        !            94: 
        !            95:        return true;
        !            96: }
        !            97: 
        !            98: // VM の全デバイスの電源をオン
        !            99: bool
        !           100: VM::DevicePowerOn()
        !           101: {
        !           102:        for (const auto& d : gDevices) {
        !           103:                if (!d->PowerOn()) {
        !           104:                        return false;
        !           105:                }
        !           106:        }
        !           107: 
        !           108:        // ハードウェアリセット
        !           109:        ResetHard();
        !           110: 
        !           111:        // スケジューラを開始
        !           112:        // (ResetMPU より後で起動時に1回だけ呼び出す)
        !           113:        gScheduler->Run();
        !           114: 
        !           115:        return true;
        !           116: }
        !           117: 
        !           118: // VM の全デバイスの電源をオフ
        !           119: // (Scheduler から呼ばれる)
        !           120: bool
        !           121: VM::DevicePowerOff()
        !           122: {
        !           123:        for (const auto& d : gDevices) {
        !           124:                if (!d->PowerOff()) {
        !           125:                        return false;
        !           126:                }
        !           127:        }
        !           128:        // GUI に通知
        !           129:        if (poweroff_callback) {
        !           130:                poweroff_callback();
        !           131:        }
        !           132:        return true;
        !           133: }
        !           134: 
        !           135: // VM 電源オフ時のコールバックを設定する
        !           136: void
        !           137: VM::SetPowerOffCallback(void (*callback)())
        !           138: {
        !           139:        poweroff_callback = callback;
        !           140: }
        !           141: 
        !           142: // ハードウェアリセット
        !           143: void
        !           144: VM::ResetHard()
        !           145: {
        !           146:        for (const auto& d : gDevices) {
        !           147:                d->ResetHard();
        !           148:        }
        !           149: }
        !           150: 
        !           151: // MPU の RESET 命令によるリセット
        !           152: void
        !           153: VM::ResetSoft()
        !           154: {
        !           155:        for (const auto& d : gDevices) {
        !           156:                d->ResetSoft();
        !           157:        }
        !           158: }
        !           159: 
        !           160: 
        !           161: //
        !           162: // X68030 VM
        !           163: //
        !           164: 
        !           165: // コンストラクタ
        !           166: VM_X68030::VM_X68030()
        !           167:        : VM(TYPE_X68030)
        !           168: {
        !           169:        // デバイス (順序に注意)
        !           170:        // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。
        !           171:        gMPU = new MPUDevice(0xff0000);
        !           172:        gRAM = new RAMDevice();                         // required by XIOSpace
        !           173:        xiospace = new XIOSpaceDevice();
        !           174: 
        !           175:        gKeyboard = new X68030Keyboard();
        !           176:        gRenderer = new X68030Renderer();
        !           177: 
        !           178:        // 割り当て
        !           179:        // 今は拡張メモリがないので、今は上位8ビット全領域がミラーになっている。
        !           180:        for (int i = 0; i < countof(::devtable); i++) {
        !           181:                ::devtable[i] = xiospace;
        !           182:        }
        !           183: }
        !           184: 
        !           185: // デストラクタ
        !           186: VM_X68030::~VM_X68030()
        !           187: {
        !           188: }
        !           189: 
        !           190: // X68030 の電源ボタンを押します。
        !           191: void
        !           192: VM_X68030::PowerButton()
        !           193: {
        !           194:        // 電源       ボタン
        !           195:        // ON   OFF->ON         電源オフ割り込みをネゲート?
        !           196:        // ON   ON ->OFF        電源オフ割り込みをアサート?
        !           197:        // OFF  OFF->ON         電源オン
        !           198:        // OFF  ON ->OFF        (通常はあり得ないはず)
        !           199: 
        !           200:        // ボタンの状態を更新して..
        !           201:        power_button = !power_button;
        !           202: 
        !           203:        // デバイスに指示
        !           204:        DevicePowerOn();
        !           205: }
        !           206: 
        !           207: 
        !           208: //
        !           209: // LUNA
        !           210: //
        !           211: 
        !           212: // コンストラクタ
        !           213: VM_LUNA::VM_LUNA()
        !           214:        : VM(TYPE_LUNA)
        !           215: {
        !           216:        // デバイス (順序に注意)
        !           217:        // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。
        !           218:        gMPU = new MPUDevice(0x41000000);
        !           219:        gRAM = new RAMDevice();
        !           220:        gPROM = new PROMDevice();
        !           221:        mk48 = new MK48T02Device();
        !           222:        gRTC = (RTCDevice *)mk48;       // MK48T02 は NVRAM でも RTC でもある…
        !           223:        pio0 = new PIO0Device();
        !           224:        pio1 = new PIO1Device();
        !           225:        gSIO = new SIODevice();
        !           226:        sysclk = new SysClkDevice();
        !           227:        gZRAM = new ZRAMDevice();
        !           228:        maskrom = new MaskROMDevice();
        !           229:        gBitmap = new BitmapDevice();           // required by BT454
        !           230:        gBT454 = new BT454Device();
        !           231:        crtc2 = new CRTC2Device();
        !           232:        gSPC = new SPCDevice(0xe1000000);
        !           233:        gLance = new LanceDevice();
        !           234:        nulldev = new NullDevice();
        !           235: 
        !           236:        gEthernet = gLance;
        !           237:        gLCD = new LCDDevice();
        !           238:        gKeyboard = new LunaKeyboard();
        !           239:        gRenderer = new LunaRenderer();
        !           240: 
        !           241:        // デバイスマップから devtable を作成
        !           242:        for (uint i = 0; i < countof(::devtable); i++) {
        !           243:                IODevice *d;
        !           244:                switch (maptable[i]) {
        !           245:                 case NONE:             d = nulldev;    break;
        !           246:                 case BUSERR:   d = buserr;             break;
        !           247:                 case RAM:              d = gRAM;               break;
        !           248:                 case PROM:             d = gPROM;              break;
        !           249:                 case MK48:             d = mk48;               break;
        !           250:                 case PIO0:             d = pio0;               break;
        !           251:                 case PIO1:             d = pio1;               break;
        !           252:                 case SIO:              d = gSIO;               break;
        !           253:                 case TAS:              d = gZRAM;              break;
        !           254:                 case SYSCLK:   d = sysclk;             break;
        !           255:                 case ZRAM:             d = gZRAM;              break;
        !           256:                 case MROM:             d = maskrom;    break;
        !           257:                 case BITMAP:   d = gBitmap;    break;
        !           258:                 case BT454:    d = gBT454;             break;
        !           259:                 case CRTC2:    d = crtc2;              break;
        !           260:                 case SCSI:             d = gSPC;               break;
        !           261:                 case LANCE:    d = gLance;             break;
        !           262:                 default:
        !           263:                        __unreachable();
        !           264:                }
        !           265:                ::devtable[i] = d;
        !           266:        }
        !           267: }
        !           268: 
        !           269: // デストラクタ
        !           270: VM_LUNA::~VM_LUNA()
        !           271: {
        !           272: }
        !           273: 
        !           274: void
        !           275: VM_LUNA::PowerButton()
        !           276: {
        !           277:        // LUNA の電源ボタンは電源オンにしか使わない。
        !           278:        //
        !           279:        // 電源       ボタン
        !           280:        // ON   PUSH            (何も起きない)
        !           281:        // OFF  PUSH            電源オン
        !           282: 
        !           283:        // デバイスに指示
        !           284:        DevicePowerOn();
        !           285: }
        !           286: 
        !           287: // LUNA のデバイス割り当て表 (上位8ビット)
        !           288: //
        !           289: // 仕様      実際
        !           290: // 00  00              メインメモリ
        !           291: // --  01..03  二重バスフォールトするようだ
        !           292: // --  04..0f  何かよく分からないものが読める
        !           293: // --  10..3f  BUSERR
        !           294: // 41  40..43  PROM
        !           295: // 45  44..47  mk48t02
        !           296: // 49  48..4b  pio0
        !           297: // 4d  4c..4f  pio1
        !           298: // 51  50..53  sio
        !           299: // --  54..5f  0x7f が読めるようだ
        !           300: // 61  60..61  TAS
        !           301: // 63  62..63  システムクロック
        !           302: // --  64..6f  61 (TAS) と同じパターンのように見えるけど不詳
        !           303: // 71  70..7f  3ポートRAM
        !           304: // 81  80..    BUSERR (オンボード拡張スロットA)
        !           305: // 83    ..8f  BUSERR (オンボード拡張スロットB)
        !           306: // 91  90..9f  0xff が読めるようだ (PC-9000 拡張スロット)
        !           307: //
        !           308: // a1                  マスクROM
        !           309: //             a0,a2,a4,... BUSERR
        !           310: //             a1,a3,a5,... マスクROM
        !           311: // b1                  ビットマップ
        !           312: //             b0/b1 で同様
        !           313: // c1                  パレット
        !           314: //             c0/c1 で同様
        !           315: // d1                  CRTC-II
        !           316: //             d0/d1 で同様
        !           317: //
        !           318: // e1  e0..e3  SCSI
        !           319: // --  e4..ef  不詳だけど、同じパターンが読めるようだ
        !           320: // f1  f0..f3  LANCE
        !           321: // --  f4..ff  0xff が読めるようだ
        !           322: 
        !           323: /*static*/ const uint8
        !           324: VM_LUNA::maptable[256] = {
        !           325:        RAM,    NONE,   NONE,   NONE,   // 00 (二重バスフォールト領域は未対応)
        !           326:        NONE,   NONE,   NONE,   NONE,   // 04
        !           327:        NONE,   NONE,   NONE,   NONE,   // 08
        !           328:        NONE,   NONE,   NONE,   NONE,   // 0c
        !           329: #if 1
        !           330:        BUSERR, BUSERR, BUSERR, BUSERR, // 10
        !           331:        BUSERR, BUSERR, BUSERR, BUSERR, // 14
        !           332:        BUSERR, BUSERR, BUSERR, BUSERR, // 18
        !           333:        BUSERR, BUSERR, BUSERR, BUSERR, // 1c
        !           334:        BUSERR, BUSERR, BUSERR, BUSERR, // 20
        !           335:        BUSERR, BUSERR, BUSERR, BUSERR, // 24
        !           336:        BUSERR, BUSERR, BUSERR, BUSERR, // 28
        !           337:        BUSERR, BUSERR, BUSERR, BUSERR, // 2c
        !           338:        BUSERR, BUSERR, BUSERR, BUSERR, // 30
        !           339:        BUSERR, BUSERR, BUSERR, BUSERR, // 34
        !           340:        BUSERR, BUSERR, BUSERR, BUSERR, // 38
        !           341:        BUSERR, BUSERR, BUSERR, BUSERR, // 3c
        !           342: 
        !           343:        PROM,   PROM,   PROM,   PROM,   // 40
        !           344: #else
        !           345:        // ROM が搭載メモリ量を調べる際の終了条件はここでいう NONE デバイス
        !           346:        // なので、256MB(-32KB) 以上実装する場合は少なくとも実装メモリの直後を
        !           347:        // NONE にしておく必要がある。
        !           348:        NONE,   NONE,   NONE,   NONE,   // 10
        !           349:        NONE,   NONE,   NONE,   NONE,   // 14
        !           350:        NONE,   NONE,   NONE,   NONE,   // 18
        !           351:        NONE,   NONE,   NONE,   NONE,   // 1c
        !           352:        NONE,   NONE,   NONE,   NONE,   // 20
        !           353:        NONE,   NONE,   NONE,   NONE,   // 24
        !           354:        NONE,   NONE,   NONE,   NONE,   // 28
        !           355:        NONE,   NONE,   NONE,   NONE,   // 2c
        !           356:        NONE,   NONE,   NONE,   NONE,   // 30
        !           357:        NONE,   NONE,   NONE,   NONE,   // 34
        !           358:        NONE,   NONE,   NONE,   NONE,   // 38
        !           359:        NONE,   NONE,   NONE,   NONE,   // 3c
        !           360: 
        !           361:        NONE,   PROM,   PROM,   PROM,   // 40
        !           362: #endif
        !           363:        MK48,   MK48,   MK48,   MK48,   // 44
        !           364:        PIO0,   PIO0,   PIO0,   PIO0,   // 48
        !           365:        PIO1,   PIO1,   PIO1,   PIO1,   // 4c
        !           366:        SIO,    SIO,    SIO,    SIO,    // 50
        !           367:        NONE,   NONE,   NONE,   NONE,   // 54
        !           368:        NONE,   NONE,   NONE,   NONE,   // 58
        !           369:        NONE,   NONE,   NONE,   NONE,   // 5c
        !           370:        TAS,    TAS,    SYSCLK, SYSCLK, // 60
        !           371:        NONE,   NONE,   NONE,   NONE,   // 64
        !           372:        NONE,   NONE,   NONE,   NONE,   // 68
        !           373:        NONE,   NONE,   NONE,   NONE,   // 6c
        !           374:        ZRAM,   ZRAM,   ZRAM,   ZRAM,   // 70
        !           375:        ZRAM,   ZRAM,   ZRAM,   ZRAM,   // 74
        !           376:        ZRAM,   ZRAM,   ZRAM,   ZRAM,   // 78
        !           377:        ZRAM,   ZRAM,   ZRAM,   ZRAM,   // 7c
        !           378: 
        !           379:        BUSERR, BUSERR, BUSERR, BUSERR, // 80
        !           380:        BUSERR, BUSERR, BUSERR, BUSERR, // 84
        !           381:        BUSERR, BUSERR, BUSERR, BUSERR, // 88
        !           382:        BUSERR, BUSERR, BUSERR, BUSERR, // 8c
        !           383:        NONE,   NONE,   NONE,   NONE,   // 90
        !           384:        NONE,   NONE,   NONE,   NONE,   // 94
        !           385:        NONE,   NONE,   NONE,   NONE,   // 98
        !           386:        NONE,   NONE,   NONE,   NONE,   // 9c
        !           387:        BUSERR, MROM,   BUSERR, MROM,   // a0
        !           388:        BUSERR, MROM,   BUSERR, MROM,   // a4
        !           389:        BUSERR, MROM,   BUSERR, MROM,   // a8
        !           390:        BUSERR, MROM,   BUSERR, MROM,   // ac
        !           391:        BUSERR, BITMAP, BUSERR, BITMAP, // b0
        !           392:        BUSERR, BITMAP, BUSERR, BITMAP, // b4
        !           393:        BUSERR, BITMAP, BUSERR, BITMAP, // b8
        !           394:        BUSERR, BITMAP, BUSERR, BITMAP, // bc
        !           395: 
        !           396:        BUSERR, BT454,  BUSERR, BT454,  // c0
        !           397:        BUSERR, BT454,  BUSERR, BT454,  // c4
        !           398:        BUSERR, BT454,  BUSERR, BT454,  // c8
        !           399:        BUSERR, BT454,  BUSERR, BT454,  // cc
        !           400:        BUSERR, CRTC2,  BUSERR, CRTC2,  // d0
        !           401:        BUSERR, CRTC2,  BUSERR, CRTC2,  // d4
        !           402:        BUSERR, CRTC2,  BUSERR, CRTC2,  // d8
        !           403:        BUSERR, CRTC2,  BUSERR, CRTC2,  // dc
        !           404:        SCSI,   SCSI,   SCSI,   SCSI,   // e0
        !           405:        NONE,   NONE,   NONE,   NONE,   // e4
        !           406:        NONE,   NONE,   NONE,   NONE,   // e8
        !           407:        NONE,   NONE,   NONE,   NONE,   // ec
        !           408:        LANCE,  LANCE,  LANCE,  LANCE,  // f0
        !           409:        NONE,   NONE,   NONE,   NONE,   // f4
        !           410:        NONE,   NONE,   NONE,   NONE,   // f8
        !           411:        NONE,   NONE,   NONE,   NONE,   // fc
        !           412: };
        !           413: 
        !           414: 
        !           415: //
        !           416: // RXZ .r .x .z human68k console emulator
        !           417: //
        !           418: 
        !           419: // コンストラクタ
        !           420: VM_RXZ::VM_RXZ(const char *file, const char *arg)
        !           421:        : VM(TYPE_RXZ)
        !           422: {
        !           423:        // デバイス (順序に注意)
        !           424:        // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。
        !           425:        gMPU = new MPUDevice(0);
        !           426:        gRAM = new RAMDevice();                                 // required by Human68k
        !           427:        gRTC = new RP5C15Device();
        !           428:        human68k = new Human68k(file, arg);
        !           429: }
        !           430: 
        !           431: // デストラクタ
        !           432: VM_RXZ::~VM_RXZ()
        !           433: {
        !           434: }
        !           435: 
        !           436: void
        !           437: VM_RXZ::PowerButton()
        !           438: {
        !           439:        // RXZ の電源ボタンは電源オンにしか使わない。
        !           440:        //
        !           441:        // 電源       ボタン
        !           442:        // ON   PUSH            (何も起きない)
        !           443:        // OFF  PUSH            電源オン
        !           444: 
        !           445:        // デバイスに指示
        !           446:        DevicePowerOn();
        !           447: }

unix.superglobalmegacorp.com

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