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