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