|
|
| version 1.10, 2004/02/21 06:26:34 | version 1.21, 2005/05/20 13:59:47 |
|---|---|
| Line 7 | Line 7 |
| #include "biosmem.h" | #include "biosmem.h" |
| #include "vram.h" | #include "vram.h" |
| #include "lio.h" | #include "lio.h" |
| #include "lio.res" | |
| void lio_initialize(void) { | void lio_initialize(void) { |
| UINT i; | CopyMemory(mem + (LIO_SEGMENT << 4), liorom, sizeof(liorom)); |
| mem[0xf9900] = 0x11; | |
| for (i=0; i<0x11; i++) { | |
| mem[0xf9904 + i*4] = 0xa0 + i; | |
| mem[0xf9905 + i*4] = 0x00; | |
| SETBIOSMEM16(0xf9906 + i*4, 0x100 + i*4); | |
| SETBIOSMEM32(0xf9a00 + i*4, 0xcf90fb90); | |
| } | |
| mem[0xf9944] = 0xce; | |
| } | } |
| void bios_lio(REG8 cmd) { | void bios_lio(REG8 cmd) { |
| _LIOWORK lio; | _GLIO lio; |
| UINT8 ret; | UINT8 ret; |
| // TRACEOUT(("lio command %.2x", cmd)); | // TRACEOUT(("lio command %.2x", cmd)); |
| i286_memstr_read(CPU_DS, 0x0620, &lio.mem, sizeof(lio.mem)); | MEMR_READS(CPU_DS, 0x0620, &lio.work, sizeof(lio.work)); |
| lio.palmode = i286_membyte_read(CPU_DS, 0x0a08); | lio.palmode = MEMR_READ8(CPU_DS, 0x0a08); |
| lio.wait = 500; | lio.wait = 0; |
| switch(cmd) { | switch(cmd) { |
| case 0x00: // a0: GINIT | case 0x00: // a0: GINIT |
| ret = lio_ginit(&lio); | ret = lio_ginit(&lio); |
| Line 65 void bios_lio(REG8 cmd) { | Line 57 void bios_lio(REG8 cmd) { |
| ret = lio_gline(&lio); | ret = lio_gline(&lio); |
| break; | break; |
| // case 0x08: // a8: GCIRCLE | case 0x08: // a8: GCIRCLE |
| // break; | ret = lio_gcircle(&lio); |
| break; | |
| // case 0x09: // a9: GPAINT1 | // case 0x09: // a9: GPAINT1 |
| // break; | // break; |
| Line 101 void bios_lio(REG8 cmd) { | Line 94 void bios_lio(REG8 cmd) { |
| break; | break; |
| } | } |
| CPU_AH = ret; | CPU_AH = ret; |
| gdcsub_setslavewait(lio.wait); | if (lio.wait) { |
| gdcsub_setslavewait(lio.wait); | |
| } | |
| } | } |
| Line 109 void bios_lio(REG8 cmd) { | Line 104 void bios_lio(REG8 cmd) { |
| const UINT32 lioplaneadrs[4] = {VRAM_B, VRAM_R, VRAM_G, VRAM_E}; | const UINT32 lioplaneadrs[4] = {VRAM_B, VRAM_R, VRAM_G, VRAM_E}; |
| void lio_updatedraw(LIOWORK lio) { | void lio_updatedraw(GLIO lio) { |
| UINT8 flag; | UINT8 flag; |
| UINT8 colorbit; | UINT8 colorbit; |
| Line 123 void lio_updatedraw(LIOWORK lio) { | Line 118 void lio_updatedraw(LIOWORK lio) { |
| flag |= LIODRAW_4BPP; | flag |= LIODRAW_4BPP; |
| colorbit = 4; | colorbit = 4; |
| } | } |
| switch(lio->mem.scrnmode) { | switch(lio->work.scrnmode) { |
| case 0: | case 0: |
| if (lio->mem.pos & 1) { | if (lio->work.pos & 1) { |
| flag |= LIODRAW_UPPER; | flag |= LIODRAW_UPPER; |
| } | } |
| maxline = 199; | maxline = 199; |
| break; | break; |
| case 1: | case 1: |
| flag |= lio->mem.pos % colorbit; | flag |= lio->work.pos % colorbit; |
| flag |= LIODRAW_MONO; | flag |= LIODRAW_MONO; |
| if (lio->mem.pos >= colorbit) { | if (lio->work.pos >= colorbit) { |
| flag |= LIODRAW_UPPER; | flag |= LIODRAW_UPPER; |
| } | } |
| maxline = 199; | maxline = 199; |
| break; | break; |
| case 2: | case 2: |
| flag |= lio->mem.pos % colorbit; | flag |= lio->work.pos % colorbit; |
| flag |= LIODRAW_MONO; | flag |= LIODRAW_MONO; |
| break; | break; |
| } | } |
| lio->draw.flag = flag; | lio->draw.flag = flag; |
| lio->draw.palmax = 1 << colorbit; | lio->draw.palmax = 1 << colorbit; |
| tmp = (SINT16)LOADINTELWORD(lio->mem.viewx1); | tmp = (SINT16)LOADINTELWORD(lio->work.viewx1); |
| lio->draw.x1 = max(tmp, 0); | lio->draw.x1 = max(tmp, 0); |
| tmp = (SINT16)LOADINTELWORD(lio->mem.viewy1); | tmp = (SINT16)LOADINTELWORD(lio->work.viewy1); |
| lio->draw.y1 = max(tmp, 0); | lio->draw.y1 = max(tmp, 0); |
| tmp = (SINT16)LOADINTELWORD(lio->mem.viewx2); | tmp = (SINT16)LOADINTELWORD(lio->work.viewx2); |
| lio->draw.x2 = min(tmp, 639); | lio->draw.x2 = min(tmp, 639); |
| tmp = (SINT16)LOADINTELWORD(lio->mem.viewy2); | tmp = (SINT16)LOADINTELWORD(lio->work.viewy2); |
| lio->draw.y2 = min(tmp, maxline); | lio->draw.y2 = min(tmp, maxline); |
| if (!gdcs.access) { | if (!gdcs.access) { |
| lio->draw.base = 0; | lio->draw.base = 0; |
| Line 171 void lio_updatedraw(LIOWORK lio) { | Line 166 void lio_updatedraw(LIOWORK lio) { |
| // ---- | // ---- |
| static void pixed8(const _LIOWORK *lio, UINT addr, REG8 bit, REG8 pal) { | static void pixed8(const _GLIO *lio, UINT addr, REG8 bit, REG8 pal) { |
| BYTE *ptr; | UINT8 *ptr; |
| addr = LOW15(addr); | addr = LOW15(addr); |
| vramupdate[addr] |= lio->draw.sbit; | vramupdate[addr] |= lio->draw.sbit; |
| Line 217 static void pixed8(const _LIOWORK *lio, | Line 212 static void pixed8(const _LIOWORK *lio, |
| } | } |
| } | } |
| void lio_pset(const _LIOWORK *lio, SINT16 x, SINT16 y, REG8 pal) { | void lio_pset(const _GLIO *lio, SINT16 x, SINT16 y, REG8 pal) { |
| UINT addr; | UINT addr; |
| BYTE bit; | UINT8 bit; |
| if ((lio->draw.x1 > x) || (lio->draw.x2 < x) || | if ((lio->draw.x1 > x) || (lio->draw.x2 < x) || |
| (lio->draw.y1 > y) || (lio->draw.y2 < y)) { | (lio->draw.y1 > y) || (lio->draw.y2 < y)) { |
| Line 235 void lio_pset(const _LIOWORK *lio, SINT1 | Line 230 void lio_pset(const _LIOWORK *lio, SINT1 |
| pixed8(lio, addr, bit, pal); | pixed8(lio, addr, bit, pal); |
| } | } |
| void lio_line(const _LIOWORK *lio, SINT16 x1, SINT16 x2, SINT16 y, REG8 pal) { | #if 0 |
| void lio_line(const _GLIO *lio, SINT16 x1, SINT16 x2, SINT16 y, REG8 pal) { | |
| UINT addr; | UINT addr; |
| BYTE bit, dbit; | UINT8 bit, dbit; |
| SINT16 width; | SINT16 width; |
| if ((lio->draw.y1 > y) || (lio->draw.y2 < y)) { | if ((lio->draw.y1 > y) || (lio->draw.y2 < y)) { |
| Line 261 void lio_line(const _LIOWORK *lio, SINT1 | Line 257 void lio_line(const _LIOWORK *lio, SINT1 |
| } | } |
| gdcs.grphdisp |= lio->draw.sbit; | gdcs.grphdisp |= lio->draw.sbit; |
| dbit = 0; | dbit = 0; |
| while(bit && width--) { | while((bit) && (width)) { |
| dbit |= bit; | dbit |= bit; |
| bit >>= 1; | bit >>= 1; |
| width--; | |
| } | } |
| pixed8(lio, addr, dbit, pal); | pixed8(lio, addr, dbit, pal); |
| addr++; | addr++; |
| Line 274 void lio_line(const _LIOWORK *lio, SINT1 | Line 271 void lio_line(const _LIOWORK *lio, SINT1 |
| } | } |
| dbit = 0; | dbit = 0; |
| bit = 0x80; | bit = 0x80; |
| while(bit && width--) { | while((bit) && (width)) { |
| dbit |= bit; | dbit |= bit; |
| bit >>= 1; | bit >>= 1; |
| width--; | |
| } | } |
| if (dbit) { | if (dbit) { |
| pixed8(lio, addr, dbit, pal); | pixed8(lio, addr, dbit, pal); |
| } | } |
| } | } |
| #endif | |
| 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])); | |
| } | |
| } | |