|
|
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.