#include "compiler.h"
#include "cpucore.h"
#include "pccore.h"
#include "iocore.h"
#include "gdc_sub.h"
#include "bios.h"
#include "biosmem.h"
#include "vram.h"
#include "lio.h"
#include "lio.res"
void lio_initialize(void) {
CopyMemory(mem + (LIO_SEGMENT << 4), liorom, sizeof(liorom));
}
void bios_lio(REG8 cmd) {
_GLIO lio;
UINT8 ret;
// TRACEOUT(("lio command %.2x", cmd));
MEMR_READS(CPU_DS, 0x0620, &lio.work, sizeof(lio.work));
lio.palmode = MEMR_READ8(CPU_DS, 0x0a08);
lio.wait = 0;
switch(cmd) {
case 0x00: // a0: GINIT
ret = lio_ginit(&lio);
break;
case 0x01: // a1: GSCREEN
ret = lio_gscreen(&lio);
break;
case 0x02: // a2: GVIEW
ret = lio_gview(&lio);
break;
case 0x03: // a3: GCOLOR1
ret = lio_gcolor1(&lio);
break;
case 0x04: // a4: GCOLOR2
ret = lio_gcolor2(&lio);
break;
case 0x05: // a5: GCLS
ret = lio_gcls(&lio);
break;
case 0x06: // a6: GPSET
ret = lio_gpset(&lio);
break;
case 0x07: // a7: GLINE
ret = lio_gline(&lio);
break;
case 0x08: // a8: GCIRCLE
ret = lio_gcircle(&lio);
break;
// case 0x09: // a9: GPAINT1
// break;
// case 0x0a: // aa: GPAINT2
// break;
case 0x0b: // ab: GGET
ret = lio_gget(&lio);
break;
case 0x0c: // ac: GPUT1
ret = lio_gput1(&lio);
break;
case 0x0d: // ad: GPUT2
ret = lio_gput2(&lio);
break;
// case 0x0e: // ae: GROLL
// break;
case 0x0f: // af: GPOINT2
ret = lio_gpoint2(&lio);
break;
// case 0x10: // ce: GCOPY
// break;
default:
ret = LIO_SUCCESS;
break;
}
CPU_AH = ret;
if (lio.wait) {
gdcsub_setslavewait(lio.wait);
}
}
// ----
const UINT32 lioplaneadrs[4] = {VRAM_B, VRAM_R, VRAM_G, VRAM_E};
void lio_updatedraw(GLIO lio) {
UINT8 flag;
UINT8 colorbit;
SINT16 maxline;
SINT16 tmp;
flag = 0;
colorbit = 3;
maxline = 399;
if (lio->palmode == 2) {
flag |= LIODRAW_4BPP;
colorbit = 4;
}
switch(lio->work.scrnmode) {
case 0:
if (lio->work.pos & 1) {
flag |= LIODRAW_UPPER;
}
maxline = 199;
break;
case 1:
flag |= lio->work.pos % colorbit;
flag |= LIODRAW_MONO;
if (lio->work.pos >= colorbit) {
flag |= LIODRAW_UPPER;
}
maxline = 199;
break;
case 2:
flag |= lio->work.pos % colorbit;
flag |= LIODRAW_MONO;
break;
}
lio->draw.flag = flag;
lio->draw.palmax = 1 << colorbit;
tmp = (SINT16)LOADINTELWORD(lio->work.viewx1);
lio->draw.x1 = max(tmp, 0);
tmp = (SINT16)LOADINTELWORD(lio->work.viewy1);
lio->draw.y1 = max(tmp, 0);
tmp = (SINT16)LOADINTELWORD(lio->work.viewx2);
lio->draw.x2 = min(tmp, 639);
tmp = (SINT16)LOADINTELWORD(lio->work.viewy2);
lio->draw.y2 = min(tmp, maxline);
if (!gdcs.access) {
lio->draw.base = 0;
lio->draw.bank = 0;
lio->draw.sbit = 0x01;
}
else {
lio->draw.base = VRAM_STEP;
lio->draw.bank = 1;
lio->draw.sbit = 0x02;
}
}
// ----
static void pixed8(const _GLIO *lio, UINT addr, REG8 bit, REG8 pal) {
UINT8 *ptr;
addr = LOW15(addr);
vramupdate[addr] |= lio->draw.sbit;
ptr = mem + lio->draw.base + addr;
if (!(lio->draw.flag & LIODRAW_MONO)) {
if (pal & 1) {
ptr[VRAM_B] |= bit;
}
else {
ptr[VRAM_B] &= ~bit;
}
if (pal & 2) {
ptr[VRAM_R] |= bit;
}
else {
ptr[VRAM_R] &= ~bit;
}
if (pal & 4) {
ptr[VRAM_G] |= bit;
}
else {
ptr[VRAM_G] &= ~bit;
}
if (lio->draw.flag & LIODRAW_4BPP) {
if (pal & 8) {
ptr[VRAM_E] |= bit;
}
else {
ptr[VRAM_E] &= ~bit;
}
}
}
else {
ptr += lioplaneadrs[lio->draw.flag & LIODRAW_PMASK];
if (pal) {
*ptr |= bit;
}
else {
*ptr &= ~bit;
}
}
}
void lio_pset(const _GLIO *lio, SINT16 x, SINT16 y, REG8 pal) {
UINT addr;
UINT8 bit;
if ((lio->draw.x1 > x) || (lio->draw.x2 < x) ||
(lio->draw.y1 > y) || (lio->draw.y2 < y)) {
return;
}
addr = (y * 80) + (x >> 3);
bit = 0x80 >> (x & 7);
if (lio->draw.flag & LIODRAW_UPPER) {
addr += 16000;
}
gdcs.grphdisp |= lio->draw.sbit;
pixed8(lio, addr, bit, pal);
}
#if 0
void lio_line(const _GLIO *lio, SINT16 x1, SINT16 x2, SINT16 y, REG8 pal) {
UINT addr;
UINT8 bit, dbit;
SINT16 width;
if ((lio->draw.y1 > y) || (lio->draw.y2 < y)) {
return;
}
if (lio->draw.x1 > x1) {
x1 = lio->draw.x1;
}
if (lio->draw.x2 < x2) {
x2 = lio->draw.x2;
}
width = x2 - x1 + 1;
if (width <= 0) {
return;
}
addr = (y * 80) + (x1 >> 3);
bit = 0x80 >> (x1 & 7);
if (lio->draw.flag & LIODRAW_UPPER) {
addr += 16000;
}
gdcs.grphdisp |= lio->draw.sbit;
dbit = 0;
while((bit) && (width)) {
dbit |= bit;
bit >>= 1;
width--;
}
pixed8(lio, addr, dbit, pal);
addr++;
while(width >= 8) {
width -= 8;
pixed8(lio, addr, 0xff, pal);
addr++;
}
dbit = 0;
bit = 0x80;
while((bit) && (width)) {
dbit |= bit;
bit >>= 1;
width--;
}
if (dbit) {
pixed8(lio, addr, dbit, pal);
}
}
#endif
RetroPC.NET-CVS <cvs@retropc.net>