|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #include "sysport.h"
7: #include "sram.h"
8:
9: SysportDevice::SysportDevice()
10: {
11: logname = "sysport";
12: devname = "Sysport";
13: devaddr = baseaddr;
14: devlen = 0x2000;
15: }
16:
17: SysportDevice::~SysportDevice()
18: {
19: }
20:
21: uint64
22: SysportDevice::Read8(uint32 addr)
23: {
24: uint32 data;
25:
26: if ((addr % 2) == 0) {
27: return 0xff;
28: }
29:
30: int n = (addr - baseaddr) / 2;
31: switch (n) {
32: case SYSPORT::CONTRAST:
33: data = 0xf0 | sysport.contrast;
34: break;
35: case SYSPORT::SCOPE3D:
36: data = 0xff;
37: break;
38: case SYSPORT::IMAGEUNIT:
39: data = 0xff;
40: break;
41: case SYSPORT::KEY:
42: // キーボードは接続されていない
43: data = 0x00;
44: break;
45: case SYSPORT::WAIT:
46: data = 0xff;
47: break;
48: case SYSPORT::MPU:
49: data = 0xdc;
50: break;
51: case SYSPORT::SRAMWP:
52: data = 0xff;
53: break;
54: default:
55: return (uint64)-1;
56: }
57: putlog(1, "$%06X -> $%02x", addr, data);
58: return data;
59: }
60:
61: uint64
62: SysportDevice::Read16(uint32 addr)
63: {
64: return (0xff00 | Read8(addr + 1));
65: }
66:
67: uint64
68: SysportDevice::Write8(uint32 addr, uint32 data)
69: {
70: if ((addr % 2) == 0) {
71: return (uint64)-1;
72: }
73:
74: int n = (addr - baseaddr) / 2;
75: switch (n) {
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:
85: putlog(0, "$E8E007 未サポート書き込み %02x", data);
86: break;
87:
88: case SYSPORT::WAIT:
89: // 設定値で保持
90: sysport.rom_wait = data >> 4;
91: sysport.ram_wait = data;
92: break;
93:
94: case SYSPORT::MPU:
95: break;
96:
97: case SYSPORT::SRAMWP:
98: if (data == 0x31) {
99: gSRAM->write_enable(true);
100: } else {
101: gSRAM->write_enable(false);
102: }
103: break;
104:
105: case SYSPORT::POWEROFF:
106: putlog(0, "$E8E00F (POWEROFF) 未サポート書き込み %02x", data);
107: break;
108:
109: default:
110: return (uint64)-1;
111: }
112: return 0;
113: }
114:
115: uint64
116: SysportDevice::Write16(uint32 addr, uint32 data)
117: {
118: return Write8(addr + 1, data & 0xff);
119: }
120:
121: uint64
122: SysportDevice::Peek8(uint32 addr)
123: {
124: uint32 data;
125:
126: if ((addr % 2) == 0) {
127: return 0xff;
128: }
129:
130: int n = (addr - baseaddr) / 2;
131: switch (n) {
132: case SYSPORT::CONTRAST:
133: data = 0xf0 | sysport.contrast;
134: break;
135: case SYSPORT::SCOPE3D:
136: data = 0xff;
137: break;
138: case SYSPORT::IMAGEUNIT:
139: data = 0xff;
140: break;
141: case SYSPORT::KEY:
142: data = 0xff;
143: break;
144: case SYSPORT::WAIT:
145: data = 0xff;
146: break;
147: case SYSPORT::MPU:
148: data = 0xdc;
149: break;
150: case SYSPORT::SRAMWP:
151: data = 0xff;
152: break;
153: default:
154: data = 0xff;
155: break;
156: }
157: return data;
158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.