|
|
| version 1.7, 2003/12/01 10:45:46 | version 1.12, 2004/01/30 14:33:27 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "scrnmng.h" | #include "scrnmng.h" |
| #include "i286.h" | #include "cpucore.h" |
| #include "memory.h" | |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "vram.h" | #include "vram.h" |
| Line 13 | Line 12 |
| #define TURE_SYNC | #define TURE_SYNC |
| static const BYTE defdegpal[4] = {0x04,0x15,0x26,0x37}; | static const UINT8 defdegpal[4] = {0x04,0x15,0x26,0x37}; |
| static const BYTE defsync[8] = {0x10,0x4e,0x07,0x25,0x07,0x07,0x90,0x65}; | static const UINT8 defsync[8] = {0x10,0x4e,0x07,0x25,0x07,0x07,0x90,0x65}; |
| void gdc_setdegitalpal(int color, BYTE value) { | void gdc_setdegitalpal(int color, REG8 value) { |
| if (color & 4) { | if (color & 4) { |
| color &= 3; | color &= 3; |
| Line 39 void gdc_setdegitalpal(int color, BYTE v | Line 38 void gdc_setdegitalpal(int color, BYTE v |
| } | } |
| } | } |
| void gdc_setanalogpal(int color, int rgb, BYTE value) { | void gdc_setanalogpal(int color, int rgb, REG8 value) { |
| BYTE *ptr; | UINT8 *ptr; |
| PAL1EVENT *event; | PAL1EVENT *event; |
| ptr = ((BYTE *)(gdc.anapal + color)) + rgb; | ptr = ((UINT8 *)(gdc.anapal + color)) + rgb; |
| if (((*ptr) ^ value) & 0x0f) { | if (((*ptr) ^ value) & 0x0f) { |
| gdcs.palchange = GDCSCRN_REDRAW; | gdcs.palchange = GDCSCRN_REDRAW; |
| if (palevent.events < PALEVENTMAX) { | if (palevent.events < PALEVENTMAX) { |
| if (!gdc.vsync) { | if (!gdc.vsync) { |
| event = palevent.event + palevent.events; | event = palevent.event + palevent.events; |
| event->clock = nevent.item[NEVENT_FLAMES].clock - | event->clock = nevent.item[NEVENT_FLAMES].clock - |
| (I286_BASECLOCK - I286_REMCLOCK); | (CPU_BASECLOCK - CPU_REMCLOCK); |
| event->color = (color * sizeof(RGB32)) + rgb; | event->color = (color * sizeof(RGB32)) + rgb; |
| event->value = value; | event->value = (UINT8)value; |
| palevent.events++; | palevent.events++; |
| } | } |
| else { | else { |
| Line 64 void gdc_setanalogpal(int color, int rgb | Line 63 void gdc_setanalogpal(int color, int rgb |
| *ptr = value; | *ptr = value; |
| } | } |
| void gdc_setdegpalpack(int color, BYTE value) { | void gdc_setdegpalpack(int color, REG8 value) { |
| if ((gdc.degpal[color] ^ value) & 0x77) { | if ((gdc.degpal[color] ^ value) & 0x77) { |
| gdcs.palchange = GDCSCRN_REDRAW; | gdcs.palchange = GDCSCRN_REDRAW; |
| } | } |
| gdc.degpal[color] = value; | gdc.degpal[color] = (UINT8)value; |
| } | } |
| void gdc_paletteinit(void) { | void gdc_paletteinit(void) { |
| BYTE c; | int c; |
| CopyMemory(gdc.degpal, defdegpal, 4); | CopyMemory(gdc.degpal, defdegpal, 4); |
| for (c=0; c<8; c++) { | for (c=0; c<8; c++) { |
| Line 131 static void textdraw(void) { // | Line 130 static void textdraw(void) { // |
| void gdc_work(int id) { | void gdc_work(int id) { |
| UINT16 i; | |
| BYTE data; | |
| GDCDATA item; | GDCDATA item; |
| BYTE *dispflag; | UINT8 *dispflag; |
| UINT i; | |
| BYTE data; | |
| item = ((id==GDCWORK_MASTER)?(&gdc.m):(&gdc.s)); | item = (id==GDCWORK_MASTER)?&gdc.m:&gdc.s; |
| dispflag = ((id==GDCWORK_MASTER)?(&gdcs.textdisp):(&gdcs.grphdisp)); | dispflag = (id==GDCWORK_MASTER)?&gdcs.textdisp:&gdcs.grphdisp; |
| for (i=0; i<item->cnt; i++) { | for (i=0; i<item->cnt; i++) { |
| data = (BYTE)item->fifo[i]; | data = (BYTE)item->fifo[i]; |
| Line 151 void gdc_work(int id) { | Line 150 void gdc_work(int id) { |
| item->rcv = 2; | item->rcv = 2; |
| item->paracb = 1; | item->paracb = 1; |
| break; | break; |
| case 0x10: | case 0x10: |
| case 0x18: | case 0x18: |
| item->rcv = 1; | item->rcv = 1; |
| item->paracb = 1; | item->paracb = 1; |
| break; | break; |
| default: | default: |
| item->rcv = 0; | item->rcv = 0; |
| break; | break; |
| Line 172 void gdc_work(int id) { | Line 173 void gdc_work(int id) { |
| screenupdate |= 2; // ver0.28 | screenupdate |= 2; // ver0.28 |
| break; | break; |
| case CMD_STOP_: | |
| case CMD_STOP: | case CMD_STOP: |
| case CMD_SYNC_OFF: | case CMD_SYNC_OFF: |
| (*dispflag) &= (~GDCSCRN_ENABLE); | (*dispflag) &= (~GDCSCRN_ENABLE); |
| Line 245 void gdc_restorekacmode(void) { | Line 247 void gdc_restorekacmode(void) { |
| // ---- I/O | // ---- I/O |
| static void IOOUTCALL gdc_o60(UINT port, BYTE dat) { | static void IOOUTCALL gdc_o60(UINT port, REG8 dat) { |
| if (gdc.m.cnt < GDCCMD_MAX) { | if (gdc.m.cnt < GDCCMD_MAX) { |
| gdc.m.fifo[gdc.m.cnt++] = dat; | gdc.m.fifo[gdc.m.cnt++] = dat; |
| Line 253 static void IOOUTCALL gdc_o60(UINT port, | Line 255 static void IOOUTCALL gdc_o60(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_o62(UINT port, BYTE dat) { | static void IOOUTCALL gdc_o62(UINT port, REG8 dat) { |
| if (gdc.m.cnt < GDCCMD_MAX) { | if (gdc.m.cnt < GDCCMD_MAX) { |
| gdc.m.fifo[gdc.m.cnt++] = 0x100 | dat; | gdc.m.fifo[gdc.m.cnt++] = 0x100 | dat; |
| Line 262 static void IOOUTCALL gdc_o62(UINT port, | Line 264 static void IOOUTCALL gdc_o62(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_o64(UINT port, BYTE dat) { | static void IOOUTCALL gdc_o64(UINT port, REG8 dat) { |
| gdc.vsyncint = 1; | gdc.vsyncint = 1; |
| (void)port; | (void)port; |
| (void)dat; | (void)dat; |
| } | } |
| static void IOOUTCALL gdc_o68(UINT port, BYTE dat) { | static void IOOUTCALL gdc_o68(UINT port, REG8 dat) { |
| BYTE bit; | REG8 bit; |
| if (!(dat & 0xf0)) { // ver0.28 | if (!(dat & 0xf0)) { // ver0.28 |
| bit = 1 << ((dat >> 1) & 7); | bit = 1 << ((dat >> 1) & 7); |
| Line 299 static void IOOUTCALL gdc_o68(UINT port, | Line 301 static void IOOUTCALL gdc_o68(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_o6a(UINT port, BYTE dat) { | static void IOOUTCALL gdc_o6a(UINT port, REG8 dat) { |
| BYTE bit; | REG8 bit; |
| if (!(dat & 0xf8)) { | if (!(dat & 0xf8)) { |
| bit = (dat >> 1) & 3; | bit = (dat >> 1) & 3; |
| Line 334 static void IOOUTCALL gdc_o6a(UINT port, | Line 336 static void IOOUTCALL gdc_o6a(UINT port, |
| else { | else { |
| switch(dat) { | switch(dat) { |
| case 0x40: | case 0x40: |
| case 0x80: // EPSON? | |
| gdc.display &= ~1; | gdc.display &= ~1; |
| gdcs.textdisp |= GDCSCRN_EXT; | gdcs.textdisp |= GDCSCRN_EXT; |
| break; | break; |
| case 0x41: | case 0x41: |
| case 0x81: // EPSON? | |
| gdc.display |= 1; | gdc.display |= 1; |
| gdcs.textdisp |= GDCSCRN_EXT; | gdcs.textdisp |= GDCSCRN_EXT; |
| break; | break; |
| Line 367 static void IOOUTCALL gdc_o6a(UINT port, | Line 371 static void IOOUTCALL gdc_o6a(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static BYTE IOINPCALL gdc_i60(UINT port) { | static REG8 IOINPCALL gdc_i60(UINT port) { |
| BYTE ret; | REG8 ret; |
| long remain; | SINT32 remain; |
| ret = 0x80 | gdc.vsync; // | m_drawing; | ret = 0x80 | gdc.vsync; // | m_drawing; |
| remain = nevent_getremain(NEVENT_FLAMES); | remain = nevent_getremain(NEVENT_FLAMES); |
| if (remain >= 0) { | if (remain >= 0) { |
| if ((remain % pc.raster) < pc.hsync) { | if ((remain % pccore.raster) < pccore.hsync) { |
| ret |= 0x40; | ret |= 0x40; |
| } | } |
| } | } |
| Line 392 static BYTE IOINPCALL gdc_i60(UINT port) | Line 396 static BYTE IOINPCALL gdc_i60(UINT port) |
| gdc_work(GDCWORK_MASTER); | gdc_work(GDCWORK_MASTER); |
| } | } |
| #ifdef SEARHC_SYNC | #ifdef SEARHC_SYNC |
| if ((i286core.s.inport) && (I286_REMCLOCK >= 5)) { | if ((CPU_INPADRS) && (CPU_REMCLOCK >= 5)) { |
| UINT16 jadr = 0xfa74; | UINT16 jadr = 0xfa74; |
| UINT16 memv; | UINT16 memv; |
| memv = i286_memoryread_w(i286core.s.inport); | memv = i286_memoryread_w(CPU_INPADRS); |
| while((memv == 0x00eb) || (memv == 0x5fe6)) { | while((memv == 0x00eb) || (memv == 0x5fe6)) { |
| jadr -= 0x200; | jadr -= 0x200; |
| i286core.s.inport += 2; | CPU_INPADRS += 2; |
| memv = i286_memoryread_w(i286core.s.inport); | memv = i286_memoryread_w(CPU_INPADRS); |
| } | } |
| if ((memv == 0x20a8) || (memv == 0x2024)) { | if ((memv == 0x20a8) || (memv == 0x2024)) { |
| memv = i286_memoryread_w(i286core.s.inport + 2); | memv = i286_memoryread_w(CPU_INPADRS + 2); |
| if (memv == jadr) { // je | if (memv == jadr) { // je |
| if (!gdc.vsync) { | if (!gdc.vsync) { |
| I286_REMCLOCK = -1; | CPU_REMCLOCK = -1; |
| } | } |
| } | } |
| else if (memv == (jadr + 1)) { // jne | else if (memv == (jadr + 1)) { // jne |
| if (gdc.vsync) { | if (gdc.vsync) { |
| I286_REMCLOCK = -1; | CPU_REMCLOCK = -1; |
| } | } |
| } | } |
| } | } |
| } | } |
| #endif | #endif |
| #ifdef TURE_SYNC // クロックイベントの誤差修正 | #ifdef TURE_SYNC // クロックイベントの誤差修正 |
| if (nevent.item[NEVENT_FLAMES].clock < (I286_BASECLOCK - I286_REMCLOCK)) { | if (nevent.item[NEVENT_FLAMES].clock < (CPU_BASECLOCK - CPU_REMCLOCK)) { |
| ret ^= 0x20; | ret ^= 0x20; |
| } | } |
| #endif | #endif |
| Line 425 static BYTE IOINPCALL gdc_i60(UINT port) | Line 429 static BYTE IOINPCALL gdc_i60(UINT port) |
| return(ret); | return(ret); |
| } | } |
| static BYTE IOINPCALL gdc_i62(UINT port) { | static REG8 IOINPCALL gdc_i62(UINT port) { |
| if (gdc.m.snd) { | if (gdc.m.snd) { |
| gdc.m.snd--; | gdc.m.snd--; |
| Line 435 static BYTE IOINPCALL gdc_i62(UINT port) | Line 439 static BYTE IOINPCALL gdc_i62(UINT port) |
| return(0xff); | return(0xff); |
| } | } |
| static BYTE IOINPCALL gdc_i68(UINT port) { | static REG8 IOINPCALL gdc_i68(UINT port) { |
| (void)port; | (void)port; |
| return(gdc.mode1); | return(gdc.mode1); |
| } | } |
| static BYTE IOINPCALL gdc_i6a(UINT port) { | static REG8 IOINPCALL gdc_i6a(UINT port) { |
| (void)port; | (void)port; |
| return(gdc.mode2); | return(gdc.mode2); |
| } | } |
| static void IOOUTCALL gdc_oa0(UINT port, BYTE dat) { | static void IOOUTCALL gdc_oa0(UINT port, REG8 dat) { |
| if (gdc.s.cnt < GDCCMD_MAX) { | if (gdc.s.cnt < GDCCMD_MAX) { |
| gdc.s.fifo[gdc.s.cnt++] = dat; | gdc.s.fifo[gdc.s.cnt++] = dat; |
| Line 460 static void IOOUTCALL gdc_oa0(UINT port, | Line 464 static void IOOUTCALL gdc_oa0(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_oa2(UINT port, BYTE dat) { | static void IOOUTCALL gdc_oa2(UINT port, REG8 dat) { |
| if (gdc.s.cnt < GDCCMD_MAX) { | if (gdc.s.cnt < GDCCMD_MAX) { |
| gdc.s.fifo[gdc.s.cnt++] = 0x100 | dat; | gdc.s.fifo[gdc.s.cnt++] = 0x100 | dat; |
| Line 470 static void IOOUTCALL gdc_oa2(UINT port, | Line 474 static void IOOUTCALL gdc_oa2(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_oa4(UINT port, BYTE dat) { | static void IOOUTCALL gdc_oa4(UINT port, REG8 dat) { |
| if ((gdcs.disp ^ dat) & 1) { | if ((gdcs.disp ^ dat) & 1) { |
| gdcs.disp = dat & 1; | gdcs.disp = dat & 1; |
| Line 479 static void IOOUTCALL gdc_oa4(UINT port, | Line 483 static void IOOUTCALL gdc_oa4(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_oa6(UINT port, BYTE dat) { | static void IOOUTCALL gdc_oa6(UINT port, REG8 dat) { |
| if ((gdcs.access ^ dat) & 1) { | if ((gdcs.access ^ dat) & 1) { |
| gdcs.access = dat & 1; | gdcs.access = dat & 1; |
| Line 490 static void IOOUTCALL gdc_oa6(UINT port, | Line 494 static void IOOUTCALL gdc_oa6(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_oa8(UINT port, BYTE dat) { | static void IOOUTCALL gdc_oa8(UINT port, REG8 dat) { |
| if (gdc.analog) { | if (gdc.analog) { |
| gdc.palnum = dat & 0x0f; | gdc.palnum = dat & 0x0f; |
| Line 501 static void IOOUTCALL gdc_oa8(UINT port, | Line 505 static void IOOUTCALL gdc_oa8(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_oaa(UINT port, BYTE dat) { | static void IOOUTCALL gdc_oaa(UINT port, REG8 dat) { |
| if (gdc.analog) { | if (gdc.analog) { |
| gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.g), dat); | gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.g), dat); |
| Line 512 static void IOOUTCALL gdc_oaa(UINT port, | Line 516 static void IOOUTCALL gdc_oaa(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_oac(UINT port, BYTE dat) { | static void IOOUTCALL gdc_oac(UINT port, REG8 dat) { |
| if (gdc.analog) { | if (gdc.analog) { |
| gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.r), dat); | gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.r), dat); |
| Line 523 static void IOOUTCALL gdc_oac(UINT port, | Line 527 static void IOOUTCALL gdc_oac(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static void IOOUTCALL gdc_oae(UINT port, BYTE dat) { | static void IOOUTCALL gdc_oae(UINT port, REG8 dat) { |
| if (gdc.analog) { | if (gdc.analog) { |
| gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.b), dat); | gdc_setanalogpal(gdc.palnum, offsetof(RGB32, p.b), dat); |
| Line 534 static void IOOUTCALL gdc_oae(UINT port, | Line 538 static void IOOUTCALL gdc_oae(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static BYTE IOINPCALL gdc_ia0(UINT port) { | static REG8 IOINPCALL gdc_ia0(UINT port) { |
| BYTE ret; | REG8 ret; |
| SINT32 remain; | SINT32 remain; |
| ret = 0x80 | gdc.vsync | gdc.s_drawing; | ret = 0x80 | gdc.vsync | gdc.s_drawing; |
| remain = nevent_getremain(NEVENT_FLAMES); | remain = nevent_getremain(NEVENT_FLAMES); |
| if (remain >= 0) { | if (remain >= 0) { |
| if ((remain % pc.raster) < (pc.hsync)) { | if ((remain % pccore.raster) < (pccore.hsync)) { |
| ret |= 0x40; | ret |= 0x40; |
| } | } |
| } | } |
| Line 559 static BYTE IOINPCALL gdc_ia0(UINT port) | Line 563 static BYTE IOINPCALL gdc_ia0(UINT port) |
| gdc_work(GDCWORK_SLAVE); | gdc_work(GDCWORK_SLAVE); |
| } | } |
| #ifdef SEARHC_SYNC | #ifdef SEARHC_SYNC |
| if ((i286core.s.inport) && (I286_REMCLOCK >= 5)) { | if ((CPU_INPADRS) && (CPU_REMCLOCK >= 5)) { |
| UINT16 jadr = 0xfa74; | UINT16 jadr = 0xfa74; |
| UINT16 memv; | UINT16 memv; |
| memv = i286_memoryread_w(i286core.s.inport); | memv = i286_memoryread_w(CPU_INPADRS); |
| while((memv == 0x00eb) || (memv == 0x5fe6)) { | while((memv == 0x00eb) || (memv == 0x5fe6)) { |
| jadr -= 0x200; | jadr -= 0x200; |
| i286core.s.inport += 2; | CPU_INPADRS += 2; |
| memv = i286_memoryread_w(i286core.s.inport); | memv = i286_memoryread_w(CPU_INPADRS); |
| } | } |
| if ((memv == 0x20a8) || (memv == 0x2024)) { | if ((memv == 0x20a8) || (memv == 0x2024)) { |
| memv = i286_memoryread_w(i286core.s.inport + 2); | memv = i286_memoryread_w(CPU_INPADRS + 2); |
| if (memv == jadr) { // je | if (memv == jadr) { // je |
| if (!gdc.vsync) { | if (!gdc.vsync) { |
| I286_REMCLOCK = -1; | CPU_REMCLOCK = -1; |
| } | } |
| } | } |
| else if (memv == (jadr + 1)) { // jne | else if (memv == (jadr + 1)) { // jne |
| if (gdc.vsync) { | if (gdc.vsync) { |
| I286_REMCLOCK = -1; | CPU_REMCLOCK = -1; |
| } | } |
| } | } |
| } | } |
| } | } |
| #endif | #endif |
| #ifdef TURE_SYNC // クロックイベントの誤差修正 | #ifdef TURE_SYNC // クロックイベントの誤差修正 |
| if (nevent.item[NEVENT_FLAMES].clock < (I286_BASECLOCK - I286_REMCLOCK)) { | if (nevent.item[NEVENT_FLAMES].clock < (CPU_BASECLOCK - CPU_REMCLOCK)) { |
| ret ^= 0x20; | ret ^= 0x20; |
| } | } |
| #endif | #endif |
| Line 592 static BYTE IOINPCALL gdc_ia0(UINT port) | Line 596 static BYTE IOINPCALL gdc_ia0(UINT port) |
| return(ret); | return(ret); |
| } | } |
| static BYTE IOINPCALL gdc_ia2(UINT port) { | static REG8 IOINPCALL gdc_ia2(UINT port) { |
| if (gdc.s.snd) { | if (gdc.s.snd) { |
| gdc.s.snd--; | gdc.s.snd--; |
| Line 602 static BYTE IOINPCALL gdc_ia2(UINT port) | Line 606 static BYTE IOINPCALL gdc_ia2(UINT port) |
| return(0xff); | return(0xff); |
| } | } |
| static BYTE IOINPCALL gdc_ia4(UINT port) { | static REG8 IOINPCALL gdc_ia4(UINT port) { |
| (void)port; | (void)port; |
| return(gdcs.disp); | return(gdcs.disp); |
| } | } |
| static BYTE IOINPCALL gdc_ia6(UINT port) { | static REG8 IOINPCALL gdc_ia6(UINT port) { |
| (void)port; | (void)port; |
| return(gdcs.access); | return(gdcs.access); |