|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.