Merge branch 'master' of https://github.com/86Box/86Box
This commit is contained in:
@@ -15,16 +15,65 @@
|
||||
*
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
* Copyright 2025 starfrost (refactoring)
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_CGA_H
|
||||
#define VIDEO_CGA_H
|
||||
|
||||
// Mode flags for the CGA.
|
||||
// Set by writing to 3D8
|
||||
typedef enum cga_mode_flags_e
|
||||
{
|
||||
CGA_MODE_FLAG_HIGHRES = 1 << 0, // 80-column text mode
|
||||
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 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;
|
||||
|
||||
// Motorola MC6845 CRTC registers
|
||||
typedef enum cga_crtc_registers_e
|
||||
{
|
||||
CGA_CRTC_HTOTAL = 0x0, // Horizontal total (total number of characters incl. hsync)
|
||||
CGA_CRTC_HDISP = 0x1, // Horizontal display
|
||||
CGA_CRTC_HSYNC_POS = 0x2, // Horizontal position of horizontal ysnc
|
||||
CGA_CRTC_HSYNC_WIDTH = 0x3, // Width of horizontal sync
|
||||
CGA_CRTC_VTOTAL = 0x4, // Vertical total (total number of scanlines incl. vsync)
|
||||
CGA_CRTC_VTOTAL_ADJUST = 0x5, // Vertical total adjust value
|
||||
CGA_CRTC_VDISP = 0x6, // Vertical display (total number of displayed scanline)
|
||||
CGA_CRTC_VSYNC = 0x7, // Vertical sync scanline number
|
||||
CGA_CRTC_INTERLACE = 0x8, // Interlacing mode
|
||||
CGA_CRTC_MAX_SCANLINE_ADDR = 0x9, // Maximum scanline address
|
||||
CGA_CRTC_CURSOR_START = 0xA, // Cursor start scanline
|
||||
CGA_CRTC_CURSOR_END = 0xB, // Cursor end scanline
|
||||
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 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;
|
||||
|
||||
#define CGA_NUM_CRTC_REGS 32
|
||||
|
||||
typedef struct cga_t {
|
||||
mem_mapping_t mapping;
|
||||
|
||||
int crtcreg;
|
||||
uint8_t crtc[32];
|
||||
uint8_t crtc[CGA_NUM_CRTC_REGS];
|
||||
|
||||
uint8_t cgastat;
|
||||
|
||||
@@ -40,7 +89,6 @@ typedef struct cga_t {
|
||||
int vc;
|
||||
int cgadispon;
|
||||
int con;
|
||||
int coff;
|
||||
int cursoron;
|
||||
int cgablink;
|
||||
int vsynctime;
|
||||
|
||||
@@ -47,7 +47,6 @@ typedef struct {
|
||||
uint16_t ma;
|
||||
uint16_t maback;
|
||||
int con;
|
||||
int coff;
|
||||
int cursoron;
|
||||
int dispon;
|
||||
int blink;
|
||||
|
||||
@@ -29,7 +29,6 @@ typedef struct mda_t {
|
||||
uint16_t ma;
|
||||
uint16_t maback;
|
||||
int con;
|
||||
int coff;
|
||||
int cursoron;
|
||||
int dispon;
|
||||
int blink;
|
||||
|
||||
@@ -116,7 +116,6 @@ typedef struct pgc {
|
||||
int vc;
|
||||
int cgadispon;
|
||||
int con;
|
||||
int coff;
|
||||
int cursoron;
|
||||
int cgablink;
|
||||
int vsynctime;
|
||||
|
||||
@@ -117,7 +117,6 @@ typedef struct amsvid_t {
|
||||
int vc;
|
||||
int cgadispon;
|
||||
int con;
|
||||
int coff;
|
||||
int cursoron;
|
||||
int cgablink;
|
||||
int vsynctime;
|
||||
@@ -515,7 +514,6 @@ vid_poll_1512(void *priv)
|
||||
}
|
||||
if (vid->sc == (vid->crtc[11] & 31)) {
|
||||
vid->con = 0;
|
||||
vid->coff = 1;
|
||||
}
|
||||
if (vid->vadj) {
|
||||
vid->sc++;
|
||||
@@ -1319,7 +1317,6 @@ lcdm_poll(amsvid_t *vid)
|
||||
}
|
||||
if (mda->sc == (mda->crtc[11] & 31) || ((mda->crtc[8] & 3) == 3 && mda->sc == ((mda->crtc[11] & 31) >> 1))) {
|
||||
mda->con = 0;
|
||||
mda->coff = 1;
|
||||
}
|
||||
if (mda->vadj) {
|
||||
mda->sc++;
|
||||
@@ -1483,7 +1480,6 @@ lcdc_poll(amsvid_t *vid)
|
||||
}
|
||||
if (cga->sc == (cga->crtc[11] & 31) || ((cga->crtc[8] & 3) == 3 && cga->sc == ((cga->crtc[11] & 31) >> 1))) {
|
||||
cga->con = 0;
|
||||
cga->coff = 1;
|
||||
}
|
||||
if ((cga->crtc[8] & 3) == 3 && cga->sc == (cga->crtc[9] >> 1))
|
||||
cga->maback = cga->ma;
|
||||
|
||||
@@ -82,7 +82,6 @@ typedef struct pcjr_t {
|
||||
int vc;
|
||||
int dispon;
|
||||
int con;
|
||||
int coff;
|
||||
int cursoron;
|
||||
int blink;
|
||||
int vsynctime;
|
||||
@@ -1167,7 +1166,6 @@ vid_poll(void *priv)
|
||||
}
|
||||
if (pcjr->sc == (pcjr->crtc[11] & 31) || ((pcjr->crtc[8] & 3) == 3 && pcjr->sc == ((pcjr->crtc[11] & 31) >> 1))) {
|
||||
pcjr->con = 0;
|
||||
pcjr->coff = 1;
|
||||
}
|
||||
if (pcjr->vadj) {
|
||||
pcjr->sc++;
|
||||
|
||||
@@ -92,7 +92,6 @@ typedef struct t1kvid_t {
|
||||
int vc;
|
||||
int dispon;
|
||||
int con;
|
||||
int coff;
|
||||
int cursoron;
|
||||
int blink;
|
||||
int fullchange;
|
||||
@@ -1212,7 +1211,6 @@ vid_poll(void *priv)
|
||||
}
|
||||
if (vid->sc == (vid->crtc[11] & 31) || ((vid->crtc[8] & 3) == 3 && vid->sc == ((vid->crtc[11] & 31) >> 1))) {
|
||||
vid->con = 0;
|
||||
vid->coff = 1;
|
||||
}
|
||||
if (vid->vadj) {
|
||||
vid->sc++;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
*
|
||||
* Copyright 2008-2019 Sarah Walker.
|
||||
* Copyright 2016-2019 Miran Grca.
|
||||
* Copyright 2023 W. M. Martinez
|
||||
* Copyright 2023 W. M. Martine
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
@@ -73,10 +73,10 @@ void cga_recalctimings(cga_t *cga);
|
||||
static void
|
||||
cga_update_latch(cga_t *cga)
|
||||
{
|
||||
uint32_t lp_latch = cga->displine * cga->crtc[1];
|
||||
uint32_t lp_latch = cga->displine * cga->crtc[CGA_CRTC_HDISP];
|
||||
|
||||
cga->crtc[0x10] = (lp_latch >> 8) & 0x3f;
|
||||
cga->crtc[0x11] = lp_latch & 0xff;
|
||||
cga->crtc[CGA_CRTC_LIGHT_PEN_ADDR_LOW] = lp_latch & 0xff;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -89,20 +89,22 @@ 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) {
|
||||
// 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;
|
||||
cga_recalctimings(cga);
|
||||
}
|
||||
}
|
||||
return;
|
||||
case 0x3D8:
|
||||
case CGA_REGISTER_MODE_CONTROL:
|
||||
old = cga->cgamode;
|
||||
cga->cgamode = val;
|
||||
|
||||
@@ -113,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);
|
||||
@@ -146,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);
|
||||
@@ -235,12 +236,12 @@ cga_recalctimings(cga_t *cga)
|
||||
double _dispontime;
|
||||
double _dispofftime;
|
||||
|
||||
if (cga->cgamode & 1) {
|
||||
disptime = (double) (cga->crtc[0] + 1);
|
||||
_dispontime = (double) cga->crtc[1];
|
||||
if (cga->cgamode & CGA_MODE_FLAG_HIGHRES) {
|
||||
disptime = (double) (cga->crtc[CGA_CRTC_HTOTAL] + 1);
|
||||
_dispontime = (double) cga->crtc[CGA_CRTC_HDISP];
|
||||
} else {
|
||||
disptime = (double) ((cga->crtc[0] + 1) << 1);
|
||||
_dispontime = (double) (cga->crtc[1] << 1);
|
||||
disptime = (double) ((cga->crtc[CGA_CRTC_HTOTAL] + 1) << 1);
|
||||
_dispontime = (double) (cga->crtc[CGA_CRTC_HDISP] << 1);
|
||||
}
|
||||
_dispofftime = disptime - _dispontime;
|
||||
_dispontime = _dispontime * CGACONST;
|
||||
@@ -252,7 +253,7 @@ cga_recalctimings(cga_t *cga)
|
||||
static void
|
||||
cga_render(cga_t *cga, int line)
|
||||
{
|
||||
uint16_t ca = (cga->crtc[15] | (cga->crtc[14] << 8)) & 0x3fff;
|
||||
uint16_t ca = (cga->crtc[CGA_CRTC_CURSOR_ADDR_LOW] | (cga->crtc[CGA_CRTC_CURSOR_ADDR_HIGH] << 8)) & 0x3fff;
|
||||
int drawcursor;
|
||||
int x;
|
||||
int c;
|
||||
@@ -262,33 +263,35 @@ cga_render(cga_t *cga, int line)
|
||||
int cols[4];
|
||||
int col;
|
||||
|
||||
if ((cga->cgamode & 0x12) == 0x12) {
|
||||
int32_t highres_graphics_flag = (CGA_MODE_FLAG_HIGHRES_GRAPHICS | CGA_MODE_FLAG_GRAPHICS);
|
||||
|
||||
if (((cga->cgamode & highres_graphics_flag) == highres_graphics_flag)) {
|
||||
for (c = 0; c < 8; ++c) {
|
||||
buffer32->line[line][c] = 0;
|
||||
if (cga->cgamode & 1)
|
||||
buffer32->line[line][c + (cga->crtc[1] << 3) + 8] = 0;
|
||||
if (cga->cgamode & CGA_MODE_FLAG_HIGHRES)
|
||||
buffer32->line[line][c + (cga->crtc[CGA_CRTC_HDISP] << 3) + 8] = 0;
|
||||
else
|
||||
buffer32->line[line][c + (cga->crtc[1] << 4) + 8] = 0;
|
||||
buffer32->line[line][c + (cga->crtc[CGA_CRTC_HDISP] << 4) + 8] = 0;
|
||||
}
|
||||
} else {
|
||||
for (c = 0; c < 8; ++c) {
|
||||
buffer32->line[line][c] = (cga->cgacol & 15) + 16;
|
||||
if (cga->cgamode & 1)
|
||||
buffer32->line[line][c + (cga->crtc[1] << 3) + 8] = (cga->cgacol & 15) + 16;
|
||||
if (cga->cgamode & CGA_MODE_FLAG_HIGHRES)
|
||||
buffer32->line[line][c + (cga->crtc[CGA_CRTC_HDISP] << 3) + 8] = (cga->cgacol & 15) + 16;
|
||||
else
|
||||
buffer32->line[line][c + (cga->crtc[1] << 4) + 8] = (cga->cgacol & 15) + 16;
|
||||
buffer32->line[line][c + (cga->crtc[CGA_CRTC_HDISP] << 4) + 8] = (cga->cgacol & 15) + 16;
|
||||
}
|
||||
}
|
||||
if (cga->cgamode & 1) {
|
||||
for (x = 0; x < cga->crtc[1]; x++) {
|
||||
if (cga->cgamode & 8) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_HIGHRES) {
|
||||
for (x = 0; x < cga->crtc[CGA_CRTC_HDISP]; x++) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_VIDEO_ENABLE) {
|
||||
chr = cga->charbuffer[x << 1];
|
||||
attr = cga->charbuffer[(x << 1) + 1];
|
||||
} else
|
||||
chr = attr = 0;
|
||||
drawcursor = ((cga->ma == ca) && cga->con && cga->cursoron);
|
||||
cols[1] = (attr & 15) + 16;
|
||||
if (cga->cgamode & 0x20) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_BLINK) {
|
||||
cols[0] = ((attr >> 4) & 7) + 16;
|
||||
if ((cga->cgablink & 8) && (attr & 0x80) && !cga->drawcursor)
|
||||
cols[1] = cols[0];
|
||||
@@ -308,15 +311,15 @@ cga_render(cga_t *cga, int line)
|
||||
cga->ma++;
|
||||
}
|
||||
} else if (!(cga->cgamode & 2)) {
|
||||
for (x = 0; x < cga->crtc[1]; x++) {
|
||||
if (cga->cgamode & 8) {
|
||||
for (x = 0; x < cga->crtc[CGA_CRTC_HDISP]; x++) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_VIDEO_ENABLE) {
|
||||
chr = cga->vram[(cga->ma << 1) & 0x3fff];
|
||||
attr = cga->vram[((cga->ma << 1) + 1) & 0x3fff];
|
||||
} else
|
||||
chr = attr = 0;
|
||||
drawcursor = ((cga->ma == ca) && cga->con && cga->cursoron);
|
||||
cols[1] = (attr & 15) + 16;
|
||||
if (cga->cgamode & 0x20) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_BLINK) {
|
||||
cols[0] = ((attr >> 4) & 7) + 16;
|
||||
if ((cga->cgablink & 8) && (attr & 0x80))
|
||||
cols[1] = cols[0];
|
||||
@@ -337,10 +340,10 @@ cga_render(cga_t *cga, int line)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (!(cga->cgamode & 16)) {
|
||||
} else if (!(cga->cgamode & CGA_MODE_FLAG_HIGHRES_GRAPHICS)) {
|
||||
cols[0] = (cga->cgacol & 15) | 16;
|
||||
col = (cga->cgacol & 16) ? 24 : 16;
|
||||
if (cga->cgamode & 4) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_BW) {
|
||||
cols[1] = col | 3; /* Cyan */
|
||||
cols[2] = col | 4; /* Red */
|
||||
cols[3] = col | 7; /* White */
|
||||
@@ -353,8 +356,8 @@ cga_render(cga_t *cga, int line)
|
||||
cols[2] = col | 4; /* Red */
|
||||
cols[3] = col | 6; /* Yellow */
|
||||
}
|
||||
for (x = 0; x < cga->crtc[1]; x++) {
|
||||
if (cga->cgamode & 8)
|
||||
for (x = 0; x < cga->crtc[CGA_CRTC_HDISP]; x++) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_VIDEO_ENABLE)
|
||||
dat = (cga->vram[((cga->ma << 1) & 0x1fff) + ((cga->sc & 1) * 0x2000)] << 8) |
|
||||
cga->vram[((cga->ma << 1) & 0x1fff) + ((cga->sc & 1) * 0x2000) + 1];
|
||||
else
|
||||
@@ -370,8 +373,8 @@ cga_render(cga_t *cga, int line)
|
||||
} else {
|
||||
cols[0] = 0;
|
||||
cols[1] = (cga->cgacol & 15) + 16;
|
||||
for (x = 0; x < cga->crtc[1]; x++) {
|
||||
if (cga->cgamode & 8)
|
||||
for (x = 0; x < cga->crtc[CGA_CRTC_HDISP]; x++) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_VIDEO_ENABLE)
|
||||
dat = (cga->vram[((cga->ma << 1) & 0x1fff) + ((cga->sc & 1) * 0x2000)] << 8) |
|
||||
cga->vram[((cga->ma << 1) & 0x1fff) + ((cga->sc & 1) * 0x2000) + 1];
|
||||
else
|
||||
@@ -388,12 +391,14 @@ cga_render(cga_t *cga, int line)
|
||||
static void
|
||||
cga_render_blank(cga_t *cga, int line)
|
||||
{
|
||||
int col = ((cga->cgamode & 0x12) == 0x12) ? 0 : (cga->cgacol & 15) + 16;
|
||||
int32_t highres_graphics_flag = (CGA_MODE_FLAG_HIGHRES_GRAPHICS | CGA_MODE_FLAG_GRAPHICS);
|
||||
|
||||
if (cga->cgamode & 1)
|
||||
hline(buffer32, 0, line, (cga->crtc[1] << 3) + 16, col);
|
||||
int col = ((cga->cgamode & highres_graphics_flag) == highres_graphics_flag) ? 0 : (cga->cgacol & 15) + 16;
|
||||
|
||||
if (cga->cgamode & CGA_MODE_FLAG_HIGHRES)
|
||||
hline(buffer32, 0, line, (cga->crtc[CGA_CRTC_HDISP] << 3) + 16, col);
|
||||
else
|
||||
hline(buffer32, 0, line, (cga->crtc[1] << 4) + 16, col);
|
||||
hline(buffer32, 0, line, (cga->crtc[CGA_CRTC_HDISP] << 4) + 16, col);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -401,14 +406,15 @@ cga_render_process(cga_t *cga, int line)
|
||||
{
|
||||
int x;
|
||||
uint8_t border;
|
||||
int32_t highres_graphics_flag = (CGA_MODE_FLAG_HIGHRES_GRAPHICS | CGA_MODE_FLAG_GRAPHICS);
|
||||
|
||||
if (cga->cgamode & 1)
|
||||
x = (cga->crtc[1] << 3) + 16;
|
||||
if (cga->cgamode & CGA_MODE_FLAG_HIGHRES)
|
||||
x = (cga->crtc[CGA_CRTC_HDISP] << 3) + 16;
|
||||
else
|
||||
x = (cga->crtc[1] << 4) + 16;
|
||||
x = (cga->crtc[CGA_CRTC_HDISP] << 4) + 16;
|
||||
|
||||
if (cga->composite) {
|
||||
border = ((cga->cgamode & 0x12) == 0x12) ? 0 : (cga->cgacol & 15);
|
||||
border = ((cga->cgamode & highres_graphics_flag) == highres_graphics_flag) ? 0 : (cga->cgacol & 15);
|
||||
|
||||
Composite_Process(cga->cgamode, border, x >> 2, buffer32->line[line]);
|
||||
} else
|
||||
@@ -524,7 +530,7 @@ cga_poll(void *priv)
|
||||
cga->cgastat |= 1;
|
||||
cga->linepos = 1;
|
||||
oldsc = cga->sc;
|
||||
if ((cga->crtc[8] & 3) == 3)
|
||||
if ((cga->crtc[CGA_CRTC_INTERLACE] & 3) == 3)
|
||||
cga->sc = ((cga->sc << 1) + cga->oddeven) & 7;
|
||||
if (cga->cgadispon) {
|
||||
if (cga->displine < cga->firstline) {
|
||||
@@ -573,7 +579,7 @@ cga_poll(void *priv)
|
||||
}
|
||||
|
||||
cga->sc = oldsc;
|
||||
if (cga->vc == cga->crtc[7] && !cga->sc)
|
||||
if (cga->vc == cga->crtc[CGA_CRTC_VSYNC] && !cga->sc)
|
||||
cga->cgastat |= 8;
|
||||
cga->displine++;
|
||||
if (cga->displine >= 360)
|
||||
@@ -586,12 +592,11 @@ cga_poll(void *priv)
|
||||
if (!cga->vsynctime)
|
||||
cga->cgastat &= ~8;
|
||||
}
|
||||
if (cga->sc == (cga->crtc[11] & 31) || ((cga->crtc[8] & 3) == 3 &&
|
||||
cga->sc == ((cga->crtc[11] & 31) >> 1))) {
|
||||
if (cga->sc == (cga->crtc[CGA_CRTC_CURSOR_END] & 31) || ((cga->crtc[CGA_CRTC_INTERLACE] & 3) == 3 &&
|
||||
cga->sc == ((cga->crtc[CGA_CRTC_CURSOR_END] & 31) >> 1))) {
|
||||
cga->con = 0;
|
||||
cga->coff = 1;
|
||||
}
|
||||
if ((cga->crtc[8] & 3) == 3 && cga->sc == (cga->crtc[9] >> 1))
|
||||
if ((cga->crtc[CGA_CRTC_INTERLACE] & 3) == 3 && cga->sc == (cga->crtc[CGA_CRTC_MAX_SCANLINE_ADDR] >> 1))
|
||||
cga->maback = cga->ma;
|
||||
if (cga->vadj) {
|
||||
cga->sc++;
|
||||
@@ -600,27 +605,27 @@ cga_poll(void *priv)
|
||||
cga->vadj--;
|
||||
if (!cga->vadj) {
|
||||
cga->cgadispon = 1;
|
||||
cga->ma = cga->maback = (cga->crtc[13] | (cga->crtc[12] << 8)) & 0x3fff;
|
||||
cga->ma = cga->maback = (cga->crtc[CGA_CRTC_START_ADDR_LOW] | (cga->crtc[CGA_CRTC_START_ADDR_HIGH] << 8)) & 0x3fff;
|
||||
cga->sc = 0;
|
||||
}
|
||||
} else if (cga->sc == cga->crtc[9]) {
|
||||
} else if (cga->sc == cga->crtc[CGA_CRTC_MAX_SCANLINE_ADDR]) {
|
||||
cga->maback = cga->ma;
|
||||
cga->sc = 0;
|
||||
oldvc = cga->vc;
|
||||
cga->vc++;
|
||||
cga->vc &= 127;
|
||||
|
||||
if (cga->vc == cga->crtc[6])
|
||||
if (cga->vc == cga->crtc[CGA_CRTC_VDISP])
|
||||
cga->cgadispon = 0;
|
||||
|
||||
if (oldvc == cga->crtc[4]) {
|
||||
if (oldvc == cga->crtc[CGA_CRTC_VTOTAL]) {
|
||||
cga->vc = 0;
|
||||
cga->vadj = cga->crtc[5];
|
||||
cga->vadj = cga->crtc[CGA_CRTC_VTOTAL_ADJUST];
|
||||
if (!cga->vadj) {
|
||||
cga->cgadispon = 1;
|
||||
cga->ma = cga->maback = (cga->crtc[13] | (cga->crtc[12] << 8)) & 0x3fff;
|
||||
cga->ma = cga->maback = (cga->crtc[CGA_CRTC_START_ADDR_LOW] | (cga->crtc[CGA_CRTC_START_ADDR_HIGH] << 8)) & 0x3fff;
|
||||
}
|
||||
switch (cga->crtc[10] & 0x60) {
|
||||
switch (cga->crtc[CGA_CRTC_CURSOR_START] & 0x60) {
|
||||
case 0x20:
|
||||
cga->cursoron = 0;
|
||||
break;
|
||||
@@ -633,15 +638,15 @@ cga_poll(void *priv)
|
||||
}
|
||||
}
|
||||
|
||||
if (cga->vc == cga->crtc[7]) {
|
||||
if (cga->vc == cga->crtc[CGA_CRTC_VSYNC]) {
|
||||
cga->cgadispon = 0;
|
||||
cga->displine = 0;
|
||||
cga->vsynctime = 16;
|
||||
if (cga->crtc[7]) {
|
||||
if (cga->cgamode & 1)
|
||||
x = (cga->crtc[1] << 3) + 16;
|
||||
if (cga->crtc[CGA_CRTC_VSYNC]) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_HIGHRES)
|
||||
x = (cga->crtc[CGA_CRTC_HDISP] << 3) + 16;
|
||||
else
|
||||
x = (cga->crtc[1] << 4) + 16;
|
||||
x = (cga->crtc[CGA_CRTC_HDISP] << 4) + 16;
|
||||
cga->lastline++;
|
||||
|
||||
xs_temp = x;
|
||||
@@ -657,7 +662,7 @@ cga_poll(void *priv)
|
||||
if (!enable_overscan)
|
||||
xs_temp -= 16;
|
||||
|
||||
if ((cga->cgamode & 8) && ((xs_temp != xsize) ||
|
||||
if ((cga->cgamode & CGA_MODE_FLAG_VIDEO_ENABLE) && ((xs_temp != xsize) ||
|
||||
(ys_temp != ysize) || video_force_resize_get())) {
|
||||
xsize = xs_temp;
|
||||
ysize = ys_temp;
|
||||
@@ -691,15 +696,15 @@ cga_poll(void *priv)
|
||||
|
||||
video_res_x = xsize;
|
||||
video_res_y = ysize;
|
||||
if (cga->cgamode & 1) {
|
||||
if (cga->cgamode & CGA_MODE_FLAG_HIGHRES) {
|
||||
video_res_x /= 8;
|
||||
video_res_y /= cga->crtc[9] + 1;
|
||||
video_res_y /= cga->crtc[CGA_CRTC_MAX_SCANLINE_ADDR] + 1;
|
||||
video_bpp = 0;
|
||||
} else if (!(cga->cgamode & 2)) {
|
||||
} else if (!(cga->cgamode & CGA_MODE_FLAG_GRAPHICS)) {
|
||||
video_res_x /= 16;
|
||||
video_res_y /= cga->crtc[9] + 1;
|
||||
video_res_y /= cga->crtc[CGA_CRTC_MAX_SCANLINE_ADDR] + 1;
|
||||
video_bpp = 0;
|
||||
} else if (!(cga->cgamode & 16)) {
|
||||
} else if (!(cga->cgamode & CGA_MODE_FLAG_HIGHRES_GRAPHICS)) {
|
||||
video_res_x /= 2;
|
||||
video_bpp = 2;
|
||||
} else
|
||||
@@ -717,11 +722,11 @@ cga_poll(void *priv)
|
||||
}
|
||||
if (cga->cgadispon)
|
||||
cga->cgastat &= ~1;
|
||||
if (cga->sc == (cga->crtc[10] & 31) || ((cga->crtc[8] & 3) == 3 &&
|
||||
cga->sc == ((cga->crtc[10] & 31) >> 1)))
|
||||
if (cga->sc == (cga->crtc[CGA_CRTC_CURSOR_START] & 31) || ((cga->crtc[CGA_CRTC_INTERLACE] & 3) == 3 &&
|
||||
cga->sc == ((cga->crtc[CGA_CRTC_CURSOR_START] & 31) >> 1)))
|
||||
cga->con = 1;
|
||||
if (cga->cgadispon && (cga->cgamode & 1)) {
|
||||
for (x = 0; x < (cga->crtc[1] << 1); x++)
|
||||
if (cga->cgadispon && (cga->cgamode & CGA_MODE_FLAG_HIGHRES)) {
|
||||
for (x = 0; x < (cga->crtc[CGA_CRTC_HDISP] << 1); x++)
|
||||
cga->charbuffer[x] = cga->vram[((cga->ma << 1) + x) & 0x3fff];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,9 +42,6 @@
|
||||
#define COLORPLUS_320x200_MODE 0x10 /* 320x200x16 mode active */
|
||||
#define COLORPLUS_EITHER_MODE 0x30 /* Either mode active */
|
||||
|
||||
/* Bits in the CGA graphics mode register */
|
||||
#define CGA_GRAPHICS_MODE 0x02 /* CGA graphics mode selected? */
|
||||
|
||||
#define CGA_RGB 0
|
||||
#define CGA_COMPOSITE 1
|
||||
|
||||
@@ -80,7 +77,7 @@ colorplus_write(uint32_t addr, uint8_t val, void *priv)
|
||||
{
|
||||
colorplus_t *colorplus = (colorplus_t *) priv;
|
||||
|
||||
if ((colorplus->control & COLORPLUS_PLANE_SWAP) && (colorplus->control & COLORPLUS_EITHER_MODE) && (colorplus->cga.cgamode & CGA_GRAPHICS_MODE)) {
|
||||
if ((colorplus->control & COLORPLUS_PLANE_SWAP) && (colorplus->control & COLORPLUS_EITHER_MODE) && (colorplus->cga.cgamode & CGA_MODE_FLAG_GRAPHICS)) {
|
||||
addr ^= 0x4000;
|
||||
} else if (!(colorplus->control & COLORPLUS_EITHER_MODE)) {
|
||||
addr &= 0x3FFF;
|
||||
@@ -99,7 +96,7 @@ colorplus_read(uint32_t addr, void *priv)
|
||||
{
|
||||
colorplus_t *colorplus = (colorplus_t *) priv;
|
||||
|
||||
if ((colorplus->control & COLORPLUS_PLANE_SWAP) && (colorplus->control & COLORPLUS_EITHER_MODE) && (colorplus->cga.cgamode & CGA_GRAPHICS_MODE)) {
|
||||
if ((colorplus->control & COLORPLUS_PLANE_SWAP) && (colorplus->control & COLORPLUS_EITHER_MODE) && (colorplus->cga.cgamode & CGA_MODE_FLAG_GRAPHICS)) {
|
||||
addr ^= 0x4000;
|
||||
} else if (!(colorplus->control & COLORPLUS_EITHER_MODE)) {
|
||||
addr &= 0x3FFF;
|
||||
@@ -140,7 +137,7 @@ colorplus_poll(void *priv)
|
||||
|
||||
/* If one of the extra modes is not selected, drop down to the CGA
|
||||
* drawing code. */
|
||||
if (!((colorplus->control & COLORPLUS_EITHER_MODE) && (colorplus->cga.cgamode & CGA_GRAPHICS_MODE))) {
|
||||
if (!((colorplus->control & COLORPLUS_EITHER_MODE) && (colorplus->cga.cgamode & CGA_MODE_FLAG_GRAPHICS))) {
|
||||
cga_poll(&colorplus->cga);
|
||||
return;
|
||||
}
|
||||
@@ -229,7 +226,6 @@ colorplus_poll(void *priv)
|
||||
}
|
||||
if (colorplus->cga.sc == (colorplus->cga.crtc[11] & 31) || ((colorplus->cga.crtc[8] & 3) == 3 && colorplus->cga.sc == ((colorplus->cga.crtc[11] & 31) >> 1))) {
|
||||
colorplus->cga.con = 0;
|
||||
colorplus->cga.coff = 1;
|
||||
}
|
||||
if ((colorplus->cga.crtc[8] & 3) == 3 && colorplus->cga.sc == (colorplus->cga.crtc[9] >> 1))
|
||||
colorplus->cga.maback = colorplus->cga.ma;
|
||||
|
||||
@@ -269,7 +269,6 @@ compaq_cga_poll(void *priv)
|
||||
|
||||
if (self->cga.sc == (self->cga.crtc[11] & 31) || ((self->cga.crtc[8] & 3) == 3 && self->cga.sc == ((self->cga.crtc[11] & 31) >> 1))) {
|
||||
self->cga.con = 0;
|
||||
self->cga.coff = 1;
|
||||
}
|
||||
if ((self->cga.crtc[8] & 3) == 3 && self->cga.sc == (self->cga.crtc[9] >> 1))
|
||||
self->cga.maback = self->cga.ma;
|
||||
|
||||
@@ -399,7 +399,6 @@ hercules_poll(void *priv)
|
||||
|
||||
if (dev->sc == (dev->crtc[11] & 31) || ((dev->crtc[8] & 3) == 3 && dev->sc == ((dev->crtc[11] & 31) >> 1))) {
|
||||
dev->con = 0;
|
||||
dev->coff = 1;
|
||||
}
|
||||
|
||||
if (dev->vadj) {
|
||||
|
||||
@@ -77,7 +77,7 @@ typedef struct {
|
||||
int linepos, displine;
|
||||
int vc, sc;
|
||||
uint16_t ma, maback;
|
||||
int con, coff, cursoron;
|
||||
int con, cursoron;
|
||||
int dispon, blink;
|
||||
int vsynctime;
|
||||
int vadj;
|
||||
@@ -536,7 +536,6 @@ herculesplus_poll(void *priv)
|
||||
|
||||
if (dev->sc == (dev->crtc[11] & 31) || ((dev->crtc[8] & 3) == 3 && dev->sc == ((dev->crtc[11] & 31) >> 1))) {
|
||||
dev->con = 0;
|
||||
dev->coff = 1;
|
||||
}
|
||||
if (dev->vadj) {
|
||||
dev->sc++;
|
||||
|
||||
@@ -167,7 +167,7 @@ typedef struct {
|
||||
int linepos, displine;
|
||||
int vc, sc;
|
||||
uint16_t ma, maback;
|
||||
int con, coff, cursoron;
|
||||
int con, cursoron;
|
||||
int dispon, blink;
|
||||
int vsynctime;
|
||||
int vadj;
|
||||
@@ -899,7 +899,6 @@ incolor_poll(void *priv)
|
||||
|
||||
if (dev->sc == (dev->crtc[11] & 31) || ((dev->crtc[8] & 3) == 3 && dev->sc == ((dev->crtc[11] & 31) >> 1))) {
|
||||
dev->con = 0;
|
||||
dev->coff = 1;
|
||||
}
|
||||
|
||||
if (dev->vadj) {
|
||||
|
||||
@@ -200,7 +200,6 @@ mda_poll(void *priv)
|
||||
}
|
||||
if (mda->sc == (mda->crtc[11] & 31) || ((mda->crtc[8] & 3) == 3 && mda->sc == ((mda->crtc[11] & 31) >> 1))) {
|
||||
mda->con = 0;
|
||||
mda->coff = 1;
|
||||
}
|
||||
if (mda->vadj) {
|
||||
mda->sc++;
|
||||
|
||||
@@ -392,7 +392,6 @@ nga_poll(void *priv)
|
||||
/* cursor stop scanline */
|
||||
if (nga->cga.sc == (nga->cga.crtc[11] & 31) || ((nga->cga.crtc[8] & 3) == 3 && nga->cga.sc == ((nga->cga.crtc[11] & 31) >> 1))) {
|
||||
nga->cga.con = 0;
|
||||
nga->cga.coff = 1;
|
||||
}
|
||||
/* interlaced and max scanline per char reached */
|
||||
if ((nga->cga.crtc[8] & 3) == 3 && nga->cga.sc == (nga->cga.crtc[9] >> 1))
|
||||
|
||||
@@ -407,7 +407,6 @@ ogc_poll(void *priv)
|
||||
}
|
||||
if (ogc->cga.sc == (ogc->cga.crtc[11] & 31) || ((ogc->cga.crtc[8] & 3) == 3 && ogc->cga.sc == ((ogc->cga.crtc[11] & 31) >> 1))) {
|
||||
ogc->cga.con = 0;
|
||||
ogc->cga.coff = 1;
|
||||
}
|
||||
if ((ogc->cga.crtc[8] & 3) == 3 && ogc->cga.sc == (ogc->cga.crtc[9] >> 1))
|
||||
ogc->cga.maback = ogc->cga.ma;
|
||||
|
||||
@@ -158,7 +158,7 @@ typedef struct sigma_t {
|
||||
int linepos, displine;
|
||||
int sc, vc;
|
||||
int cgadispon;
|
||||
int con, coff, cursoron, cgablink;
|
||||
int con, cursoron, cgablink;
|
||||
int vsynctime, vadj;
|
||||
int oddeven;
|
||||
|
||||
@@ -676,7 +676,6 @@ sigma_poll(void *priv)
|
||||
}
|
||||
if (sigma->sc == (sigma->crtc[11] & 31) || ((sigma->crtc[8] & 3) == 3 && sigma->sc == ((sigma->crtc[11] & 31) >> 1))) {
|
||||
sigma->con = 0;
|
||||
sigma->coff = 1;
|
||||
}
|
||||
if ((sigma->crtc[8] & 3) == 3 && sigma->sc == (sigma->crtc[9] >> 1))
|
||||
sigma->maback = sigma->ma;
|
||||
|
||||
Reference in New Issue
Block a user