|
|
1.1 root 1: //
2: // nono
1.1.1.3 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: // システムポート
! 9: //
! 10:
1.1 root 11: #include "sysport.h"
1.1.1.8 ! root 12: #include "keyboard.h"
! 13: #include "mpu.h"
! 14: #include "nmi.h"
1.1.1.4 root 15: #include "ram.h"
16: #include "romimg_x68k.h"
1.1 root 17: #include "sram.h"
18:
1.1.1.8 ! root 19: // グローバル参照用
! 20: SysportDevice *gSysport;
1.1.1.5 root 21:
1.1.1.8 ! root 22: // コンストラクタ
1.1 root 23: SysportDevice::SysportDevice()
1.1.1.7 root 24: : inherited("SystemPort")
1.1 root 25: {
1.1.1.7 root 26: AddAlias("SysPort");
27:
1.1 root 28: devaddr = baseaddr;
29: devlen = 0x2000;
30: }
31:
1.1.1.8 ! root 32: // デストラクタ
1.1 root 33: SysportDevice::~SysportDevice()
34: {
1.1.1.8 ! root 35: gSysport = NULL;
1.1 root 36: }
37:
1.1.1.8 ! root 38: // リセット
1.1.1.4 root 39: void
1.1.1.8 ! root 40: SysportDevice::ResetHard(bool poweron)
1.1.1.4 root 41: {
1.1.1.6 root 42: sysport.contrast = 0; // XXX 未調査
1.1.1.4 root 43: sysport.ram_wait = 0;
44: sysport.rom_wait = 0;
1.1.1.6 root 45: sysport.key_ctrl = false;
1.1.1.4 root 46: }
47:
1.1 root 48: uint64
1.1.1.5 root 49: SysportDevice::Read(uint32 offset)
1.1 root 50: {
51: uint32 data;
52:
1.1.1.5 root 53: switch (offset) {
1.1 root 54: case SYSPORT::CONTRAST:
55: data = 0xf0 | sysport.contrast;
56: break;
57: case SYSPORT::SCOPE3D:
58: data = 0xff;
59: break;
60: case SYSPORT::IMAGEUNIT:
61: data = 0xff;
62: break;
63: case SYSPORT::KEY:
1.1.1.8 ! root 64: // XXX bit3 以外は要実機確認
! 65: data = 0xf7;
! 66: if (gKeyboard->IsConnected()) {
! 67: data |= 0x08;
! 68: }
1.1 root 69: break;
70: case SYSPORT::WAIT:
71: data = 0xff;
72: break;
73: case SYSPORT::MPU:
74: data = 0xdc;
75: break;
76: case SYSPORT::SRAMWP:
77: data = 0xff;
78: break;
1.1.1.3 root 79: case SYSPORT::POWEROFF:
80: data = 0xff;
81: break;
82: default:
83: __unreachable();
1.1 root 84: }
1.1.1.5 root 85: putlog(1, "$%06X -> $%02x", gMPU->GetPaddr(), data);
1.1 root 86: return data;
87: }
88:
89: uint64
1.1.1.5 root 90: SysportDevice::Write(uint32 offset, uint32 data)
1.1 root 91: {
1.1.1.5 root 92: switch (offset) {
1.1 root 93: case SYSPORT::CONTRAST:
94: sysport.contrast = data & 15;
95: break;
96:
97: case SYSPORT::SCOPE3D:
98: case SYSPORT::IMAGEUNIT:
99: break;
100:
101: case SYSPORT::KEY:
1.1.1.3 root 102: data &= 0x0e;
1.1.1.8 ! root 103: // bit1
! 104: if ((data & 0x02)) {
1.1.1.3 root 105: putlog(0, "$E8E007 未サポート書き込み $%02x", data);
106: }
1.1.1.8 ! root 107: // bit2: NMI リセット
! 108: if ((data & 0x04)) {
! 109: gNMI->NegateNMI();
! 110: }
1.1.1.6 root 111: sysport.key_ctrl = (data & 0x08);
1.1 root 112: break;
113:
114: case SYSPORT::WAIT:
1.1.1.4 root 115: {
1.1 root 116: // 設定値で保持
117: sysport.rom_wait = data >> 4;
118: sysport.ram_wait = data;
1.1.1.4 root 119:
120: // ROM に指示。常に設定値 + 2 でよい
121: gIPLROM1->SetWait(sysport.rom_wait + 2);
122: gIPLROM2->SetWait(sysport.rom_wait + 2);
123: gCGROM->SetWait(sysport.rom_wait + 2);
124: // RAM に指示。InsideOut p.124
125: int wait = sysport.ram_wait;
126: if (wait > 0)
127: wait += 2;
128: gRAM->SetWait(wait);
1.1 root 129: break;
1.1.1.4 root 130: }
1.1 root 131:
132: case SYSPORT::MPU:
133: break;
134:
135: case SYSPORT::SRAMWP:
136: if (data == 0x31) {
137: gSRAM->write_enable(true);
138: } else {
139: gSRAM->write_enable(false);
140: }
141: break;
142:
143: case SYSPORT::POWEROFF:
1.1.1.5 root 144: putlog(0, "$e8e00f (POWEROFF) 未サポート書き込み %02x", data);
1.1 root 145: break;
1.1.1.3 root 146:
147: default:
148: __unreachable();
1.1 root 149: }
150: return 0;
151: }
152:
153: uint64
1.1.1.5 root 154: SysportDevice::Peek(uint32 offset)
1.1 root 155: {
156: uint32 data;
157:
1.1.1.5 root 158: switch (offset) {
1.1 root 159: case SYSPORT::CONTRAST:
160: data = 0xf0 | sysport.contrast;
161: break;
162: case SYSPORT::SCOPE3D:
163: data = 0xff;
164: break;
165: case SYSPORT::IMAGEUNIT:
166: data = 0xff;
167: break;
168: case SYSPORT::KEY:
1.1.1.8 ! root 169: // XXX bit3 以外は要実機確認
! 170: data = 0xf7;
! 171: if (gKeyboard->IsConnected()) {
! 172: data |= 0x08;
! 173: }
1.1 root 174: break;
175: case SYSPORT::WAIT:
176: data = 0xff;
177: break;
178: case SYSPORT::MPU:
179: data = 0xdc;
180: break;
181: case SYSPORT::SRAMWP:
182: data = 0xff;
183: break;
1.1.1.3 root 184: case SYSPORT::POWEROFF:
1.1 root 185: data = 0xff;
186: break;
1.1.1.3 root 187: default:
188: __unreachable();
1.1 root 189: }
190: return data;
191: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.