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