ma -> memaddr
ma_latch -> memaddr_latch maback -> memaddr_backup ca -> cursoraddr sc -> scanline oldsc -> scanline_old
This commit is contained in:
@@ -151,12 +151,12 @@ typedef struct sigma_t {
|
||||
|
||||
uint8_t sigmamode; /* Mode control register [0x2D8] */
|
||||
|
||||
uint16_t ma, maback;
|
||||
uint16_t memaddr, memaddr_backup;
|
||||
|
||||
int crtcreg; /* CRTC: Real selected register */
|
||||
|
||||
int linepos, displine;
|
||||
int sc, vc;
|
||||
int scanline, vc;
|
||||
int cgadispon;
|
||||
int cursorvisible, cursoron, cgablink;
|
||||
int vsynctime, vadj;
|
||||
@@ -414,23 +414,23 @@ sigma_text80(sigma_t *sigma)
|
||||
{
|
||||
uint8_t chr;
|
||||
uint8_t attr;
|
||||
uint16_t ca = (sigma->crtc[15] | (sigma->crtc[14] << 8));
|
||||
uint16_t ma = ((sigma->ma & 0x3FFF) << 1);
|
||||
uint16_t cursoraddr = (sigma->crtc[15] | (sigma->crtc[14] << 8));
|
||||
uint16_t memaddr = ((sigma->memaddr & 0x3FFF) << 1);
|
||||
int drawcursor;
|
||||
uint32_t cols[4];
|
||||
const uint8_t *vram = sigma->vram + (ma << 1);
|
||||
const uint8_t *vram = sigma->vram + (memaddr << 1);
|
||||
|
||||
ca = ca << 1;
|
||||
cursoraddr = cursoraddr << 1;
|
||||
if (sigma->sigma_ctl & CTL_CURSOR)
|
||||
++ca;
|
||||
ca &= 0x3fff;
|
||||
++cursoraddr;
|
||||
cursoraddr &= 0x3fff;
|
||||
|
||||
/* The Sigma 400 seems to use screen widths stated in words
|
||||
(40 for 80-column, 20 for 40-column) */
|
||||
for (uint32_t x = 0; x < (sigma->crtc[1] << 1); x++) {
|
||||
chr = vram[x << 1];
|
||||
attr = vram[(x << 1) + 1];
|
||||
drawcursor = ((ma == ca) && sigma->cursorvisible && sigma->cursoron);
|
||||
drawcursor = ((memaddr == cursoraddr) && sigma->cursorvisible && sigma->cursoron);
|
||||
|
||||
if (!(sigma->sigmamode & MODE_NOBLINK)) {
|
||||
cols[1] = (attr & 15) | 16;
|
||||
@@ -445,22 +445,22 @@ sigma_text80(sigma_t *sigma)
|
||||
if (drawcursor) {
|
||||
for (uint8_t c = 0; c < 8; c++) {
|
||||
if (sigma->sigmamode & MODE_FONT16)
|
||||
buffer32->line[sigma->displine][(x << 3) + c + 8] = cols[(fontdatm[chr][sigma->sc & 15] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xf;
|
||||
buffer32->line[sigma->displine][(x << 3) + c + 8] = cols[(fontdatm[chr][sigma->scanline & 15] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xf;
|
||||
else
|
||||
buffer32->line[sigma->displine][(x << 3) + c + 8] = cols[(fontdat[chr][sigma->sc & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xf;
|
||||
buffer32->line[sigma->displine][(x << 3) + c + 8] = cols[(fontdat[chr][sigma->scanline & 7] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xf;
|
||||
}
|
||||
} else {
|
||||
for (uint8_t c = 0; c < 8; c++) {
|
||||
if (sigma->sigmamode & MODE_FONT16)
|
||||
buffer32->line[sigma->displine][(x << 3) + c + 8] = cols[(fontdatm[chr][sigma->sc & 15] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
buffer32->line[sigma->displine][(x << 3) + c + 8] = cols[(fontdatm[chr][sigma->scanline & 15] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
else
|
||||
buffer32->line[sigma->displine][(x << 3) + c + 8] = cols[(fontdat[chr][sigma->sc & 7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
buffer32->line[sigma->displine][(x << 3) + c + 8] = cols[(fontdat[chr][sigma->scanline & 7] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
}
|
||||
}
|
||||
++ma;
|
||||
++memaddr;
|
||||
}
|
||||
|
||||
sigma->ma += sigma->crtc[1];
|
||||
sigma->memaddr += sigma->crtc[1];
|
||||
}
|
||||
|
||||
/* Render a line in 40-column text mode */
|
||||
@@ -469,23 +469,23 @@ sigma_text40(sigma_t *sigma)
|
||||
{
|
||||
uint8_t chr;
|
||||
uint8_t attr;
|
||||
uint16_t ca = (sigma->crtc[15] | (sigma->crtc[14] << 8));
|
||||
uint16_t ma = ((sigma->ma & 0x3FFF) << 1);
|
||||
uint16_t cursoraddr = (sigma->crtc[15] | (sigma->crtc[14] << 8));
|
||||
uint16_t memaddr = ((sigma->memaddr & 0x3FFF) << 1);
|
||||
int drawcursor;
|
||||
uint32_t cols[4];
|
||||
const uint8_t *vram = sigma->vram + ((ma << 1) & 0x3FFF);
|
||||
const uint8_t *vram = sigma->vram + ((memaddr << 1) & 0x3FFF);
|
||||
|
||||
ca = ca << 1;
|
||||
cursoraddr = cursoraddr << 1;
|
||||
if (sigma->sigma_ctl & CTL_CURSOR)
|
||||
++ca;
|
||||
ca &= 0x3fff;
|
||||
++cursoraddr;
|
||||
cursoraddr &= 0x3fff;
|
||||
|
||||
/* The Sigma 400 seems to use screen widths stated in words
|
||||
(40 for 80-column, 20 for 40-column) */
|
||||
for (uint32_t x = 0; x < (sigma->crtc[1] << 1); x++) {
|
||||
chr = vram[x << 1];
|
||||
attr = vram[(x << 1) + 1];
|
||||
drawcursor = ((ma == ca) && sigma->cursorvisible && sigma->cursoron);
|
||||
drawcursor = ((memaddr == cursoraddr) && sigma->cursorvisible && sigma->cursoron);
|
||||
|
||||
if (!(sigma->sigmamode & MODE_NOBLINK)) {
|
||||
cols[1] = (attr & 15) | 16;
|
||||
@@ -499,24 +499,24 @@ sigma_text40(sigma_t *sigma)
|
||||
|
||||
if (drawcursor) {
|
||||
for (uint8_t c = 0; c < 8; c++) {
|
||||
buffer32->line[sigma->displine][(x << 4) + 2 * c + 8] = buffer32->line[sigma->displine][(x << 4) + 2 * c + 9] = cols[(fontdatm[chr][sigma->sc & 15] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xf;
|
||||
buffer32->line[sigma->displine][(x << 4) + 2 * c + 8] = buffer32->line[sigma->displine][(x << 4) + 2 * c + 9] = cols[(fontdatm[chr][sigma->scanline & 15] & (1 << (c ^ 7))) ? 1 : 0] ^ 0xf;
|
||||
}
|
||||
} else {
|
||||
for (uint8_t c = 0; c < 8; c++) {
|
||||
buffer32->line[sigma->displine][(x << 4) + 2 * c + 8] = buffer32->line[sigma->displine][(x << 4) + 2 * c + 9] = cols[(fontdatm[chr][sigma->sc & 15] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
buffer32->line[sigma->displine][(x << 4) + 2 * c + 8] = buffer32->line[sigma->displine][(x << 4) + 2 * c + 9] = cols[(fontdatm[chr][sigma->scanline & 15] & (1 << (c ^ 7))) ? 1 : 0];
|
||||
}
|
||||
}
|
||||
ma++;
|
||||
memaddr++;
|
||||
}
|
||||
|
||||
sigma->ma += sigma->crtc[1];
|
||||
sigma->memaddr += sigma->crtc[1];
|
||||
}
|
||||
|
||||
/* Draw a line in the 640x400 graphics mode */
|
||||
static void
|
||||
sigma_gfx400(sigma_t *sigma)
|
||||
{
|
||||
const uint8_t *vram = &sigma->vram[((sigma->ma << 1) & 0x1FFF) + (sigma->sc & 3) * 0x2000];
|
||||
const uint8_t *vram = &sigma->vram[((sigma->memaddr << 1) & 0x1FFF) + (sigma->scanline & 3) * 0x2000];
|
||||
uint8_t plane[4];
|
||||
uint8_t col;
|
||||
|
||||
@@ -532,7 +532,7 @@ sigma_gfx400(sigma_t *sigma)
|
||||
buffer32->line[sigma->displine][(x << 3) + c + 8] = col;
|
||||
}
|
||||
if (x & 1)
|
||||
++sigma->ma;
|
||||
++sigma->memaddr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -544,7 +544,7 @@ sigma_gfx400(sigma_t *sigma)
|
||||
static void
|
||||
sigma_gfx200(sigma_t *sigma)
|
||||
{
|
||||
const uint8_t *vram = &sigma->vram[((sigma->ma << 1) & 0x1FFF) + (sigma->sc & 2) * 0x1000];
|
||||
const uint8_t *vram = &sigma->vram[((sigma->memaddr << 1) & 0x1FFF) + (sigma->scanline & 2) * 0x1000];
|
||||
uint8_t plane[4];
|
||||
uint8_t col;
|
||||
|
||||
@@ -561,7 +561,7 @@ sigma_gfx200(sigma_t *sigma)
|
||||
}
|
||||
|
||||
if (x & 1)
|
||||
++sigma->ma;
|
||||
++sigma->memaddr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -569,7 +569,7 @@ sigma_gfx200(sigma_t *sigma)
|
||||
static void
|
||||
sigma_gfx4col(sigma_t *sigma)
|
||||
{
|
||||
const uint8_t *vram = &sigma->vram[((sigma->ma << 1) & 0x1FFF) + (sigma->sc & 2) * 0x1000];
|
||||
const uint8_t *vram = &sigma->vram[((sigma->memaddr << 1) & 0x1FFF) + (sigma->scanline & 2) * 0x1000];
|
||||
uint8_t plane[4];
|
||||
uint8_t mask;
|
||||
uint8_t col;
|
||||
@@ -592,7 +592,7 @@ sigma_gfx4col(sigma_t *sigma)
|
||||
}
|
||||
|
||||
if (x & 1)
|
||||
++sigma->ma;
|
||||
++sigma->memaddr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,15 +604,15 @@ sigma_poll(void *priv)
|
||||
int c;
|
||||
int oldvc;
|
||||
uint32_t cols[4];
|
||||
int oldsc;
|
||||
int scanline_old;
|
||||
|
||||
if (!sigma->linepos) {
|
||||
timer_advance_u64(&sigma->timer, sigma->dispofftime);
|
||||
sigma->sigmastat |= STATUS_RETR_H;
|
||||
sigma->linepos = 1;
|
||||
oldsc = sigma->sc;
|
||||
scanline_old = sigma->scanline;
|
||||
if ((sigma->crtc[8] & 3) == 3)
|
||||
sigma->sc = ((sigma->sc << 1) + sigma->oddeven) & 7;
|
||||
sigma->scanline = ((sigma->scanline << 1) + sigma->oddeven) & 7;
|
||||
if (sigma->cgadispon) {
|
||||
if (sigma->displine < sigma->firstline) {
|
||||
sigma->firstline = sigma->displine;
|
||||
@@ -660,8 +660,8 @@ sigma_poll(void *priv)
|
||||
|
||||
video_process_8(x, sigma->displine);
|
||||
|
||||
sigma->sc = oldsc;
|
||||
if (sigma->vc == sigma->crtc[7] && !sigma->sc)
|
||||
sigma->scanline = scanline_old;
|
||||
if (sigma->vc == sigma->crtc[7] && !sigma->scanline)
|
||||
sigma->sigmastat |= STATUS_RETR_V;
|
||||
sigma->displine++;
|
||||
if (sigma->displine >= 560)
|
||||
@@ -674,24 +674,24 @@ sigma_poll(void *priv)
|
||||
if (!sigma->vsynctime)
|
||||
sigma->sigmastat &= ~STATUS_RETR_V;
|
||||
}
|
||||
if (sigma->sc == (sigma->crtc[11] & 31) || ((sigma->crtc[8] & 3) == 3 && sigma->sc == ((sigma->crtc[11] & 31) >> 1))) {
|
||||
if (sigma->scanline == (sigma->crtc[11] & 31) || ((sigma->crtc[8] & 3) == 3 && sigma->scanline == ((sigma->crtc[11] & 31) >> 1))) {
|
||||
sigma->cursorvisible = 0;
|
||||
}
|
||||
if ((sigma->crtc[8] & 3) == 3 && sigma->sc == (sigma->crtc[9] >> 1))
|
||||
sigma->maback = sigma->ma;
|
||||
if ((sigma->crtc[8] & 3) == 3 && sigma->scanline == (sigma->crtc[9] >> 1))
|
||||
sigma->memaddr_backup = sigma->memaddr;
|
||||
if (sigma->vadj) {
|
||||
sigma->sc++;
|
||||
sigma->sc &= 31;
|
||||
sigma->ma = sigma->maback;
|
||||
sigma->scanline++;
|
||||
sigma->scanline &= 31;
|
||||
sigma->memaddr = sigma->memaddr_backup;
|
||||
sigma->vadj--;
|
||||
if (!sigma->vadj) {
|
||||
sigma->cgadispon = 1;
|
||||
sigma->ma = sigma->maback = (sigma->crtc[13] | (sigma->crtc[12] << 8)) & 0x3fff;
|
||||
sigma->sc = 0;
|
||||
sigma->memaddr = sigma->memaddr_backup = (sigma->crtc[13] | (sigma->crtc[12] << 8)) & 0x3fff;
|
||||
sigma->scanline = 0;
|
||||
}
|
||||
} else if (sigma->sc == sigma->crtc[9]) {
|
||||
sigma->maback = sigma->ma;
|
||||
sigma->sc = 0;
|
||||
} else if (sigma->scanline == sigma->crtc[9]) {
|
||||
sigma->memaddr_backup = sigma->memaddr;
|
||||
sigma->scanline = 0;
|
||||
oldvc = sigma->vc;
|
||||
sigma->vc++;
|
||||
sigma->vc &= 127;
|
||||
@@ -705,7 +705,7 @@ sigma_poll(void *priv)
|
||||
if (!sigma->vadj)
|
||||
sigma->cgadispon = 1;
|
||||
if (!sigma->vadj)
|
||||
sigma->ma = sigma->maback = (sigma->crtc[13] | (sigma->crtc[12] << 8)) & 0x3fff;
|
||||
sigma->memaddr = sigma->memaddr_backup = (sigma->crtc[13] | (sigma->crtc[12] << 8)) & 0x3fff;
|
||||
if ((sigma->crtc[10] & 0x60) == 0x20)
|
||||
sigma->cursoron = 0;
|
||||
else
|
||||
@@ -768,13 +768,13 @@ sigma_poll(void *priv)
|
||||
sigma->oddeven ^= 1;
|
||||
}
|
||||
} else {
|
||||
sigma->sc++;
|
||||
sigma->sc &= 31;
|
||||
sigma->ma = sigma->maback;
|
||||
sigma->scanline++;
|
||||
sigma->scanline &= 31;
|
||||
sigma->memaddr = sigma->memaddr_backup;
|
||||
}
|
||||
if (sigma->cgadispon)
|
||||
sigma->sigmastat &= ~STATUS_RETR_H;
|
||||
if (sigma->sc == (sigma->crtc[10] & 31) || ((sigma->crtc[8] & 3) == 3 && sigma->sc == ((sigma->crtc[10] & 31) >> 1)))
|
||||
if (sigma->scanline == (sigma->crtc[10] & 31) || ((sigma->crtc[8] & 3) == 3 && sigma->scanline == ((sigma->crtc[10] & 31) >> 1)))
|
||||
sigma->cursorvisible = 1;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user