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