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