|
|
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:
1.1.1.2 ! root 21: // アドレスデコーダ
! 22: inline uint64
! 23: SysportDevice::Decoder(uint32 addr) const
! 24: {
! 25: // 折り返しは?
! 26: addr -= baseaddr;
! 27:
! 28: // 偶数アドレスはバスエラー?
! 29: if ((addr & 1) == 0)
! 30: return (uint64)-1;
! 31:
! 32: return addr >> 1;
! 33: }
! 34:
1.1 root 35: uint64
36: SysportDevice::Read8(uint32 addr)
37: {
38: uint32 data;
39:
1.1.1.2 ! root 40: switch (Decoder(addr)) {
! 41: default:
! 42: return (uint64)-1;
1.1 root 43:
44: case SYSPORT::CONTRAST:
45: data = 0xf0 | sysport.contrast;
46: break;
47: case SYSPORT::SCOPE3D:
48: data = 0xff;
49: break;
50: case SYSPORT::IMAGEUNIT:
51: data = 0xff;
52: break;
53: case SYSPORT::KEY:
1.1.1.2 ! root 54: // キーボードは接続されてることにする
! 55: data = 0x08;
1.1 root 56: break;
57: case SYSPORT::WAIT:
58: data = 0xff;
59: break;
60: case SYSPORT::MPU:
61: data = 0xdc;
62: break;
63: case SYSPORT::SRAMWP:
64: data = 0xff;
65: break;
66: }
67: putlog(1, "$%06X -> $%02x", addr, data);
68: return data;
69: }
70:
71: uint64
72: SysportDevice::Read16(uint32 addr)
73: {
74: return (0xff00 | Read8(addr + 1));
75: }
76:
77: uint64
78: SysportDevice::Write8(uint32 addr, uint32 data)
79: {
1.1.1.2 ! root 80: switch (Decoder(addr)) {
! 81: default:
1.1 root 82: return (uint64)-1;
83:
84: case SYSPORT::CONTRAST:
85: sysport.contrast = data & 15;
86: break;
87:
88: case SYSPORT::SCOPE3D:
89: case SYSPORT::IMAGEUNIT:
90: break;
91:
92: case SYSPORT::KEY:
93: putlog(0, "$E8E007 未サポート書き込み %02x", data);
94: break;
95:
96: case SYSPORT::WAIT:
97: // 設定値で保持
98: sysport.rom_wait = data >> 4;
99: sysport.ram_wait = data;
100: break;
101:
102: case SYSPORT::MPU:
103: break;
104:
105: case SYSPORT::SRAMWP:
106: if (data == 0x31) {
107: gSRAM->write_enable(true);
108: } else {
109: gSRAM->write_enable(false);
110: }
111: break;
112:
113: case SYSPORT::POWEROFF:
114: putlog(0, "$E8E00F (POWEROFF) 未サポート書き込み %02x", data);
115: break;
116: }
117: return 0;
118: }
119:
120: uint64
121: SysportDevice::Write16(uint32 addr, uint32 data)
122: {
123: return Write8(addr + 1, data & 0xff);
124: }
125:
126: uint64
127: SysportDevice::Peek8(uint32 addr)
128: {
129: uint32 data;
130:
1.1.1.2 ! root 131: switch (Decoder(addr)) {
1.1 root 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.