|
|
| version 1.1.1.1, 2003/10/16 17:57:53 | version 1.13, 2004/02/07 21:23:22 |
|---|---|
| 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 "gdc_cmd.tbl" | |
| #include "palettes.h" | |
| #include "vram.h" | #include "vram.h" |
| #include "palettes.h" | |
| #include "gdc_cmd.tbl" | |
| #define SEARHC_SYNC | #define SEARHC_SYNC |
| #define TURE_SYNC | #define TURE_SYNC |
| extern BYTE screenupdate; | |
| static const UINT8 defdegpal[4] = {0x04,0x15,0x26,0x37}; | |
| static const UINT8 defsync15[8] = {0x10,0x4e,0x07,0x25,0x0d,0x0f,0xc8,0x94}; | |
| static const UINT8 defsync24[8] = {0x10,0x4e,0x07,0x25,0x07,0x07,0x90,0x65}; | |
| static const BYTE defdegpal[4] = {0x04,0x15,0x26,0x37}; | |
| static const BYTE defsync[8] = {0x10,0x4e,0x07,0x25,0x07,0x07,0x90,0x65}; | |
| void gdc_setdegitalpal(int color, REG8 value) { | |
| void gdc_setdegitalpal(int color, BYTE value) { | |
| if (color & 4) { | if (color & 4) { |
| color &= 3; | color &= 3; |
| Line 41 void gdc_setdegitalpal(int color, BYTE v | Line 39 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) && (!gdc.vsync)) { | if (palevent.events < PALEVENTMAX) { |
| event = palevent.event + palevent.events; | if (!gdc.vsync) { |
| event->clock = nevent.item[NEVENT_FLAMES].clock - | event = palevent.event + palevent.events; |
| (nevent.baseclock - nevent.remainclock); | event->clock = nevent.item[NEVENT_FLAMES].clock - |
| event->color = (color * sizeof(RGB32)) + rgb; | (CPU_BASECLOCK - CPU_REMCLOCK); |
| event->value = value; | event->color = (color * sizeof(RGB32)) + rgb; |
| palevent.events++; | event->value = (UINT8)value; |
| palevent.events++; | |
| } | |
| else { | |
| palevent.vsyncpal = 1; | |
| } | |
| } | } |
| } | } |
| *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 128 static void textdraw(void) { // | Line 131 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 148 void gdc_work(int id) { | Line 151 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 169 void gdc_work(int id) { | Line 174 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 228 void gdc_forceready(GDCDATA item) { | Line 234 void gdc_forceready(GDCDATA item) { |
| item->snd = 0; | item->snd = 0; |
| } | } |
| void gdc_updateclock(void) { | |
| UINT vfp; | |
| UINT vbp; | |
| UINT lf; | |
| UINT vs; | |
| UINT maxy; | |
| UINT cnt; | |
| vfp = gdc.m.para[GDC_SYNC + 5] & 0x3f; | |
| if (!vfp) { | |
| vfp = 1; | |
| } | |
| vbp = gdc.m.para[GDC_SYNC + 7] >> 2; | |
| if (!vbp) { | |
| vbp = 1; | |
| } | |
| lf = LOADINTELWORD(gdc.m.para + GDC_SYNC + 6); | |
| lf &= 0x3ff; | |
| if (!lf) { | |
| lf = 1024; | |
| } | |
| vs = LOADINTELWORD(gdc.m.para + GDC_SYNC + 4); | |
| vs = (vs >> 5) & 0x1f; | |
| if (!vs) { | |
| vs = 1; | |
| } | |
| maxy = lf + vfp + vbp + vs; | |
| cnt = (pccore.realclock * 5) / 282; | |
| gdc.rasterclock = cnt / maxy; | |
| gdc.hsyncclock = (gdc.rasterclock * 4) / 5; | |
| gdc.dispclock = gdc.rasterclock * lf; | |
| gdc.vsyncclock = cnt - gdc.dispclock; | |
| } | |
| void gdc_restorekacmode(void) { | void gdc_restorekacmode(void) { |
| BYTE bit; | BYTE bit; |
| Line 242 void gdc_restorekacmode(void) { | Line 283 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 250 static void IOOUTCALL gdc_o60(UINT port, | Line 291 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 259 static void IOOUTCALL gdc_o62(UINT port, | Line 300 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 285 static void IOOUTCALL gdc_o68(UINT port, | Line 326 static void IOOUTCALL gdc_o68(UINT port, |
| gdcs.grphdisp |= GDCSCRN_ALLDRAW2; | gdcs.grphdisp |= GDCSCRN_ALLDRAW2; |
| gdcs.palchange = GDCSCRN_REDRAW; | gdcs.palchange = GDCSCRN_REDRAW; |
| } | } |
| else if (bit == 0x08) { | |
| gdcs.textdisp |= GDCSCRN_ALLDRAW2; | |
| } | |
| else if (bit == 0x20) { | else if (bit == 0x20) { |
| gdc_restorekacmode(); | gdc_restorekacmode(); |
| } | } |
| Line 296 static void IOOUTCALL gdc_o68(UINT port, | Line 340 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 331 static void IOOUTCALL gdc_o6a(UINT port, | Line 375 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 364 static void IOOUTCALL gdc_o6a(UINT port, | Line 410 static void IOOUTCALL gdc_o6a(UINT port, |
| (void)port; | (void)port; |
| } | } |
| static BYTE IOINPCALL gdc_i60(UINT port) { | static void IOOUTCALL gdc_o6e(UINT port, REG8 dat) { |
| switch(dat) { | |
| case 0: | |
| gdc.crt15khz = 0; | |
| gdcs.textdisp |= GDCSCRN_ALLDRAW2; | |
| break; | |
| case 1: | |
| gdc.crt15khz = 1; | |
| gdcs.textdisp |= GDCSCRN_ALLDRAW2; | |
| break; | |
| } | |
| (void)port; | |
| } | |
| BYTE ret; | static REG8 IOINPCALL gdc_i60(UINT port) { |
| long remain; | |
| REG8 ret; | |
| 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 % gdc.rasterclock) < gdc.hsyncclock) { |
| ret |= 0x40; | ret |= 0x40; |
| } | } |
| } | } |
| Line 389 static BYTE IOINPCALL gdc_i60(UINT port) | Line 451 static BYTE IOINPCALL gdc_i60(UINT port) |
| gdc_work(GDCWORK_MASTER); | gdc_work(GDCWORK_MASTER); |
| } | } |
| #ifdef SEARHC_SYNC | #ifdef SEARHC_SYNC |
| if ((i286s.inport) && (nevent.remainclock >= 5)) { | if ((CPU_INPADRS) && (CPU_REMCLOCK >= 5)) { |
| UINT16 jadr = 0xfa74; | UINT16 jadr = 0xfa74; |
| UINT16 memv; | UINT16 memv; |
| memv = i286_memoryread_w(i286s.inport); | memv = i286_memoryread_w(CPU_INPADRS); |
| while((memv == 0x00eb) || (memv == 0x5fe6)) { | while((memv == 0x00eb) || (memv == 0x5fe6)) { |
| jadr -= 0x200; | jadr -= 0x200; |
| i286s.inport += 2; | CPU_INPADRS += 2; |
| memv = i286_memoryread_w(i286s.inport); | memv = i286_memoryread_w(CPU_INPADRS); |
| } | } |
| if ((memv == 0x20a8) || (memv == 0x2024)) { | if ((memv == 0x20a8) || (memv == 0x2024)) { |
| memv = i286_memoryread_w(i286s.inport + 2); | memv = i286_memoryread_w(CPU_INPADRS + 2); |
| if (memv == jadr) { // je | if (memv == jadr) { // je |
| if (!gdc.vsync) { | if (!gdc.vsync) { |
| nevent.remainclock = -1; | CPU_REMCLOCK = -1; |
| } | } |
| } | } |
| else if (memv == (jadr + 1)) { // jne | else if (memv == (jadr + 1)) { // jne |
| if (gdc.vsync) { | if (gdc.vsync) { |
| nevent.remainclock = -1; | CPU_REMCLOCK = -1; |
| } | } |
| } | } |
| } | } |
| } | } |
| #endif | #endif |
| #ifdef TURE_SYNC // クロックイベントの誤差修正 | #ifdef TURE_SYNC // クロックイベントの誤差修正 |
| if (nevent.item[NEVENT_FLAMES].clock < | if (nevent.item[NEVENT_FLAMES].clock < (CPU_BASECLOCK - CPU_REMCLOCK)) { |
| (nevent.baseclock - nevent.remainclock)) { | |
| ret ^= 0x20; | ret ^= 0x20; |
| } | } |
| #endif | #endif |
| Line 423 static BYTE IOINPCALL gdc_i60(UINT port) | Line 484 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 433 static BYTE IOINPCALL gdc_i62(UINT port) | Line 494 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; |
| } | } |
| // TRACEOUT(("GDC-B %.2x", dat)); | |
| if (gdc.s.paracb) { // ver0.29 | if (gdc.s.paracb) { // ver0.29 |
| gdc_work(GDCWORK_SLAVE); | gdc_work(GDCWORK_SLAVE); |
| } | } |
| (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; |
| } | } |
| // TRACEOUT(("GDC-A %.2x", dat)); | |
| gdc_work(GDCWORK_SLAVE); | gdc_work(GDCWORK_SLAVE); |
| (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 475 static void IOOUTCALL gdc_oa4(UINT port, | Line 538 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 486 static void IOOUTCALL gdc_oa6(UINT port, | Line 549 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 497 static void IOOUTCALL gdc_oa8(UINT port, | Line 560 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 508 static void IOOUTCALL gdc_oaa(UINT port, | Line 571 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 519 static void IOOUTCALL gdc_oac(UINT port, | Line 582 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 530 static void IOOUTCALL gdc_oae(UINT port, | Line 593 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 % gdc.rasterclock) < (gdc.hsyncclock)) { |
| ret |= 0x40; | ret |= 0x40; |
| } | } |
| } | } |
| Line 555 static BYTE IOINPCALL gdc_ia0(UINT port) | Line 618 static BYTE IOINPCALL gdc_ia0(UINT port) |
| gdc_work(GDCWORK_SLAVE); | gdc_work(GDCWORK_SLAVE); |
| } | } |
| #ifdef SEARHC_SYNC | #ifdef SEARHC_SYNC |
| if ((i286s.inport) && (nevent.remainclock >= 5)) { | if ((CPU_INPADRS) && (CPU_REMCLOCK >= 5)) { |
| UINT16 jadr = 0xfa74; | UINT16 jadr = 0xfa74; |
| UINT16 memv; | UINT16 memv; |
| memv = i286_memoryread_w(i286s.inport); | memv = i286_memoryread_w(CPU_INPADRS); |
| while((memv == 0x00eb) || (memv == 0x5fe6)) { | while((memv == 0x00eb) || (memv == 0x5fe6)) { |
| jadr -= 0x200; | jadr -= 0x200; |
| i286s.inport += 2; | CPU_INPADRS += 2; |
| memv = i286_memoryread_w(i286s.inport); | memv = i286_memoryread_w(CPU_INPADRS); |
| } | } |
| if ((memv == 0x20a8) || (memv == 0x2024)) { | if ((memv == 0x20a8) || (memv == 0x2024)) { |
| memv = i286_memoryread_w(i286s.inport + 2); | memv = i286_memoryread_w(CPU_INPADRS + 2); |
| if (memv == jadr) { // je | if (memv == jadr) { // je |
| if (!gdc.vsync) { | if (!gdc.vsync) { |
| nevent.remainclock = -1; | CPU_REMCLOCK = -1; |
| } | } |
| } | } |
| else if (memv == (jadr + 1)) { // jne | else if (memv == (jadr + 1)) { // jne |
| if (gdc.vsync) { | if (gdc.vsync) { |
| nevent.remainclock = -1; | CPU_REMCLOCK = -1; |
| } | } |
| } | } |
| } | } |
| } | } |
| #endif | #endif |
| #ifdef TURE_SYNC // クロックイベントの誤差修正 | #ifdef TURE_SYNC // クロックイベントの誤差修正 |
| if (nevent.item[NEVENT_FLAMES].clock < | if (nevent.item[NEVENT_FLAMES].clock < (CPU_BASECLOCK - CPU_REMCLOCK)) { |
| (nevent.baseclock - nevent.remainclock)) { | |
| ret ^= 0x20; | ret ^= 0x20; |
| } | } |
| #endif | #endif |
| Line 589 static BYTE IOINPCALL gdc_ia0(UINT port) | Line 651 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 599 static BYTE IOINPCALL gdc_ia2(UINT port) | Line 661 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); |
| Line 616 static BYTE IOINPCALL gdc_ia6(UINT port) | Line 678 static BYTE IOINPCALL gdc_ia6(UINT port) |
| static const IOOUT gdco60[8] = { | static const IOOUT gdco60[8] = { |
| gdc_o60, gdc_o62, gdc_o64, NULL, | gdc_o60, gdc_o62, gdc_o64, NULL, |
| gdc_o68, gdc_o6a, NULL, NULL}; | gdc_o68, gdc_o6a, NULL, gdc_o6e}; |
| static const IOOUT gdcoa0[8] = { | static const IOOUT gdcoa0[8] = { |
| gdc_oa0, gdc_oa2, gdc_oa4, gdc_oa6, | gdc_oa0, gdc_oa2, gdc_oa4, gdc_oa6, |
| Line 635 void gdc_reset(void) { | Line 697 void gdc_reset(void) { |
| ZeroMemory(&gdc, sizeof(gdc)); | ZeroMemory(&gdc, sizeof(gdc)); |
| ZeroMemory(&gdcs, sizeof(gdcs)); | ZeroMemory(&gdcs, sizeof(gdcs)); |
| gdc.mode1 = 0x98; | if (!(np2cfg.dipsw[0] & 0x01)) { |
| gdc.mode1 = 0x98; | |
| gdc.m.para[GDC_CSRFORM + 0] = 0x0f; | gdc.m.para[GDC_CSRFORM + 0] = 0x0f; |
| gdc.m.para[GDC_CSRFORM + 1] = 0xc0; | gdc.m.para[GDC_CSRFORM + 1] = 0xc0; |
| gdc.m.para[GDC_CSRFORM + 2] = 0x7b; | gdc.m.para[GDC_CSRFORM + 2] = 0x7b; |
| CopyMemory(gdc.m.para + GDC_SYNC, defsync, 8); | CopyMemory(gdc.m.para + GDC_SYNC, defsync24, 8); |
| CopyMemory(gdc.s.para + GDC_SYNC, defsync, 8); | gdc.s.para[GDC_CSRFORM + 0] = 1; |
| CopyMemory(gdc.s.para + GDC_SYNC, defsync24, 8); | |
| } | |
| else { | |
| gdc.crt15khz = 1; | |
| gdc.mode1 = 0x80; | |
| gdc.m.para[GDC_CSRFORM + 0] = 0x07; | |
| gdc.m.para[GDC_CSRFORM + 1] = 0xc0; | |
| gdc.m.para[GDC_CSRFORM + 2] = 0x3b; | |
| CopyMemory(gdc.m.para + GDC_SYNC, defsync15, 8); | |
| CopyMemory(gdc.s.para + GDC_SYNC, defsync15, 8); | |
| } | |
| gdc.s.para[GDC_CSRFORM] = 1; | |
| gdc.clock = 0; | gdc.clock = 0; |
| gdc.m.para[GDC_PITCH] = 80; // ver0.26 | gdc.m.para[GDC_PITCH] = 80; |
| gdc.s.para[GDC_PITCH] = 40; | gdc.s.para[GDC_PITCH] = 40; |
| gdc_paletteinit(); | gdc_paletteinit(); |
| Line 654 void gdc_reset(void) { | Line 726 void gdc_reset(void) { |
| gdcs.grphdisp = GDCSCRN_ALLDRAW2 | GDCSCRN_EXT; | gdcs.grphdisp = GDCSCRN_ALLDRAW2 | GDCSCRN_EXT; |
| gdc.display = (np2cfg.color16 & 1) << 1; | gdc.display = (np2cfg.color16 & 1) << 1; |
| gdc.bitac = 0xff; | gdc.bitac = 0xff; |
| #if 0 // bind で計算される筈 | |
| gdc.rasterclock = pccore.realclock / 24816; | |
| gdc.hsyncclock = (gdc.rasterclock * 4) / 5; | |
| gdc.dispclock = pccore.realclock * 50 / 3102; | |
| gdc.vsyncclock = pccore.realclock * 5 / 3102; | |
| #endif | |
| } | } |
| void gdc_bind(void) { | void gdc_bind(void) { |
| gdc_updateclock(); | |
| iocore_attachsysoutex(0x0060, 0x0cf1, gdco60, 8); | iocore_attachsysoutex(0x0060, 0x0cf1, gdco60, 8); |
| iocore_attachsysinpex(0x0060, 0x0cf1, gdci60, 8); | iocore_attachsysinpex(0x0060, 0x0cf1, gdci60, 8); |
| iocore_attachsysoutex(0x00a0, 0x0cf1, gdcoa0, 8); | iocore_attachsysoutex(0x00a0, 0x0cf1, gdcoa0, 8); |