Annotation of previous_trunk/src/dimension/nd_devs.cpp, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.