|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #include "vicon.h"
7:
1.1.1.2 ! root 8: std::unique_ptr<ViconDevice> gVicon;
1.1 root 9:
10: ViconDevice::ViconDevice()
11: {
12: logname = "vicon";
13: devname = "Vicon";
14: devaddr = baseaddr;
15: devlen = 0x2000;
16: }
17:
18: ViconDevice::~ViconDevice()
19: {
20: }
21:
1.1.1.2 ! root 22: // アドレスデコーダ
! 23: inline uint64
! 24: ViconDevice::Decoder(uint32 addr) const
! 25: {
! 26: // 折り返しは?
! 27: return addr - baseaddr;
! 28: }
! 29:
1.1 root 30: uint64
31: ViconDevice::Read8(uint32 addr)
32: {
1.1.1.2 ! root 33: uint32 offset = Decoder(addr);
1.1 root 34: uint32 data;
35:
36: if (offset < 0x400) {
37: // パレット
38: return palette.b[HB(offset)];
39: }
40:
41: // レジスタ
42: switch (offset) {
43: case 0x401:
44: data = read_r0();
45: break;
46:
47: case 0x500:
48: data = read_r1H();
49: break;
50: case 0x501:
51: data = read_r1L();
52: break;
53:
54: case 0x600:
55: data = read_r2H();
56: break;
57: case 0x601:
58: data = read_r2L();
59: break;
60:
61: default:
62: PANIC("Vicon $%06x.B 未実装読み込み", addr);
63: break;
64: }
65: return data;
66: }
67:
68: uint64
69: ViconDevice::Read16(uint32 addr)
70: {
1.1.1.2 ! root 71: uint32 offset = Decoder(addr);
1.1 root 72: uint32 data;
73:
74: if (offset < 0x400) {
75: return palette.w[offset / 2];
76: }
77:
78: // レジスタ
79: switch (offset) {
80: case 0x400:
81: data = read_r0();
82: break;
83:
84: case 0x500:
85: data = (read_r1H() << 8) | read_r1L();
86: break;
87:
88: case 0x600:
89: data = (read_r2H() << 8) | read_r2L();
90: break;
91:
92: default:
93: PANIC("Vicon $%06x.W 未実装読み込み", addr);
94: break;
95: }
96: return data;
97: }
98:
99: uint64
100: ViconDevice::Write8(uint32 addr, uint32 data)
101: {
1.1.1.2 ! root 102: uint32 offset = Decoder(addr);
1.1 root 103:
104: if (offset < 0x400) {
105: putlog(3, "パレット $%06x.B <- $%02x", addr, data);
106: palette.b[HB(offset)] = data;
107: return 0;
108: }
109:
110: // レジスタ
111: switch (offset) {
112: case 0x400:
113: break;
114: case 0x401:
115: write_r0(data);
116: break;
117:
118: case 0x500:
119: write_r1H(data);
120: break;
121: case 0x501:
122: write_r1L(data);
123: break;
124:
125: case 0x600:
126: write_r2H(data);
127: break;
128: case 0x601:
129: write_r2L(data);
130: break;
131:
132: default:
133: PANIC("Vicon $%06x.B <- $%02x 未実装書き込み", addr, data);
134: break;
135: }
136: return 0;
137: }
138:
139: uint64
140: ViconDevice::Write16(uint32 addr, uint32 data)
141: {
1.1.1.2 ! root 142: uint32 offset = Decoder(addr);
1.1 root 143:
144: if (offset < 0x400) {
145: if (offset < 0x200) {
146: putlog(3, "Gパレット $%06x [$%02x] <- $%04x",
147: addr, offset / 2, data);
148: } else {
149: putlog(3, "Tパレット $%06x [$%02x] <- $%04x",
150: addr, (offset - 0x200) / 2, data);
151: }
152: palette.w[offset / 2] = data;
153: return 0;
154: }
155:
156: // レジスタ
157: switch (offset) {
158: case 0x400:
159: write_r0(data);
160: break;
161:
162: case 0x500:
163: write_r1H(data >> 8);
164: write_r1L(data & 0xff);
165: break;
166:
167: case 0x600:
168: write_r2H(data >> 8);
169: write_r2L(data & 0xff);
170: break;
171:
172: default:
173: PANIC("Vicon $%06x.W <- $%04x 未実装書き込み", addr, data);
174: break;
175: }
176: return 0;
177: }
178:
179: uint64
180: ViconDevice::Peek8(uint32 addr)
181: {
1.1.1.2 ! root 182: uint32 offset = Decoder(addr);
1.1 root 183: uint32 data;
184:
185: if (offset < 0x400) {
186: return palette.b[HB(offset)];
187: }
188:
189: switch (offset) {
190: case 0x401:
191: data = read_r0();
192: break;
193:
194: case 0x500:
195: data = read_r1H();
196: break;
197: case 0x501:
198: data = read_r1L();
199: break;
200:
201: case 0x600:
202: data = read_r2H();
203: break;
204: case 0x601:
205: data = read_r2L();
206: break;
207:
208: default:
209: data = 0xff;
210: break;
211: }
212: return data;
213: }
214:
215: uint32
1.1.1.2 ! root 216: ViconDevice::read_r0() const
1.1 root 217: {
218: return vicon.r0;
219: }
220:
221: uint32
1.1.1.2 ! root 222: ViconDevice::read_r1H() const
1.1 root 223: {
224: return vicon.r1 >> 8;
225: }
226:
227: uint32
1.1.1.2 ! root 228: ViconDevice::read_r1L() const
1.1 root 229: {
230: return vicon.r1 & 0xff;
231: }
232:
233: uint32
1.1.1.2 ! root 234: ViconDevice::read_r2H() const
1.1 root 235: {
236: return vicon.r2 >> 8;
237: }
238:
239: uint32
1.1.1.2 ! root 240: ViconDevice::read_r2L() const
1.1 root 241: {
242: return vicon.r2 & 0xff;
243: }
244:
245: void
246: ViconDevice::write_r0(uint32 data)
247: {
248: putlog(0, "R0 <- $%02x 未実装書き込み", data);
249: vicon.r0 = data & 3;
250: }
251:
252: void
253: ViconDevice::write_r1H(uint32 data)
254: {
255: putlog(0, "R1(H) <- $%02x 未実装書き込み", data);
256: vicon.r1 &= 0x00ff;
257: vicon.r1 |= (data & 0x3f00);
258: }
259:
260: void
261: ViconDevice::write_r1L(uint32 data)
262: {
263: putlog(0, "R1(L) <- $%02x 未実装書き込み", data);
264: vicon.r1 &= 0xff00;
265: vicon.r1 |= (data & 0x00ff);
266: }
267:
268: void
269: ViconDevice::write_r2H(uint32 data)
270: {
271: putlog(0, "R2(H) <- $%02x 未実装書き込み", data);
272: vicon.r2 &= 0x00ff;
273: vicon.r2 |= (data & 0xff00);
274: }
275:
276: void
277: ViconDevice::write_r2L(uint32 data)
278: {
279: putlog(0, "R2(L) <- $%02x 未実装書き込み", data);
280: vicon.r2 &= 0xff00;
281: vicon.r2 |= (data & 0x007f);
282: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.