|
|
1.1 root 1: #include <stdio.h>
2: #include <limits.h>
3: #include <stdlib.h>
4:
5: #include "main.h"
6: #include "configuration.h"
7: #include "m68000.h"
8: #include "sysdeps.h"
9: #include "dimension.hpp"
10: #include "nd_mem.hpp"
11: #include "nd_nbic.hpp"
12: #include "i860cfg.h"
13: #include "nd_sdl.hpp"
14: #include "ramdac.h"
15: #include "host.h"
16: #include "log.h"
17:
18: /* --------- NEXTDIMENSION DEVICES ---------- */
19:
20: /* Device registers */
21:
22: /* Memory controller */
23: #define ND_MC_CSR0 0xFF800000
24: #define ND_MC_CSR1 0xFF800010
25: #define ND_MC_CSR2 0xFF800020
26: #define ND_MC_SID 0xFF800030
27:
28: #define ND_MC_DMA_CSR 0xFF801000
29:
30: #define ND_MC_VRAM_TIMING 0xFF802000
31: #define ND_MC_DRAM_SIZE 0xFF803000
32:
33: /* CSR bits */
34: #define CSR0_i860PIN_RESET 0x00000001
35: #define CSR0_i860PIN_CS8 0x00000002
36: #define CSR0_i860_IMASK 0x00000004
37: #define CSR0_i860_INT 0x00000008
38: #define CSR0_BE_IMASK 0x00000010
39: #define CSR0_BE_INT 0x00000020
40: #define CSR0_VBL_IMASK 0x00000040
41: #define CSR0_VBL_INT 0x00000080
42: #define CSR0_VBLANK 0x00000100 /* ro */
43: #define CSR0_VIOVBL_IMASK 0x00000200
44: #define CSR0_VIOVBL_INT 0x00000400
45: #define CSR0_VIOBLANK 0x00000800 /* ro */
46: #define CSR0_i860_CACHE_EN 0x00001000
47:
48: #define CSR1_CPU_INT 0x00000001
49:
50: #define CSR2_GLOBAL_ACCESS 0x00000001
51:
52: #define SID_SID_MASK 0x0000000F
53: #define SID_STEP_MASK 0x000000F0
54:
55: #define CSRDMA_VISIBLE_EN 0x00000001
56: #define CSRDMA_BLANKED_EN 0x00000002
57: #define CSRDMA_READ_EN 0x00000004
58:
59: #define CSRVRAM_VBLANK 0x00000001
60: #define CSRVRAM_60HZ 0x00000002
61: #define CSRVRAM_EXT_SYNC 0x00000004
62:
63: #define CSRDRAM_4MBIT 0x00000001
64:
65: #define DP_IIC_MORE 0x20000000
66: #define DP_IIC_BUSY 0x80000000
67:
68: #define DP_CSR_MASK_DIS 0x01
69: #define DP_CSR_NTSC 0x02 /* 0 = NTSC, 1 = PAL */
70: #define DP_CSR_JPEG_MASK 0xFC
71:
72: MC::MC(NextDimension* nd) : nd(nd) {}
73:
74: void MC::init(void) {
75: csr0 = CSR0_i860PIN_CS8;
76: csr1 = 0;
77: csr2 = 0;
78: sid = nd->slot|(ND_STEP<<4);
79: dma_csr = 0;
80: dma_start = 0;
81: dma_width = 0;
82: dma_pstart = 0;
83: dma_pwidth = 0;
84: dma_sstart = 0;
85: dma_swidth = 0;
86: dma_bsstart = 0;
87: dma_bswidth = 0;
88: dma_top = 0;
89: dma_bottom = 0;
90: dma_line_a = 0;
91: dma_curr_a = 0;
92: dma_scurr_a = 0;
93: dma_out_a = 0;
94: vram = 0;
95: dram = 0;
96: }
97:
98: DP::DP(NextDimension* nd) : nd(nd) {}
99:
100: void DP::init(void) {
101: iic_msgsz = 0;
102: iic_addr = 0;
103: csr = 0;
104: alpha = 0;
105: dma = 0;
106: cpu_x = 0xc;
107: cpu_y = 0xc;
108: dma_x = 0xd;
109: dma_y = 0xd;
110: iic_stat_addr = 0;
111: iic_data = 0;
112: }
113:
114:
115: static const char* ND_CSR0_BITS[] = {
116: "i860PIN_RESET", "i860PIN_CS8", "i860_IMASK", "i860_INT",
117: "BE_IMASK", "BE_INT", "VBL_IMASK", "VBL_INT",
118: "VBLANK", "VIOVBL_IMASK", "VIOVBL_INT", "VIOBLANK",
119: "i860_CACHE_EN", "00002000", "00004000", "00008000",
120: "00010000", "00020000", "00040000", "00080000",
121: "00100000", "00200000", "00400000", "00800000",
122: "01000000", "02000000", "04000000", "08000000",
123: "10000000", "20000000", "40000000", "80000000",
124: };
125:
126: static const char* ND_CSR1_BITS[] = {
127: "CPU_INT", "00000002", "00000004", "00000008",
128: "00000010", "00000020", "00000040", "00000080",
129: "00000100", "00000200", "00000400", "00000800",
130: "00001000", "00002000", "00004000", "00008000",
131: "00010000", "00020000", "00040000", "00080000",
132: "00100000", "00200000", "00400000", "00800000",
133: "01000000", "02000000", "04000000", "08000000",
134: "10000000", "20000000", "40000000", "80000000",
135: };
136:
137: static const char* ND_CSR2_BITS[] = {
138: "GLOBAL_ACCESS", "00000002", "00000004", "00000008",
139: "00000010", "00000020", "00000040", "00000080",
140: "00000100", "00000200", "00000400", "00000800",
141: "00001000", "00002000", "00004000", "00008000",
142: "00010000", "00020000", "00040000", "00080000",
143: "00100000", "00200000", "00400000", "00800000",
144: "01000000", "02000000", "04000000", "08000000",
145: "10000000", "20000000", "40000000", "80000000",
146: };
147:
148: static const char* ND_DMA_CSR_BITS[] = {
149: "VISIBLE_EN", "BLANKED_EN", "READ_EN", "00000008",
150: "00000010", "00000020", "00000040", "00000080",
151: "00000100", "00000200", "00000400", "00000800",
152: "00001000", "00002000", "00004000", "00008000",
153: "00010000", "00020000", "00040000", "00080000",
154: "00100000", "00200000", "00400000", "00800000",
155: "01000000", "02000000", "04000000", "08000000",
156: "10000000", "20000000", "40000000", "80000000",
157: };
158:
159: static const char* ND_VRAM_BITS[] = {
160: "VBLANK", "60HZ", "EXT_SYNC", "00000008",
161: "00000010", "00000020", "00000040", "00000080",
162: "00000100", "00000200", "00000400", "00000800",
163: "00001000", "00002000", "00004000", "00008000",
164: "00010000", "00020000", "00040000", "00080000",
165: "00100000", "00200000", "00400000", "00800000",
166: "01000000", "02000000", "04000000", "08000000",
167: "10000000", "20000000", "40000000", "80000000",
168: };
169:
170: static const char* ND_DRAM_BITS[] = {
171: "4MBIT", "00000002", "00000004", "00000008",
172: "00000010", "00000020", "00000040", "00000080",
173: "00000100", "00000200", "00000400", "00000800",
174: "00001000", "00002000", "00004000", "00008000",
175: "00010000", "00020000", "00040000", "00080000",
176: "00100000", "00200000", "00400000", "00800000",
177: "01000000", "02000000", "04000000", "08000000",
178: "10000000", "20000000", "40000000", "80000000",
179: };
180:
181: static const char* decodeBits(const char** bits, uae_u32 val) {
182: static char buffer[512];
183: char* result = buffer;
184:
185: if(bits) {
186: *result = 0;
187: for(int i = 0; i < 32; i++) {
188: if(val & (1 << i)) {
189: const char* str = bits[i];
190: while(*str) *result++ = *str++;
191: *result++ = '|';
192: }
193: }
194: if(result != buffer)
195: *--result = 0;
196: }
197: else
198: sprintf(buffer, "%08X", val);
199: return buffer;
200: }
201:
202: static const char* MC_RD_FORMAT = "[ND] Memory controller %s read %08X at %08X";
203: static const char* MC_RD_FORMAT_S = "[ND] Memory controller %s read (%s) at %08X";
204:
205: Uint32 MC::read(Uint32 addr) {
206: switch (addr&0x3FFF) {
207: case 0x0000:
208: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"csr0", decodeBits(ND_CSR0_BITS, csr0),addr);
209: return csr0;
210: case 0x0010:
211: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"csr1", decodeBits(ND_CSR1_BITS, csr1),addr);
212: return csr1;
213: case 0x0020:
214: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"csr2", decodeBits(ND_CSR2_BITS, csr2),addr);
215: return csr2;
216: case 0x0030:
217: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"sid", sid,addr);
218: return sid;
219: case 0x1000:
220: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"dma_csr", decodeBits(ND_DMA_CSR_BITS, dma_csr),addr);
221: return dma_csr;
222: case 0x1010:
223: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_start", dma_start,addr);
224: return dma_start;
225: case 0x1020:
226: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_width", dma_width,addr);
227: return dma_width;
228: case 0x1030:
229: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_pstart", dma_pstart,addr);
230: return dma_pstart;
231: case 0x1040:
232: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_pwidth", dma_pwidth,addr);
233: return dma_pwidth;
234: case 0x1050:
235: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_sstart", dma_sstart,addr);
236: return dma_sstart;
237: case 0x1060:
238: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_swidth", dma_swidth,addr);
239: return dma_swidth;
240: case 0x1070:
241: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_bsstart", dma_bsstart,addr);
242: return dma_bsstart;
243: case 0x1080:
244: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_bswidth", dma_bswidth,addr);
245: return dma_bswidth;
246: case 0x1090:
247: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_top", dma_top,addr);
248: return dma_top;
249: case 0x10A0:
250: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_bottom", dma_bottom,addr);
251: return dma_bottom;
252: case 0x10B0:
253: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_line_a", dma_line_a,addr);
254: return dma_line_a;
255: case 0x10C0:
256: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_curr_a", dma_curr_a,addr);
257: return dma_curr_a;
258: case 0x10D0:
259: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_line_a", dma_line_a,addr);
260: return dma_line_a;
261: case 0x10E0:
262: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_scurr_a", dma_scurr_a,addr);
263: return dma_scurr_a;
264: case 0x10F0:
265: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT,"dma_out_a", dma_out_a,addr);
266: return dma_out_a;
267: case 0x2000:
268: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"vram", decodeBits(ND_VRAM_BITS, vram),addr);
269: return vram;
270: case 0x3000:
271: Log_Printf(ND_LOG_IO_RD, MC_RD_FORMAT_S,"dram", decodeBits(ND_DRAM_BITS, dram),addr);
272: return dram;
273: default:
274: Log_Printf(LOG_WARN, "[ND] Memory controller UNKNOWN read at %08X",addr);
275: break;
276: }
277: return 0;
278: }
279:
280: static const char* MC_WR_FORMAT = "[ND] Memory controller %s write %08X at %08X";
281: static const char* MC_WR_FORMAT_S = "[ND] Memory controller %s write (%s) at %08X";
282:
283: void MC::write(Uint32 addr, Uint32 val) {
284: switch (addr&0x3FFF) {
285: case 0x0000:
286: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"csr0", decodeBits(ND_CSR0_BITS, val), addr);
287: if(val & CSR0_i860PIN_RESET) {
288: nd->send_msg(MSG_I860_RESET);
289: val &= ~CSR0_i860PIN_RESET;
290: }
291: if ((val & CSR0_i860_INT) && (val & CSR0_i860_IMASK))
292: nd->send_msg(MSG_INTR);
293:
294: if((val & CSR0_BE_INT) && (val & CSR0_BE_IMASK))
295: nd->send_msg(MSG_INTR);
296:
297: csr0 = val;
298: break;
299: case 0x0010:
300: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"csr1", decodeBits(ND_CSR1_BITS, val),addr);
301: csr1 = val;
302: if (csr1&CSR1_CPU_INT) {
303: nd->nbic.set_intstatus(true);
304: } else {
305: nd->nbic.set_intstatus(false);
306: }
307: break;
308: case 0x0020:
309: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"csr2", decodeBits(ND_CSR2_BITS, val),addr);
310: csr2 = val;
311: break;
312: case 0x0030:
313: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"sid", val,addr);
314: sid = val;
315: break;
316: case 0x1000:
317: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"dma_csr", decodeBits(ND_DMA_CSR_BITS, val),addr);
318: dma_csr = val;
319: break;
320: case 0x1010:
321: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_start", val,addr);
322: dma_start = val;
323: break;
324: case 0x1020:
325: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_width", val,addr);
326: dma_width = val;
327: break;
328: case 0x1030:
329: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_pstart", val,addr);
330: dma_pstart = val;
331: break;
332: case 0x1040:
333: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_pwidth", val,addr);
334: dma_pwidth = val;
335: break;
336: case 0x1050:
337: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_sstart", val,addr);
338: dma_sstart = val;
339: break;
340: case 0x1060:
341: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_swidth", val,addr);
342: dma_swidth = val;
343: break;
344: case 0x1070:
345: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_bsstart", val,addr);
346: dma_bsstart = val;
347: break;
348: case 0x1080:
349: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_bswidth", val,addr);
350: dma_bswidth = val;
351: break;
352: case 0x1090:
353: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_top", val,addr);
354: dma_top = val;
355: break;
356: case 0x10A0:
357: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_bottom", val,addr);
358: dma_bottom = val;
359: break;
360: case 0x10B0:
361: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_line_a", val,addr);
362: dma_line_a = val;
363: break;
364: case 0x10C0:
365: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_curr_a", val,addr);
366: dma_curr_a = val;
367: break;
368: case 0x10D0:
369: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_line_a", val,addr);
370: dma_line_a = val;
371: break;
372: case 0x10E0:
373: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_scurr_a", val,addr);
374: dma_scurr_a = val;
375: break;
376: case 0x10F0:
377: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT,"dma_out_a", val,addr);
378: dma_out_a = val;
379: break;
380: case 0x2000:
381: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"vram", decodeBits(ND_VRAM_BITS, val),addr);
382: vram = val;
383: break;
384: case 0x3000:
385: Log_Printf(ND_LOG_IO_WR, MC_WR_FORMAT_S,"dram", decodeBits(ND_DRAM_BITS, val),addr);
386: dram = val;
387: break;
388: default:
389: Log_Printf(LOG_WARN, "[ND] Memory controller UNKNOWN write at %08X",addr);
390: break;
391: }
392: }
393:
394: /* NeXTdimension data path */
395:
396: void DP::iicmsg(void) {
397: Log_Printf(LOG_NONE, "[ND] data path IIC msg addr:%02X msg[%d]=%02X",
398: iic_addr, iic_msgsz-1, iic_msg);
399:
400: nd->video_dev_write(iic_addr, iic_msgsz-1, iic_msg);
401: }
402:
403: Uint32 DP::lget(Uint32 addr) {
404: switch(addr) {
405: case 0x300: case 0x304: case 0x308: case 0x30C:
406: case 0x310: case 0x314: case 0x318: case 0x31C:
407: case 0x320: case 0x324: case 0x328: case 0x32C:
408: case 0x330: case 0x334: case 0x338: case 0x33C:
409: return doff;
410: case 0x340:
411: return csr;
412: case 0x344:
413: return alpha;
414: case 0x348:
415: return dma;
416: case 0x350:
417: return cpu_x;
418: case 0x354:
419: return cpu_y;
420: case 0x358:
421: return dma_x;
422: case 0x35C:
423: return dma_y;
424: case 0x360:
425: if(iic_busy <= 0)
426: iic_stat_addr &= ~DP_IIC_BUSY;
427: else
428: iic_busy--;
429: return iic_stat_addr;
430: case 0x364:
431: return 0;
432: default:
433: Log_Printf(LOG_WARN, "[ND] data path UNKNOWN read at %08X",addr);
434: }
435: return 0;
436: }
437:
438: void DP::lput(Uint32 addr, Uint32 v) {
439: switch(addr) {
440: case 0x300: case 0x304: case 0x308: case 0x30C:
441: case 0x310: case 0x314: case 0x318: case 0x31C:
442: case 0x320: case 0x324: case 0x328: case 0x32C:
443: case 0x330: case 0x334: case 0x338: case 0x33C:
444: doff = v;
445: break;
446: case 0x340:
447: csr = v;
448: break;
449: case 0x344:
450: alpha = v;
451: break;
452: case 0x348:
453: dma = v;
454: break;
455: case 0x350:
456: cpu_x = v;
457: break;
458: case 0x354:
459: cpu_y = v;
460: break;
461: case 0x358:
462: dma_x = v;
463: break;
464: case 0x35C:
465: dma_y = v;
466: break;
467: case 0x360:
468: iic_msgsz = 0;
469: iic_addr = (v >> 8) & 0xFF;
470: iic_msg = v;
471: iic_msgsz++;
472: iic_stat_addr |= DP_IIC_BUSY;
473: iic_busy = 10;
474: iicmsg();
475: break;
476: case 0x364:
477: iic_msg = v;
478: iic_msgsz++;
479: iic_stat_addr |= DP_IIC_BUSY;
480: iic_busy = 10;
481: iicmsg();
482: break;
483: default:
484: Log_Printf(LOG_WARN, "[ND] data path UNKNOWN write at %08X %08X",addr,v);
485: }
486: }
487:
488: void NextDimension::set_blank_state(int src, bool state) {
489: switch (src) {
490: case ND_DISPLAY:
491: if(state) {
492: mc.csr0 |= CSR0_VBL_INT | CSR0_VBLANK;
493: if (mc.csr0 & CSR0_VBL_IMASK) {
494: send_msg(MSG_INTR);
495: }
496: } else {
497: mc.csr0 &= ~CSR0_VBLANK;
498: }
499: break;
500: case ND_VIDEO:
501: if(state) {
502: mc.csr0 |= CSR0_VIOVBL_INT | CSR0_VIOBLANK;
503: if (mc.csr0 & CSR0_VIOVBL_IMASK) {
504: send_msg(MSG_INTR);
505: }
506: } else {
507: mc.csr0 &= ~CSR0_VIOBLANK;
508: }
509: break;
510: }
511: }
512:
513: static const char* nd_dump_path = "nd_memory.bin";
514:
515: /* debugger stuff */
516: bool NextDimension::dbg_cmd(const char* buf) {
517: if(!(buf)) {
518: fprintf(stderr,
519: " w: write NeXTdimension DRAM to file '%s'\n"
520: " n: dump NeXTdimension registers\n"
521: , nd_dump_path);
522: return false;
523: }
524:
525: switch(buf[0]) {
526: case 'w': {
527: FILE* fp = fopen(nd_dump_path, "wb");
528: size_t size = ConfigureParams.Dimension.board[ND_NUM(slot)].nMemoryBankSize[0];
529: size += ConfigureParams.Dimension.board[ND_NUM(slot)].nMemoryBankSize[1];
530: size += ConfigureParams.Dimension.board[ND_NUM(slot)].nMemoryBankSize[2];
531: size += ConfigureParams.Dimension.board[ND_NUM(slot)].nMemoryBankSize[3];
532: fprintf(stderr, "Writing %"FMT_zu"MB to '%s'...", size, nd_dump_path);
533: size <<= 20;
534: fwrite(ram, sizeof(Uint8), size, fp);
535: fclose(fp);
536: fprintf(stderr, "done.");
537: return true;
538: }
539: case 'n': {
540: fprintf(stderr, "csr0 (%s)\n", decodeBits(ND_CSR0_BITS, mc.csr0));
541: fprintf(stderr, "csr1 (%s)\n", decodeBits(ND_CSR1_BITS, mc.csr1));
542: fprintf(stderr, "csr2 (%s)\n", decodeBits(ND_CSR2_BITS, mc.csr2));
543: fprintf(stderr, "sid (%s)\n", decodeBits(0, mc.sid));
544: fprintf(stderr, "dma_csr (%s)\n", decodeBits(ND_DMA_CSR_BITS, mc.dma_csr));
545: fprintf(stderr, "dma_start (%s)\n", decodeBits(0, mc.dma_start));
546: fprintf(stderr, "dma_width (%s)\n", decodeBits(0, mc.dma_width));
547: fprintf(stderr, "dma_pstart (%s)\n", decodeBits(0, mc.dma_pstart));
548: fprintf(stderr, "dma_pwidth (%s)\n", decodeBits(0, mc.dma_pwidth));
549: fprintf(stderr, "dma_sstart (%s)\n", decodeBits(0, mc.dma_sstart));
550: fprintf(stderr, "dma_swidth (%s)\n", decodeBits(0, mc.dma_swidth));
551: fprintf(stderr, "dma_bsstart (%s)\n", decodeBits(0, mc.dma_bsstart));
552: fprintf(stderr, "dma_bswidth (%s)\n", decodeBits(0, mc.dma_bswidth));
553: fprintf(stderr, "dma_top (%s)\n", decodeBits(0, mc.dma_top));
554: fprintf(stderr, "dma_bottom (%s)\n", decodeBits(0, mc.dma_bottom));
555: fprintf(stderr, "dma_line_a (%s)\n", decodeBits(0, mc.dma_line_a));
556: fprintf(stderr, "dma_curr_a (%s)\n", decodeBits(0, mc.dma_curr_a));
557: fprintf(stderr, "dma_scurr_a (%s)\n", decodeBits(0, mc.dma_scurr_a));
558: fprintf(stderr, "dma_out_a (%s)\n", decodeBits(0, mc.dma_out_a));
559: fprintf(stderr, "vram (%s)\n", decodeBits(ND_VRAM_BITS, mc.vram));
560: fprintf(stderr, "dram (%s)\n", decodeBits(ND_DRAM_BITS, mc.dram));
561: return true;
562: }
563: default:
564: return false;
565: }
566: }
567:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.