--- np2/lio/lio.c 2003/10/21 11:22:05 1.2 +++ np2/lio/lio.c 2004/02/21 04:48:35 1.9 @@ -1,256 +1,279 @@ #include "compiler.h" -#include "i286.h" -#include "memory.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" - LIO_TABLE lio; +static _LIOWORK liowork; -void lio_init(void) { +void lio_initialize(void) { UINT i; mem[0xf9900] = 0x11; for (i=0; i<0x11; i++) { mem[0xf9904 + i*4] = 0xa0 + i; - SETBIOSMEM16(0xf9906 + i*4, 0x100 + i*2); - SETBIOSMEM16(0xf9a00 + i*2, 0xcf90); + mem[0xf9905 + i*4] = 0x00; + SETBIOSMEM16(0xf9906 + i*4, 0x100 + i*4); + SETBIOSMEM32(0xf9a00 + i*4, 0xcf90fb90); } mem[0xf9944] = 0xce; - ZeroMemory(&lio, sizeof(lio)); } -void bios_lio(BYTE cmd) { +void bios_lio(REG8 cmd) { - UINT i; + LIOWORK lio; + UINT8 ret; -// TRACE_("lio", cmd); +// TRACEOUT(("lio command %.2x", cmd)); + lio = &liowork; + lio->wait = 500; switch(cmd) { case 0x00: // a0: GINIT - // GDCバッファを空に - if (gdc.s.cnt) { - gdc_work(GDCWORK_SLAVE); - } - gdc_forceready(&gdc.s); - - ZeroMemory(&gdc.s.para[GDC_SCROLL], 8); - gdc.mode1 |= 0x10; - gdc.s.para[GDC_CSRFORM] = 1; - screenupdate |= 2; - gdcs.access = gdcs.disp = 0; - vramop.operate &= VOP_ACCESSMASK; - i286_vram_dispatch(vramop.operate); - iocore_out8(0x006a, 0); - gdcs.grphdisp |= GDCSCRN_ENABLE; - gdc_paletteinit(); - - lio.scrn.top = 0; - lio.scrn.lines = 200; - lio.scrn.bank = 0; - lio.scrn.plane = 0x80; - - lio.gcolor1.palmax = 8; - lio.gcolor1.bgcolor = 0; - lio.gcolor1.bdcolor = 0; - lio.gcolor1.fgcolor = 7; - lio.gcolor1.palmode = 0; - - lio.gview.x1 = 0; - lio.gview.y1 = 0; - lio.gview.x2 = 639; - lio.gview.y2 = 399; - lio_makeviewmask(); - - for (i=0; i<8; i++) { - lio.degcol[i] = i; - } - I286_AH = 0; + ret = lio_ginit(lio); break; case 0x01: // a1: GSCREEN - I286_AH = lio_gscreen(); + ret = lio_gscreen(lio); break; case 0x02: // a2: GVIEW - I286_AH = lio_gview(); + ret = lio_gview(lio); break; case 0x03: // a3: GCOLOR1 - I286_AH = lio_gcolor1(); + ret = lio_gcolor1(lio); break; case 0x04: // a4: GCOLOR2 - I286_AH = lio_gcolor2(); + ret = lio_gcolor2(lio); break; case 0x05: // a5: GCLS - I286_AH = lio_gcls(); + ret = lio_gcls(lio); break; case 0x06: // a6: GPSET - I286_AH = lio_gpset(); + ret = lio_gpset(lio); break; case 0x07: // a7: GLINE - I286_AH = lio_gline(); + ret = lio_gline(lio); break; - case 0x08: // a8: GCIRCLE - break; +// case 0x08: // a8: GCIRCLE +// break; - case 0x09: // a9: GPAINT1 - break; +// case 0x09: // a9: GPAINT1 +// break; - case 0x0a: // aa: GPAINT2 - break; +// case 0x0a: // aa: GPAINT2 +// break; case 0x0b: // ab: GGET + ret = lio_gget(lio); break; case 0x0c: // ac: GPUT1 - I286_AH = lio_gput1(); + ret = lio_gput1(lio); break; case 0x0d: // ad: GPUT2 + ret = lio_gput2(lio); break; - case 0x0e: // ae: GROLL - break; +// case 0x0e: // ae: GROLL +// break; case 0x0f: // af: GPOINT2 + ret = lio_gpoint2(lio); break; - case 0x10: // ce: GCOPY +// case 0x10: // ce: GCOPY +// break; + + default: + ret = LIO_SUCCESS; break; } - // TRACEOUT(("lio cmd-%d, %d", cmd, I286_AH)); + CPU_AH = ret; + gdcsub_setslavewait(lio->wait); } // ---- -static const UINT32 planeadrs[4] = {0xa8000, 0xb0000, 0xb8000, 0xe0000}; -static const BYTE bit_l[8] = {0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01}; -static const BYTE bit_r[8] = {0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe}; +const UINT32 lioplaneadrs[4] = {VRAM_B, VRAM_R, VRAM_G, VRAM_E}; + +void lio_updatedraw(LIOWORK 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->mem.scrnmode) { + case 0: + if (lio->mem.pos & 1) { + flag |= LIODRAW_UPPER; + } + maxline = 199; + break; + + case 1: + flag |= lio->mem.pos % colorbit; + flag |= LIODRAW_MONO; + if (lio->mem.pos >= colorbit) { + flag |= LIODRAW_UPPER; + } + maxline = 199; + break; + + case 2: + flag |= lio->mem.pos % colorbit; + flag |= LIODRAW_MONO; + break; + } + lio->draw.flag = flag; + lio->draw.palmax = 1 << colorbit; + + tmp = (SINT16)LOADINTELWORD(lio->mem.viewx1); + lio->draw.x1 = max(tmp, 0); + tmp = (SINT16)LOADINTELWORD(lio->mem.viewy1); + lio->draw.y1 = max(tmp, 0); + tmp = (SINT16)LOADINTELWORD(lio->mem.viewx2); + lio->draw.x2 = min(tmp, 639); + tmp = (SINT16)LOADINTELWORD(lio->mem.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(UINT32 vadrs, BYTE bit, BYTE pal) { - if (lio.scrn.plane & 0x80) { +// ---- + +static void pixed8(const _LIOWORK *lio, UINT addr, REG8 bit, REG8 pal) { + + BYTE *ptr; + + addr = LOW15(addr); + vramupdate[addr] |= lio->draw.sbit; + ptr = mem + lio->draw.base + addr; + if (!(lio->draw.flag & LIODRAW_MONO)) { if (pal & 1) { - mem[vadrs+0xa8000] |= bit; + ptr[VRAM_B] |= bit; } else { - mem[vadrs+0xa8000] &= ~bit; + ptr[VRAM_B] &= ~bit; } if (pal & 2) { - mem[vadrs+0xb0000] |= bit; + ptr[VRAM_R] |= bit; } else { - mem[vadrs+0xb0000] &= ~bit; + ptr[VRAM_R] &= ~bit; } if (pal & 4) { - mem[vadrs+0xb8000] |= bit; + ptr[VRAM_G] |= bit; } else { - mem[vadrs+0xb8000] &= ~bit; - } - if (pal & 8) { - mem[vadrs+0xe0000] |= bit; + ptr[VRAM_G] &= ~bit; } - else { - mem[vadrs+0xe0000] &= ~bit; + if (lio->palmode == 2) { + if (pal & 8) { + ptr[VRAM_E] |= bit; + } + else { + ptr[VRAM_E] &= ~bit; + } } } else { - vadrs += planeadrs[lio.scrn.plane & 3]; + ptr += lioplaneadrs[lio->draw.flag & LIODRAW_PMASK]; if (pal) { - mem[vadrs] |= bit; + *ptr |= bit; } else { - mem[vadrs] &= ~bit; + *ptr &= ~bit; } } } -void lio_pset(SINT16 x, SINT16 y, BYTE pal) { +void lio_pset(const _LIOWORK *lio, SINT16 x, SINT16 y, REG8 pal) { - UINT32 adrs; + UINT addr; BYTE bit; - if ((lio.x1 > x) || (lio.x2 < x) || (lio.y1 > y) || (lio.y2 < y)) { + if ((lio->draw.x1 > x) || (lio->draw.x2 < x) || + (lio->draw.y1 > y) || (lio->draw.y2 < y)) { return; } - adrs = (y * 80) + (x >> 3); + addr = (y * 80) + (x >> 3); bit = 0x80 >> (x & 7); - if (lio.scrn.top) { - adrs += 16000; - } - if (!lio.scrn.bank) { - vramupdate[adrs] |= 1; - gdcs.grphdisp |= 1; - } - else { - vramupdate[adrs] |= 2; - gdcs.grphdisp |= 2; - adrs += 0x200000; + if (lio->draw.flag & LIODRAW_UPPER) { + addr += 16000; } - pixed8(adrs, bit, pal); + gdcs.grphdisp |= lio->draw.sbit; + pixed8(lio, addr, bit, pal); } -void lio_line(SINT16 x1, SINT16 x2, SINT16 y, BYTE pal) { +void lio_line(const _LIOWORK *lio, SINT16 x1, SINT16 x2, SINT16 y, REG8 pal) { - UINT adrs; - UINT32 vadrs; - BYTE bit, dbit, sbit; + UINT addr; + BYTE bit, dbit; SINT16 width; - if ((lio.y1 > y) || (lio.y2 < y)) { + if ((lio->draw.y1 > y) || (lio->draw.y2 < y)) { return; } - if (lio.x1 > x1) { - x1 = lio.x1; + if (lio->draw.x1 > x1) { + x1 = lio->draw.x1; } - if (lio.x2 < x2) { - x2 = lio.x2; + if (lio->draw.x2 < x2) { + x2 = lio->draw.x2; } width = x2 - x1 + 1; if (width <= 0) { return; } - adrs = (y * 80) + (x1 >> 3); + addr = (y * 80) + (x1 >> 3); bit = 0x80 >> (x1 & 7); - if (lio.scrn.top) { - adrs += 16000; + if (lio->draw.flag & LIODRAW_UPPER) { + addr += 16000; } - if (!lio.scrn.bank) { - vadrs = adrs; - sbit = 1; - gdcs.grphdisp |= 1; - } - else { - vadrs = adrs + 0x200000; - sbit = 2; - gdcs.grphdisp |= 2; - } - + gdcs.grphdisp |= lio->draw.sbit; dbit = 0; while(bit && width--) { dbit |= bit; bit >>= 1; } - pixed8(vadrs++, dbit, pal); - vramupdate[adrs++] |= sbit; + pixed8(lio, addr, dbit, pal); + addr++; while(width >= 8) { width -= 8; - pixed8(vadrs++, 0xff, pal); - vramupdate[adrs++] |= sbit; + pixed8(lio, addr, 0xff, pal); + addr++; } dbit = 0; bit = 0x80; @@ -259,8 +282,32 @@ void lio_line(SINT16 x1, SINT16 x2, SINT bit >>= 1; } if (dbit) { - pixed8(vadrs, dbit, pal); - vramupdate[adrs] |= sbit; + pixed8(lio, addr, dbit, pal); + } +} + + +void lio_look(UINT vect) { + + BYTE work[16]; + + TRACEOUT(("lio command %.2x [%.4x:%.4x]", vect, CPU_CS, CPU_IP)); + if (vect == 0xa7) { + i286_memstr_read(CPU_DS, CPU_BX, work, 16); + TRACEOUT(("LINE %d %d %d %d - %d %d / %d : %.2x %.2x", + LOADINTELWORD(work), + LOADINTELWORD(work+2), + LOADINTELWORD(work+4), + LOADINTELWORD(work+6), + work[8], work[9], work[10], work[11], work[12])); + } + else if (vect == 0xad) { + i286_memstr_read(CPU_DS, CPU_BX, work, 16); + TRACEOUT(("GPUT2 x=%d / y=%d / chr=%.4x / %d / %d %d %d", + LOADINTELWORD(work), + LOADINTELWORD(work+2), + LOADINTELWORD(work+4), + work[6], work[7], work[8], work[9])); } }