|
|
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:
1.1.1.8 ! root 7: //
! 8: // VM (X68030)
! 9: //
! 10:
1.1 root 11: #include "vm_x68k.h"
1.1.1.2 root 12: #include "bus.h"
13: #include "config.h"
1.1.1.5 root 14: #include "dmac.h"
15: #include "fdc.h"
1.1 root 16: #include "human68k.h"
1.1.1.4 root 17: #include "interrupt.h"
1.1.1.7 root 18: #include "mainapp.h"
1.1.1.5 root 19: #include "mfp.h"
1.1.1.2 root 20: #include "mpu680x0.h"
1.1.1.8 ! root 21: #include "nmi.h"
1.1.1.5 root 22: #include "pedec.h"
23: #include "pluto.h"
24: #include "pio.h"
1.1.1.8 ! root 25: #include "power.h"
1.1 root 26: #include "renderer.h"
27: #include "rp5c15.h"
1.1.1.6 root 28: #include "romimg_x68k.h"
1.1 root 29: #include "scheduler.h"
1.1.1.5 root 30: #include "spc.h"
1.1 root 31: #include "x68kkbd.h"
32: #include "xiospace.h"
33:
34: // コンストラクタ
35: VM_X68030::VM_X68030()
36: {
1.1.1.2 root 37: // 機種固有パラメータ
38: // MPU クロックの初期値は機種ごとに異なる。単位は MHz
39: gConfig->SetDefault("mpu-clock", 25);
40: // RAM 初期値は MAX にしておく
41: gConfig->SetDefault("ram-size", 12);
42: // SPC の入力クロック (5MHz = 200ns)
43: gConfig->Add("!spc-tCLF", 200);
44:
1.1.1.3 root 45: // この機種に不要なパラメータはここで削除する
46: // (機種が決まるより前に全機種の設定の和集合を用意してあるため)
47: gConfig->Delete("luna-dipsw1");
48: gConfig->Delete("luna-dipsw2");
49: gConfig->Delete("prom-image");
1.1.1.8 ! root 50: gConfig->Delete("rtc-epoch-year");
1.1.1.3 root 51:
1.1 root 52: // デバイス (順序に注意)
1.1.1.2 root 53: // BusErrDevice は親コンストラクタで作成済み。
54:
1.1.1.8 ! root 55: NEWDV(MPU, new MPU680x0Device());
! 56: NEWDV(Interrupt, new X68030Interrupt());
! 57: NEWDV(RAM, new RAMDevice()); // required by XIOSpace
! 58: NEWDV(XIOSpace, new XIOSpaceDevice());
! 59: NEWDV(IPLROM0, new IPLROM0Device());
! 60:
! 61: NEWDV(NMI, new NMIDevice());
! 62: NEWDV(Keyboard, new X68030Keyboard());
! 63: NEWDV(Renderer, new X68030Renderer());
1.1 root 64:
1.1.1.7 root 65: if (gMainApp.human_mode) {
1.1.1.8 ! root 66: NEWDV(Human68k, new Human68k());
1.1.1.7 root 67: }
68:
1.1 root 69: // 割り当て
70: // 今は拡張メモリがないので、今は上位8ビット全領域がミラーになっている。
71: for (int i = 0; i < countof(::devtable); i++) {
1.1.1.8 ! root 72: ::devtable[i] = gXIOSpace;
1.1 root 73: }
74: }
75:
76: // デストラクタ
77: VM_X68030::~VM_X68030()
78: {
79: }
80:
1.1.1.2 root 81: // X68030 の電源ボタンを押す。
1.1 root 82: void
83: VM_X68030::PowerButton()
84: {
85: // 電源 ボタン
86: // ON OFF->ON 電源オフ割り込みをネゲート?
87: // ON ON ->OFF 電源オフ割り込みをアサート?
88: // OFF OFF->ON 電源オン
89: // OFF ON ->OFF (通常はあり得ないはず)
90:
91: // ボタンの状態を更新して..
92: power_button = !power_button;
93:
1.1.1.6 root 94: // スケジューラに指示
1.1.1.8 ! root 95: gPower->MakePowerOn();
1.1.1.6 root 96: }
97:
98: // ブートページを切り替える。
99: void
100: VM_X68030::SwitchBootPage(Device *parent, bool isrom)
101: {
1.1.1.7 root 102: if (gMainApp.human_mode) {
103: // Human モードではブートページを RAM に見せる。
104: // 今のところ。
105: return;
106: }
107:
1.1.1.6 root 108: // 共通処理
109: inherited::SwitchBootPage(parent, isrom);
110:
111: // X68030 では XIOSpace が担当している
112: gXIOSpace->SwitchBootPage(isrom);
1.1 root 113: }
114:
1.1.1.5 root 115: // リセットについて
116: //
117: // PWRRESET
118: // 電源オン ----------+--> VIPS
119: // (7505) +--> VideoCtlr
120: // +--> OSCIAN2
121: // |
122: // | +------+
123: // +-->| |
124: // 本体 SWRESET | YUKI | IPLRESET
125: // リセット ------------->| |-----------> FPU
126: // スイッチ +------+
127: // |
128: // ▽
129: // RESET |
130: // |<-> MPU (68030)
131: // +--> PPI
132: // +--> PEDEC
133: // +--> SPC
134: // +--> ADPCM
135: // +--> FDC
136: // +--> MFP
137: // |
138: // | EXRESET
139: // +---|>-----------> 外部バス
140: // ▽
141: // SYSRESET |
142: // |<-> SAKI ---+
143: // | | BEC0,BEC1
144: // +--> DMAC <--+
145: // +--> CYNTHIA
146: // リセットされない?
147: // o CACHY
148: // o YM2151 (FM音源)
149: // o SCC
150:
151: // MPU の RESET 命令によるリセット
152: void
153: VM_X68030::ResetByMPU()
154: {
1.1.1.8 ! root 155: gDMAC->ResetHard(false);
! 156: gFDC->ResetHard(false);
! 157: gMFP->ResetHard(false);
! 158: gPEDEC->ResetHard(false);
! 159: gPluto->ResetHard(false);
! 160: gPPI->ResetHard(false);
! 161: gSPC->ResetHard(false);
1.1.1.5 root 162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.