Annotation of nono/vm/vm_x68k.cpp, revision 1.1.1.6

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_x68k.h"
1.1.1.2   root        8: #include "bus.h"
                      9: #include "config.h"
1.1.1.5   root       10: #include "dmac.h"
                     11: #include "fdc.h"
1.1       root       12: #include "human68k.h"
1.1.1.4   root       13: #include "interrupt.h"
1.1.1.5   root       14: #include "mfp.h"
1.1.1.2   root       15: #include "mpu680x0.h"
1.1.1.5   root       16: #include "pedec.h"
                     17: #include "pluto.h"
                     18: #include "pio.h"
1.1       root       19: #include "renderer.h"
                     20: #include "rp5c15.h"
1.1.1.6 ! root       21: #include "romimg_x68k.h"
1.1       root       22: #include "scheduler.h"
1.1.1.5   root       23: #include "spc.h"
1.1       root       24: #include "x68kkbd.h"
                     25: #include "xiospace.h"
                     26: 
                     27: //
                     28: // X68030 VM
                     29: //
                     30: 
                     31: // コンストラクタ
                     32: VM_X68030::VM_X68030()
                     33: {
1.1.1.2   root       34:        // 機種固有パラメータ
                     35:        // MPU クロックの初期値は機種ごとに異なる。単位は MHz
                     36:        gConfig->SetDefault("mpu-clock", 25);
                     37:        // RAM 初期値は MAX にしておく
                     38:        gConfig->SetDefault("ram-size", 12);
                     39:        // SPC の入力クロック (5MHz = 200ns)
                     40:        gConfig->Add("!spc-tCLF", 200);
                     41: 
1.1.1.3   root       42:        // この機種に不要なパラメータはここで削除する
                     43:        // (機種が決まるより前に全機種の設定の和集合を用意してあるため)
                     44:        gConfig->Delete("luna-dipsw1");
                     45:        gConfig->Delete("luna-dipsw2");
                     46:        gConfig->Delete("prom-image");
                     47: 
1.1       root       48:        // デバイス (順序に注意)
1.1.1.2   root       49:        // BusErrDevice は親コンストラクタで作成済み。
                     50: 
1.1.1.6 ! root       51:        gMPU.reset(new MPU680x0Device());                               // required by Scheduler
1.1.1.2   root       52:        gScheduler.reset(new Scheduler());                              // required by *
1.1.1.4   root       53:        gInterrupt.reset(new X68030Interrupt());
1.1.1.2   root       54:        gRAM.reset(new RAMDevice());                                    // required by XIOSpace
1.1.1.5   root       55:        gXIOSpace.reset(new XIOSpaceDevice());
1.1.1.6 ! root       56:        gIPLROM0.reset(new IPLROM0Device());
1.1       root       57: 
                     58:        gKeyboard.reset(new X68030Keyboard());
                     59:        gRenderer.reset(new X68030Renderer());
                     60: 
                     61:        // 割り当て
                     62:        // 今は拡張メモリがないので、今は上位8ビット全領域がミラーになっている。
                     63:        for (int i = 0; i < countof(::devtable); i++) {
1.1.1.5   root       64:                ::devtable[i] = gXIOSpace.get();
1.1       root       65:        }
                     66: }
                     67: 
                     68: // デストラクタ
                     69: VM_X68030::~VM_X68030()
                     70: {
                     71: }
                     72: 
1.1.1.2   root       73: // X68030 の電源ボタンを押す。
1.1       root       74: void
                     75: VM_X68030::PowerButton()
                     76: {
                     77:        // 電源       ボタン
                     78:        // ON   OFF->ON         電源オフ割り込みをネゲート?
                     79:        // ON   ON ->OFF        電源オフ割り込みをアサート?
                     80:        // OFF  OFF->ON         電源オン
                     81:        // OFF  ON ->OFF        (通常はあり得ないはず)
                     82: 
                     83:        // ボタンの状態を更新して..
                     84:        power_button = !power_button;
                     85: 
1.1.1.6 ! root       86:        // スケジューラに指示
        !            87:        gScheduler->RequestPowerOn();
        !            88: }
        !            89: 
        !            90: // ブートページを切り替える。
        !            91: void
        !            92: VM_X68030::SwitchBootPage(Device *parent, bool isrom)
        !            93: {
        !            94:        // 共通処理
        !            95:        inherited::SwitchBootPage(parent, isrom);
        !            96: 
        !            97:        // X68030 では XIOSpace が担当している
        !            98:        gXIOSpace->SwitchBootPage(isrom);
1.1       root       99: }
                    100: 
1.1.1.5   root      101: // リセットについて
                    102: //
                    103: //           PWRRESET
                    104: // 電源オン ----------+--> VIPS
                    105: // (7505)             +--> VideoCtlr
                    106: //                    +--> OSCIAN2
                    107: //                    |
                    108: //                    |   +------+
                    109: //                    +-->|      |
                    110: // 本体      SWRESET      | YUKI | IPLRESET
                    111: // リセット ------------->|      |-----------> FPU
                    112: // スイッチ               +------+
                    113: //                         |
                    114: //                         ▽
                    115: //                   RESET |
                    116: //                         |<-> MPU (68030)
                    117: //                         +--> PPI
                    118: //                         +--> PEDEC
                    119: //                         +--> SPC
                    120: //                         +--> ADPCM
                    121: //                         +--> FDC
                    122: //                         +--> MFP
                    123: //                         |
                    124: //                         |      EXRESET
                    125: //                         +---|>-----------> 外部バス
                    126: //                         ▽
                    127: //                SYSRESET |
                    128: //                         |<-> SAKI  ---+
                    129: //                         |             | BEC0,BEC1
                    130: //                         +--> DMAC  <--+
                    131: //                         +--> CYNTHIA
                    132: // リセットされない?
                    133: // o CACHY
                    134: // o YM2151 (FM音源)
                    135: // o SCC
                    136: 
                    137: // MPU の RESET 命令によるリセット
                    138: void
                    139: VM_X68030::ResetByMPU()
                    140: {
                    141:        gDMAC->ResetHard();
                    142:        gFDC->ResetHard();
                    143:        gMFP->ResetHard();
                    144:        gPEDEC->ResetHard();
                    145:        gPluto->ResetHard();
                    146:        gPPI->ResetHard();
                    147:        gSPC->ResetHard();
                    148: }
1.1       root      149: 
                    150: //
                    151: // RXZ .r .x .z human68k console emulator
                    152: //
                    153: 
                    154: // コンストラクタ
                    155: VM_RXZ::VM_RXZ()
                    156: {
1.1.1.2   root      157:        // 機種固有パラメータ
                    158:        // MPU クロックの初期値は機種ごとに異なる。単位は MHz
                    159:        gConfig->SetDefault("mpu-clock", 25);
                    160:        // RAM 初期値は MAX にしておく
                    161:        gConfig->SetDefault("ram-size", 12);
                    162:        // SPC の入力クロック (5MHz = 200ns)
                    163:        gConfig->Add("!spc-tCLF", 200);
                    164: 
1.1.1.3   root      165:        // この機種に不要なパラメータはここで削除する
                    166:        // (機種が決まるより前に全機種の設定の和集合を用意してあるため)
                    167:        gConfig->Delete("luna-dipsw1");
                    168:        gConfig->Delete("luna-dipsw2");
                    169:        gConfig->Delete("prom-image");
                    170: 
1.1       root      171:        // デバイス (順序に注意)
1.1.1.2   root      172:        // BusErrDevice は親コンストラクタで作成済み。
                    173: 
1.1.1.6 ! root      174:        gMPU.reset(new MPU680x0Device());                               // required by Scheduler
1.1.1.2   root      175:        gScheduler.reset(new Scheduler());                              // required by *
1.1.1.4   root      176:        gInterrupt.reset(new X68030Interrupt());
1.1.1.2   root      177:        gRAM.reset(new RAMDevice());                                    // required by Human68k
1.1       root      178:        gRTC.reset(new RP5C15Device());
                    179:        human68k.reset(new Human68k());
1.1.1.4   root      180: 
                    181:        // 割り当て
                    182:        // 全域 RAM に見せる。正しくはない。
                    183:        for (int i = 0; i < countof(::devtable); i++) {
                    184:                ::devtable[i] = gRAM.get();
                    185:        }
1.1       root      186: }
                    187: 
                    188: // デストラクタ
                    189: VM_RXZ::~VM_RXZ()
                    190: {
                    191: }
                    192: 
                    193: void
                    194: VM_RXZ::PowerButton()
                    195: {
                    196:        // RXZ の電源ボタンは電源オンにしか使わない。
                    197:        //
                    198:        // 電源       ボタン
                    199:        // ON   PUSH            (何も起きない)
                    200:        // OFF  PUSH            電源オン
                    201: 
1.1.1.6 ! root      202:        // スケジューラに指示
        !           203:        gScheduler->RequestPowerOn();
        !           204: }
        !           205: 
        !           206: // ブートページを切り替える。
        !           207: void
        !           208: VM_RXZ::SwitchBootPage(Device *parent, bool isrom)
        !           209: {
        !           210:        // 何もしない
1.1       root      211: }

unix.superglobalmegacorp.com

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