|
|
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 "i860cfg.h" ! 11: #include "nd_sdl.hpp" ! 12: #include "host.h" ! 13: ! 14: ! 15: #define LOG_VID_LEVEL LOG_WARN ! 16: ! 17: /* --------- NEXTDIMENSION VIDEO I/O ---------- * ! 18: * * ! 19: * Code for NeXTdimension video I/O. For now * ! 20: * only some dummy devices. */ ! 21: ! 22: ! 23: #define ND_VID_DMCD 0x8A ! 24: #define ND_VID_DCSC0 0xE0 ! 25: #define ND_VID_DCSC1 0xE2 ! 26: ! 27: ! 28: /* SAA7191 (Digital Multistandard Colour Decoder - Square Pixel) */ ! 29: ! 30: DMCD::DMCD(NextDimension* nd) : nd(nd) {} ! 31: ! 32: void DMCD::write(Uint32 step, Uint8 data) { ! 33: if (step == 0) { ! 34: addr = data; ! 35: } else { ! 36: Log_Printf(LOG_VID_LEVEL, "[ND] Slot %i: DMCD: Writing register %i (%02X)", nd->slot, addr, data); ! 37: ! 38: if (addr < ND_DMCD_NUM_REG) { ! 39: reg[addr] = data; ! 40: addr++; ! 41: } else { ! 42: Log_Printf(LOG_WARN, "[ND] Slot %i: DMCD: Illegal register (%i)", nd->slot, addr); ! 43: } ! 44: } ! 45: } ! 46: ! 47: ! 48: /* SAA7192 (Digital Colour Space Converter) */ ! 49: ! 50: #define ND_DCSC_CTRL 0x00 ! 51: #define ND_DCSC_CLUT 0x01 ! 52: ! 53: DCSC::DCSC(NextDimension* nd, int dev) : nd(nd), dev(dev) {} ! 54: ! 55: void DCSC::write(Uint32 step, Uint8 data) { ! 56: switch (step) { ! 57: case 0: ! 58: addr = data; ! 59: break; ! 60: case 1: ! 61: if (addr == ND_DCSC_CTRL) { ! 62: Log_Printf(LOG_VID_LEVEL, "[ND] Slot %i: DCSC%i: Writing control (%02X)", nd->slot, dev, data); ! 63: ! 64: ctrl = data; ! 65: break; ! 66: } ! 67: /* else fall through */ ! 68: ! 69: default: ! 70: if (addr == ND_DCSC_CLUT) { ! 71: Log_Printf(LOG_VID_LEVEL, "[ND] Slot %i: DCSC%i: Writing LUT at %i (%02X)", nd->slot, dev, step-1, data); ! 72: ! 73: lut[(step-1)&0xFF] = data; ! 74: } else { ! 75: Log_Printf(LOG_WARN, "[ND] Slot %i: DCSC%i: Unknown address (%02X)", nd->slot, dev, addr); ! 76: } ! 77: break; ! 78: } ! 79: } ! 80: ! 81: ! 82: /* Receiver function (from IIC bus) */ ! 83: ! 84: void NextDimension::video_dev_write(Uint8 addr, Uint32 step, Uint8 data) { ! 85: if (addr&0x01) { ! 86: Log_Printf(LOG_WARN, "[ND] Slot %i: IIC bus: Unimplemented read from video device at %02X", slot, addr); ! 87: } ! 88: ! 89: if (step == 0) { ! 90: Log_Printf(LOG_VID_LEVEL, "[ND] Slot %i: IIC bus: selecting device at %02X (subaddress: %02X)", slot, addr, data); ! 91: } ! 92: ! 93: switch (addr&0xFE) { ! 94: case ND_VID_DMCD: ! 95: dmcd.write(step, data); ! 96: break; ! 97: case ND_VID_DCSC0: ! 98: dcsc0.write(step, data); ! 99: break; ! 100: case ND_VID_DCSC1: ! 101: dcsc1.write(step, data); ! 102: break; ! 103: ! 104: default: ! 105: Log_Printf(LOG_WARN, "[ND] Slot %i: IIC bus: Unknown device (%02X)", slot, addr); ! 106: break; ! 107: } ! 108: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.