Annotation of previous/src/dimension/nd_devs.cpp, revision 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: #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: 

unix.superglobalmegacorp.com

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