Do the same for the registers.
This commit is contained in:
@@ -29,7 +29,7 @@ typedef enum cga_mode_flags_e
|
||||
CGA_MODE_FLAG_GRAPHICS = 1 << 1, // Graphics mode
|
||||
CGA_MODE_FLAG_BW = 1 << 2, // Black and white
|
||||
CGA_MODE_FLAG_VIDEO_ENABLE = 1 << 3, // 0 = no video (as if the video was 0)
|
||||
CGA_MODE_FLAG_HIGHRES_GRAPHICS = 1 << 4, // 640*200 mode. Corrupts the
|
||||
CGA_MODE_FLAG_HIGHRES_GRAPHICS = 1 << 4, // 640*200 mode. Corrupts text mode if CGA_MODE_FLAG_GRAPHICS not set.
|
||||
CGA_MODE_FLAG_BLINK = 1 << 5, // If this is set, bit 5 of textmode characters blinks. Otherwise it is a high-intensity bg mode.
|
||||
} cga_mode_flags;
|
||||
|
||||
@@ -51,11 +51,22 @@ typedef enum cga_crtc_registers_e
|
||||
CGA_CRTC_START_ADDR_HIGH = 0xC, // Screen start address high 8 bits
|
||||
CGA_CRTC_START_ADDR_LOW = 0xD, // Screen start address low 8 bits
|
||||
CGA_CRTC_CURSOR_ADDR_HIGH = 0xE, // Cursor address high 8 bits
|
||||
CGA_CRTC_CURSOR_ADDR_LOW = 0xF, // Cursor addres low 8 bits
|
||||
CGA_CRTC_LIGHT_PEN_ADDR_HIGH = 0x10,
|
||||
CGA_CRTC_LIGHT_PEN_ADDR_LOW = 0x11,
|
||||
CGA_CRTC_CURSOR_ADDR_LOW = 0xF, // Cursor address low 8 bits
|
||||
CGA_CRTC_LIGHT_PEN_ADDR_HIGH = 0x10, // Light pen address high 8 bits (not currently supported)
|
||||
CGA_CRTC_LIGHT_PEN_ADDR_LOW = 0x11, // Light pen address low 8 bits (not currently supported)
|
||||
} cga_crtc_registers;
|
||||
|
||||
typedef enum cga_registers_e
|
||||
{
|
||||
CGA_REGISTER_CRTC_INDEX = 0x3D4,
|
||||
CGA_REGISTER_CRTC_DATA = 0x3D5,
|
||||
CGA_REGISTER_MODE_CONTROL = 0x3D8,
|
||||
CGA_REGISTER_COLOR_SELECT = 0x3D9,
|
||||
CGA_REGISTER_STATUS = 0x3DA,
|
||||
CGA_REGISTER_CLEAR_LIGHT_PEN_LATCH = 0x3DB,
|
||||
CGA_REGISTER_SET_LIGHT_PEN_LATCH = 0x3DC,
|
||||
} cga_registers;
|
||||
|
||||
typedef struct cga_t {
|
||||
mem_mapping_t mapping;
|
||||
|
||||
|
||||
@@ -89,14 +89,14 @@ cga_out(uint16_t addr, uint8_t val, void *priv)
|
||||
addr = (addr & 0xff9) | 0x004;
|
||||
|
||||
switch (addr) {
|
||||
case 0x3D4:
|
||||
case CGA_REGISTER_CRTC_INDEX:
|
||||
cga->crtcreg = val & 31;
|
||||
return;
|
||||
case 0x3D5:
|
||||
case CGA_REGISTER_CRTC_DATA:
|
||||
old = cga->crtc[cga->crtcreg];
|
||||
cga->crtc[cga->crtcreg] = val & crtcmask[cga->crtcreg];
|
||||
if (old != val) {
|
||||
// Update the timings if we are writing any invalid CRTC register or a valid CRTC register
|
||||
// Recalc the timings if we are writing any invalid CRTC register or a valid CRTC register
|
||||
// except the CURSOR and LIGHT PEN registers
|
||||
if ((cga->crtcreg < 0xe) || (cga->crtcreg > 0x11)) {
|
||||
cga->fullchange = changeframecount;
|
||||
@@ -104,7 +104,7 @@ cga_out(uint16_t addr, uint8_t val, void *priv)
|
||||
}
|
||||
}
|
||||
return;
|
||||
case 0x3D8:
|
||||
case CGA_REGISTER_MODE_CONTROL:
|
||||
old = cga->cgamode;
|
||||
cga->cgamode = val;
|
||||
|
||||
@@ -115,18 +115,18 @@ cga_out(uint16_t addr, uint8_t val, void *priv)
|
||||
cga_recalctimings(cga);
|
||||
}
|
||||
return;
|
||||
case 0x3D9:
|
||||
case CGA_REGISTER_COLOR_SELECT:
|
||||
old = cga->cgacol;
|
||||
cga->cgacol = val;
|
||||
if (old ^ val)
|
||||
cga_recalctimings(cga);
|
||||
return;
|
||||
|
||||
case 0x3DB:
|
||||
case CGA_REGISTER_CLEAR_LIGHT_PEN_LATCH:
|
||||
if (cga->lp_strobe == 1)
|
||||
cga->lp_strobe = 0;
|
||||
return;
|
||||
case 0x3DC:
|
||||
case CGA_REGISTER_SET_LIGHT_PEN_LATCH:
|
||||
if (cga->lp_strobe == 0) {
|
||||
cga->lp_strobe = 1;
|
||||
cga_update_latch(cga);
|
||||
@@ -148,21 +148,20 @@ cga_in(uint16_t addr, void *priv)
|
||||
addr = (addr & 0xff9) | 0x004;
|
||||
|
||||
switch (addr) {
|
||||
case 0x3D4:
|
||||
case CGA_REGISTER_CRTC_INDEX:
|
||||
ret = cga->crtcreg;
|
||||
break;
|
||||
case 0x3D5:
|
||||
case CGA_REGISTER_CRTC_DATA:
|
||||
ret = cga->crtc[cga->crtcreg];
|
||||
break;
|
||||
case 0x3DA:
|
||||
case CGA_REGISTER_STATUS:
|
||||
ret = cga->cgastat;
|
||||
break;
|
||||
|
||||
case 0x3DB:
|
||||
case CGA_REGISTER_CLEAR_LIGHT_PEN_LATCH:
|
||||
if (cga->lp_strobe == 1)
|
||||
cga->lp_strobe = 0;
|
||||
break;
|
||||
case 0x3DC:
|
||||
case CGA_REGISTER_SET_LIGHT_PEN_LATCH:
|
||||
if (cga->lp_strobe == 0) {
|
||||
cga->lp_strobe = 1;
|
||||
cga_update_latch(cga);
|
||||
|
||||
Reference in New Issue
Block a user