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