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