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