|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #include "dmac.h"
7:
8: DMACDevice::DMACDevice()
9: {
10: logname = "dmac";
11: devname = "DMAC";
12: devaddr = baseaddr;
13: devlen = 0x2000;
14: }
15:
16: DMACDevice::~DMACDevice()
17: {
18: }
19:
20: uint64
21: DMACDevice::Read8(uint32 addr)
22: {
23: uint8 data;
24: int ch;
25:
26: ch = (addr - baseaddr) / 0x40;
27: struct DMAC::channel *chan = &dmac.chan[ch];
28: int n = (addr - baseaddr) % 0x40;
29: switch (n) {
30: case DMAC::CSR:
31: data = chan->csr;
32: break;
33:
34: case DMAC::CER:
35: data = chan->cer;
36: break;
37:
38: case DMAC::DCR:
39: data = chan->dcr;
40: break;
41:
42: case DMAC::OCR:
43: data = chan->ocr;
44: break;
45:
46: case DMAC::SCR:
47: data = chan->scr;
48: break;
49:
50: case DMAC::CCR:
51: data = chan->ccr;
52: break;
53:
54: case DMAC::MTC:
55: data = chan->mtc >> 8;
56: break;
57: case DMAC::MTC + 1:
58: data = chan->mtc & 0xff;
59: break;
60:
61: case DMAC::MAR:
62: data = chan->mar >> 24;
63: break;
64: case DMAC::MAR + 1:
65: data = (chan->mar >> 16) & 0xff;
66: break;
67: case DMAC::MAR + 2:
68: data = (chan->mar >> 8) & 0xff;
69: break;
70: case DMAC::MAR + 3:
71: data = chan->mar & 0xff;
72: break;
73:
74: case DMAC::DAR:
75: data = chan->dar >> 24;
76: break;
77: case DMAC::DAR + 1:
78: data = (chan->dar >> 16) & 0xff;
79: break;
80: case DMAC::DAR + 2:
81: data = (chan->dar >> 8) & 0xff;
82: break;
83: case DMAC::DAR + 3:
84: data = chan->dar & 0xff;
85: break;
86:
87: case DMAC::BTC:
88: data = chan->btc >> 8;
89: break;
90: case DMAC::BTC + 1:
91: data = chan->btc & 0xff;
92: break;
93:
94: case DMAC::BAR:
95: data = chan->bar >> 24;
96: break;
97: case DMAC::BAR + 1:
98: data = (chan->bar >> 16) & 0xff;
99: break;
100: case DMAC::BAR + 2:
101: data = (chan->bar >> 8) & 0xff;
102: break;
103: case DMAC::BAR + 3:
104: data = chan->bar & 0xff;
105: break;
106:
107: case DMAC::NIV:
108: data = chan->niv;
109: break;
110:
111: case DMAC::EIV:
112: data = chan->eiv;
113: break;
114:
115: case DMAC::MFC:
116: data = chan->mfc;
117: break;
118:
119: case DMAC::CPR:
120: data = chan->cpr;
121: break;
122:
123: case DMAC::DFC:
124: data = chan->dfc;
125: break;
126:
127: case DMAC::BFC:
128: data = chan->bfc;
129: break;
130:
131: case DMAC::GCR:
132: if (ch == 3) {
133: data = dmac.gcr;
134: break;
135: } else {
136: data = 0xff;
137: }
138: break;
139:
140: default:
141: data = 0xff;
142: break;
143: }
144:
145: return data;
146: }
147:
148: uint64
149: DMACDevice::Write8(uint32 addr, uint32 data)
150: {
151: int ch;
152:
153: ch = (addr - baseaddr) / 0x40;
154: struct DMAC::channel *chan = &dmac.chan[ch];
155: int n = (addr - baseaddr) % 0x40;
156: switch (n) {
157: case DMAC::CSR:
158: write_csr(ch, data);
159: break;
160:
161: case DMAC::CER:
162: // Read only
163: break;
164:
165: case DMAC::DCR:
166: chan->dcr = data & 0xfb;
167: break;
168:
169: case DMAC::OCR:
170: chan->ocr = data;
171: break;
172:
173: case DMAC::SCR:
174: chan->scr = data & 0x0f;
175: break;
176:
177: case DMAC::CCR:
178: write_ccr(ch, data);
179: break;
180:
181: case DMAC::MTC:
182: chan->mtc = (chan->mtc & 0x00ff) | (data << 8);
183: break;
184: case DMAC::MTC + 1:
185: chan->mtc = (chan->mtc & 0xff00) | data;
186: break;
187:
188: case DMAC::MAR:
189: chan->mar = (chan->mar & 0x00ffffff) | (data << 24);
190: break;
191: case DMAC::MAR + 1:
192: chan->mar = (chan->mar & 0xff00ffff) | (data << 16);
193: break;
194: case DMAC::MAR + 2:
195: chan->mar = (chan->mar & 0xffff00ff) | (data << 8);
196: break;
197: case DMAC::MAR + 3:
198: chan->mar = (chan->mar & 0xffffff00) | data;
199: break;
200:
201: case DMAC::DAR:
202: chan->dar = (chan->dar & 0x00ffffff) | (data << 24);
203: break;
204: case DMAC::DAR + 1:
205: chan->dar = (chan->dar & 0xff00ffff) | (data << 16);
206: break;
207: case DMAC::DAR + 2:
208: chan->dar = (chan->dar & 0xffff00ff) | (data << 8);
209: break;
210: case DMAC::DAR + 3:
211: chan->dar = (chan->dar & 0xffffff00) | data;
212: break;
213:
214: case DMAC::BTC:
215: chan->btc = (chan->btc & 0x00ff) | (data << 8);
216: break;
217: case DMAC::BTC + 1:
218: chan->btc = (chan->btc & 0xff00) | data;
219: break;
220:
221: case DMAC::BAR:
222: chan->bar = (chan->bar & 0x00ffffff) | (data << 24);
223: break;
224: case DMAC::BAR + 1:
225: chan->bar = (chan->bar & 0xff00ffff) | (data << 16);
226: break;
227: case DMAC::BAR + 2:
228: chan->bar = (chan->bar & 0xffff00ff) | (data << 8);
229: break;
230: case DMAC::BAR + 3:
231: chan->bar = (chan->bar & 0xffffff00) | data;
232: break;
233:
234: case DMAC::NIV:
235: chan->niv = data;
236: break;
237:
238: case DMAC::EIV:
239: chan->eiv = data;
240: break;
241:
242: case DMAC::MFC:
243: chan->mfc = data & 7;
244: break;
245:
246: case DMAC::CPR:
247: chan->cpr = data & 3;
248: break;
249:
250: case DMAC::DFC:
251: chan->dfc = data & 7;
252: break;
253:
254: case DMAC::BFC:
255: chan->bfc = data & 7;
256: break;
257:
258: case DMAC::GCR:
259: if (ch == 3) {
260: dmac.gcr = data;
261: }
262: break;
263:
264: default:
265: break;
266: }
267: return 0;
268: }
269:
270: uint64
271: DMACDevice::Peek8(uint32 addr)
272: {
273: uint8 data;
274: int ch;
275:
276: ch = (addr - baseaddr) / 0x40;
277: struct DMAC::channel *chan = &dmac.chan[ch];
278: int n = (addr - baseaddr) % 0x40;
279: switch (n) {
280: case DMAC::CSR:
281: data = chan->csr;
282: break;
283:
284: case DMAC::CER:
285: data = chan->cer;
286: break;
287:
288: case DMAC::DCR:
289: data = chan->dcr;
290: break;
291:
292: case DMAC::OCR:
293: data = chan->ocr;
294: break;
295:
296: case DMAC::SCR:
297: data = chan->scr;
298: break;
299:
300: case DMAC::CCR:
301: data = chan->ccr;
302: break;
303:
304: case DMAC::MTC:
305: data = chan->mtc >> 8;
306: break;
307: case DMAC::MTC + 1:
308: data = chan->mtc & 0xff;
309: break;
310:
311: case DMAC::MAR:
312: data = chan->mar >> 24;
313: break;
314: case DMAC::MAR + 1:
315: data = (chan->mar >> 16) & 0xff;
316: break;
317: case DMAC::MAR + 2:
318: data = (chan->mar >> 8) & 0xff;
319: break;
320: case DMAC::MAR + 3:
321: data = chan->mar & 0xff;
322: break;
323:
324: case DMAC::DAR:
325: data = chan->dar >> 24;
326: break;
327: case DMAC::DAR + 1:
328: data = (chan->dar >> 16) & 0xff;
329: break;
330: case DMAC::DAR + 2:
331: data = (chan->dar >> 8) & 0xff;
332: break;
333: case DMAC::DAR + 3:
334: data = chan->dar & 0xff;
335: break;
336:
337: case DMAC::BTC:
338: data = chan->btc >> 8;
339: break;
340: case DMAC::BTC + 1:
341: data = chan->btc & 0xff;
342: break;
343:
344: case DMAC::BAR:
345: data = chan->bar >> 24;
346: break;
347: case DMAC::BAR + 1:
348: data = (chan->bar >> 16) & 0xff;
349: break;
350: case DMAC::BAR + 2:
351: data = (chan->bar >> 8) & 0xff;
352: break;
353: case DMAC::BAR + 3:
354: data = chan->bar & 0xff;
355: break;
356:
357: case DMAC::NIV:
358: data = chan->niv;
359: break;
360:
361: case DMAC::EIV:
362: data = chan->eiv;
363: break;
364:
365: case DMAC::MFC:
366: data = chan->mfc;
367: break;
368:
369: case DMAC::CPR:
370: data = chan->cpr;
371: break;
372:
373: case DMAC::DFC:
374: data = chan->dfc;
375: break;
376:
377: case DMAC::BFC:
378: data = chan->bfc;
379: break;
380:
381: case DMAC::GCR:
382: if (ch == 3) {
383: data = dmac.gcr;
384: break;
385: } else {
386: data = 0xff;
387: }
388: break;
389:
390: default:
391: data = 0xff;
392: break;
393: }
394:
395: return data;
396: }
397:
398: void
399: DMACDevice::write_csr(int ch, uint32 data)
400: {
401: putlog(1, "write_csr[%d] <- $%02x 未実装書き込み", ch, data);
402: }
403:
404: void
405: DMACDevice::write_ccr(int ch, uint32 data)
406: {
407: putlog(1, "write_ccr[%d] <- $%02x 未実装書き込み", ch, data);
408: }
409:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.