|
|
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:
7: #include "sysport.h"
1.1.1.3 root 8: #include "mfp.h"
1.1.1.4 root 9: #include "ram.h"
10: #include "romimg_x68k.h"
1.1 root 11: #include "sram.h"
12:
1.1.1.5 root 13: std::unique_ptr<SysportDevice> gSysport;
14:
1.1 root 15: SysportDevice::SysportDevice()
16: {
17: logname = "sysport";
18: devname = "Sysport";
19: devaddr = baseaddr;
20: devlen = 0x2000;
21: }
22:
23: SysportDevice::~SysportDevice()
24: {
25: }
26:
1.1.1.4 root 27: void
28: SysportDevice::ResetHard()
29: {
1.1.1.6 ! root 30: sysport.contrast = 0; // XXX 未調査
1.1.1.4 root 31: sysport.ram_wait = 0;
32: sysport.rom_wait = 0;
1.1.1.6 ! root 33: sysport.key_ctrl = false;
1.1.1.4 root 34: }
35:
1.1 root 36: uint64
1.1.1.5 root 37: SysportDevice::Read(uint32 offset)
1.1 root 38: {
39: uint32 data;
40:
1.1.1.5 root 41: switch (offset) {
1.1 root 42: case SYSPORT::CONTRAST:
43: data = 0xf0 | sysport.contrast;
44: break;
45: case SYSPORT::SCOPE3D:
46: data = 0xff;
47: break;
48: case SYSPORT::IMAGEUNIT:
49: data = 0xff;
50: break;
51: case SYSPORT::KEY:
1.1.1.2 root 52: // キーボードは接続されてることにする
53: data = 0x08;
1.1 root 54: break;
55: case SYSPORT::WAIT:
56: data = 0xff;
57: break;
58: case SYSPORT::MPU:
59: data = 0xdc;
60: break;
61: case SYSPORT::SRAMWP:
62: data = 0xff;
63: break;
1.1.1.3 root 64: case SYSPORT::POWEROFF:
65: data = 0xff;
66: break;
67: default:
68: __unreachable();
1.1 root 69: }
1.1.1.5 root 70: putlog(1, "$%06X -> $%02x", gMPU->GetPaddr(), data);
1.1 root 71: return data;
72: }
73:
74: uint64
1.1.1.5 root 75: SysportDevice::Write(uint32 offset, uint32 data)
1.1 root 76: {
1.1.1.5 root 77: switch (offset) {
1.1 root 78: case SYSPORT::CONTRAST:
79: sysport.contrast = data & 15;
80: break;
81:
82: case SYSPORT::SCOPE3D:
83: case SYSPORT::IMAGEUNIT:
84: break;
85:
86: case SYSPORT::KEY:
1.1.1.3 root 87: data &= 0x0e;
88: // bit1,2
89: if ((data & 0x06)) {
90: putlog(0, "$E8E007 未サポート書き込み $%02x", data);
91: }
1.1.1.6 ! root 92: sysport.key_ctrl = (data & 0x08);
1.1 root 93: break;
94:
95: case SYSPORT::WAIT:
1.1.1.4 root 96: {
1.1 root 97: // 設定値で保持
98: sysport.rom_wait = data >> 4;
99: sysport.ram_wait = data;
1.1.1.4 root 100:
101: // ROM に指示。常に設定値 + 2 でよい
102: gIPLROM1->SetWait(sysport.rom_wait + 2);
103: gIPLROM2->SetWait(sysport.rom_wait + 2);
104: gCGROM->SetWait(sysport.rom_wait + 2);
105: // RAM に指示。InsideOut p.124
106: int wait = sysport.ram_wait;
107: if (wait > 0)
108: wait += 2;
109: gRAM->SetWait(wait);
1.1 root 110: break;
1.1.1.4 root 111: }
1.1 root 112:
113: case SYSPORT::MPU:
114: break;
115:
116: case SYSPORT::SRAMWP:
117: if (data == 0x31) {
118: gSRAM->write_enable(true);
119: } else {
120: gSRAM->write_enable(false);
121: }
122: break;
123:
124: case SYSPORT::POWEROFF:
1.1.1.5 root 125: putlog(0, "$e8e00f (POWEROFF) 未サポート書き込み %02x", data);
1.1 root 126: break;
1.1.1.3 root 127:
128: default:
129: __unreachable();
1.1 root 130: }
131: return 0;
132: }
133:
134: uint64
1.1.1.5 root 135: SysportDevice::Peek(uint32 offset)
1.1 root 136: {
137: uint32 data;
138:
1.1.1.5 root 139: switch (offset) {
1.1 root 140: case SYSPORT::CONTRAST:
141: data = 0xf0 | sysport.contrast;
142: break;
143: case SYSPORT::SCOPE3D:
144: data = 0xff;
145: break;
146: case SYSPORT::IMAGEUNIT:
147: data = 0xff;
148: break;
149: case SYSPORT::KEY:
150: data = 0xff;
151: break;
152: case SYSPORT::WAIT:
153: data = 0xff;
154: break;
155: case SYSPORT::MPU:
156: data = 0xdc;
157: break;
158: case SYSPORT::SRAMWP:
159: data = 0xff;
160: break;
1.1.1.3 root 161: case SYSPORT::POWEROFF:
1.1 root 162: data = 0xff;
163: break;
1.1.1.3 root 164: default:
165: __unreachable();
1.1 root 166: }
167: return data;
168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.