|
|
| version 1.24, 2004/08/12 14:03:14 | version 1.36, 2005/02/04 06:42:07 |
|---|---|
| Line 1 | Line 1 |
| // #define SINGLESTEPONLY | |
| // #define IPTRACE (1 << 14) | |
| // #define NEVENT_COUNTER | |
| // #define PCCOUNTER | |
| // #define IOCOUNTER | |
| // #define CTCCOUNTER | |
| #include "compiler.h" | #include "compiler.h" |
| #if defined(TRACE) && IPTRACE | |
| #include "dosio.h" | #include "dosio.h" |
| #endif | |
| #if defined(SUPPORT_TURBOZ) | |
| #include "scrnmng.h" | #include "scrnmng.h" |
| #endif | |
| #if !defined(DISABLE_SOUND) | |
| #include "soundmng.h" | #include "soundmng.h" |
| #endif | |
| #include "sysmng.h" | #include "sysmng.h" |
| #include "timemng.h" | #include "timemng.h" |
| #include "xmilver.h" | #include "xmilver.h" |
| Line 19 | Line 33 |
| #include "sndctrl.h" | #include "sndctrl.h" |
| #include "font.h" | #include "font.h" |
| #include "fddfile.h" | #include "fddfile.h" |
| #include "defrom.res" | |
| const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE); | const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE); |
| XMILCFG xmilcfg = { 2, 1, 0x03, | XMILCFG xmilcfg = { 2, 1, 0x03, |
| 1, 0, 0, 0, | 1, 0, 0, 0, |
| 22050, 500, 0, 0, 80, | #if !defined(DISABLE_SOUND) |
| 22050, 500, | |
| #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) | |
| 0, 64, | |
| #endif | |
| 64, 0, 80, | |
| #endif | |
| 0, 0, 0, 0}; | 0, 0, 0, 0}; |
| PCCORE pccore; | PCCORE pccore; |
| CORESTAT corestat; | CORESTAT corestat; |
| BYTE mMAIN[0x10000]; | |
| BYTE mBIOS[0x8000]; | |
| #if defined(SUPPORT_BANKMEM) | |
| UINT8 mBANK[16][0x8000]; | |
| #endif | |
| BYTE *RAM0r; | |
| BYTE *RAM0w; | |
| // ---- | |
| static void ipl_load(void) { | |
| FILEH hdl; | |
| ZeroMemory(mBIOS, sizeof(mBIOS)); | |
| CopyMemory(mBIOS, DEFROM, sizeof(DEFROM)); | |
| if (pccore.ROM_TYPE >= 2) { | |
| if ((hdl = file_open_c(OEMTEXT("IPLROM.X1T"))) != FILEH_INVALID) { | |
| file_read(hdl, mBIOS, 0x8000); | |
| file_close(hdl); | |
| } | |
| } | |
| else if (pccore.ROM_TYPE == 1) { | |
| if ((hdl = file_open_c(OEMTEXT("IPLROM.X1"))) != FILEH_INVALID) { | |
| file_read(hdl, mBIOS, 0x8000); | |
| file_close(hdl); | |
| } | |
| } | |
| } | |
| // ---- | // ---- |
| void pccore_initialize(void) { | void pccore_initialize(void) { |
| Z80_INITIALIZE(); | |
| fddfile_initialize(); | fddfile_initialize(); |
| sndctrl_initialize(); | sndctrl_initialize(); |
| makescrn_initialize(); | makescrn_initialize(); |
| font_load(NULL, TRUE); | (void)font_load(NULL, TRUE); |
| crtc_initialize(); | crtc_initialize(); |
| pcg_initialize(); | pcg_initialize(); |
| Line 89 void pccore_deinitialize(void) { | Line 78 void pccore_deinitialize(void) { |
| fddfile_eject(3); | fddfile_eject(3); |
| } | } |
| #if 0 | |
| void neitem_dummy(UINT id) { | |
| nevent_repeat(id); | |
| } | |
| #endif | |
| void pccore_reset(void) { | void pccore_reset(void) { |
| #if !defined(DISABLE_SOUND) | |
| soundmng_stop(); | soundmng_stop(); |
| if (corestat.soundrenewal) { | if (corestat.soundrenewal) { |
| corestat.soundrenewal = 0; | corestat.soundrenewal = 0; |
| sndctrl_deinitialize(); | sndctrl_deinitialize(); |
| sndctrl_initialize(); | sndctrl_initialize(); |
| } | } |
| sound_reset(); | #endif |
| #if !defined(FIX_Z80A) | |
| pccore.baseclock = 2000000; | pccore.baseclock = 2000000; |
| pccore.multiple = 2; | pccore.multiple = 2; |
| pccore.realclock = pccore.baseclock * pccore.multiple; | pccore.realclock = pccore.baseclock * pccore.multiple; |
| #endif | |
| pccore.ROM_TYPE = xmilcfg.ROM_TYPE; | pccore.ROM_TYPE = xmilcfg.ROM_TYPE; |
| pccore.SOUND_SW = xmilcfg.SOUND_SW; | #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) |
| if (xmilcfg.ROM_TYPE >= 3) { | |
| pccore.SOUND_SW = 1; // 無条件で搭載 | |
| } | |
| else { | |
| pccore.SOUND_SW = xmilcfg.SOUND_SW; | |
| } | |
| #endif | |
| pccore.DIP_SW = xmilcfg.DIP_SW; | pccore.DIP_SW = xmilcfg.DIP_SW; |
| // スクリーンモードの変更... | // スクリーンモードの変更... |
| #if defined(SUPPORT_TURBOZ) | |
| if (pccore.ROM_TYPE >= 3) { | if (pccore.ROM_TYPE >= 3) { |
| if (scrnmng_setcolormode(TRUE) != SUCCESS) { | if (scrnmng_setcolormode(TRUE) != SUCCESS) { |
| pccore.ROM_TYPE = 2; | pccore.ROM_TYPE = 2; |
| Line 117 void pccore_reset(void) { | Line 123 void pccore_reset(void) { |
| else { | else { |
| scrnmng_setcolormode(FALSE); | scrnmng_setcolormode(FALSE); |
| } | } |
| #endif | |
| sound_changeclock(); | |
| sysmng_cpureset(); | sysmng_cpureset(); |
| sound_changeclock(); | |
| sound_reset(); | |
| Z80_RESET(); | Z80_RESET(); |
| nevent_allreset(); | nevent_allreset(); |
| ievent_reset(); | ievent_reset(); |
| calendar_reset(); | |
| iocore_reset(); | iocore_reset(); |
| // nevent_set(15, 4000000 / (60 * 50), neitem_dummy, NEVENT_RELATIVE); | |
| ipl_load(); | |
| RAM0r = mBIOS; | |
| RAM0w = mMAIN; | |
| cgrom_reset(); | |
| cmt_reset(); | |
| crtc_reset(); | |
| ctc_reset(); | |
| dmac_reset(); | |
| fdc_reset(); | |
| memio_reset(); | |
| pcg_reset(); | |
| ppi_reset(); | |
| sio_reset(); | |
| sndboard_reset(); | |
| subcpu_reset(); | |
| vramio_reset(); | |
| calendar_reset(); | |
| pal_reset(); | pal_reset(); |
| makescrn_reset(); | makescrn_reset(); |
| timing_reset(); | timing_reset(); |
| #if !defined(DISABLE_SOUND) | |
| soundmng_play(); | soundmng_play(); |
| #endif | |
| } | } |
| // ---- | // ---- |
| // #define IPTRACE (1 << 14) | |
| #if defined(TRACE) && IPTRACE | #if defined(TRACE) && IPTRACE |
| static UINT trpos = 0; | static UINT trpos = 0; |
| static UINT16 treip[IPTRACE]; | static UINT16 treip[IPTRACE]; |
| Line 188 void iptrace_out(void) { | Line 179 void iptrace_out(void) { |
| #endif | #endif |
| UINT pccore_getraster(UINT *h) { | #if !defined(MAINFRAMES_OLD) |
| void neitem_mainframes(UINT id) { | |
| SINT32 work; | SINT32 clock; |
| UINT vl; | REG8 ppib; |
| SINT32 next; | |
| work = nevent_getwork(NEVENT_FRAMES); | clock = CPU_CLOCKCOUNT - iocore.e.framestartclock; |
| vl = work / 250; | ppib = iocore.s.ppib & (~0x84); |
| if (h) { | do { |
| *h = work - (vl * 250); | next = iocore.e.dispclock; |
| } | if (clock < next) { |
| if (corestat.vsync) { | ppib |= 0x80; |
| vl += corestat.vl; | break; |
| } | } |
| return(vl); | next = iocore.e.dispclock; |
| if (clock < next) { | |
| if (xmilcfg.DISPSYNC & 1) { | |
| scrnupdate(); | |
| } | |
| break; | |
| } | |
| next = iocore.e.vsyncend; | |
| if (clock < next) { | |
| ppib |= 0x04; | |
| break; | |
| } | |
| next = corestat.framebaseclock; | |
| if (clock >= next) { | |
| corestat.vsync = 2; | |
| return; | |
| } | |
| } while(0); | |
| iocore.s.ppib = ppib; | |
| nevent_set(NEVENT_FRAMES, | |
| next - clock, neitem_mainframes, NEVENT_ABSOLUTE); | |
| } | } |
| #else | |
| void nvitem_vdisp(UINT id) { | void neitem_disp(UINT id) { |
| corestat.vsync = 1; | corestat.vsync = 1; |
| pcg.r.vsync = 1; | |
| if (xmilcfg.DISPSYNC & 1) { | if (xmilcfg.DISPSYNC & 1) { |
| scrnupdate(); | scrnupdate(); |
| } | } |
| nevent_set(id, (corestat.tl - corestat.vl) * 250, | nevent_set(id, corestat.syncclock, neitem_vsync, NEVENT_RELATIVE); |
| nvitem_vsync, NEVENT_RELATIVE); | |
| } | } |
| void nvitem_vsync(UINT id) { | void neitem_vsync(UINT id) { |
| corestat.vsync = 2; | corestat.vsync = 2; |
| (void)id; | (void)id; |
| } | } |
| #endif | |
| // #define SINGLESTEPONLY | // ---- |
| #if defined(TRACE) && defined(IOCOUNTER) | |
| static UINT iocounter = 0; | |
| UINT icounter[0x2008]; | |
| UINT ocounter[0x2008]; | |
| #endif | |
| #if defined(TRACE) && defined(CTCCOUNTER) | |
| UINT ctccnt; | |
| #endif | |
| #if defined(TRACE) && defined(PCCOUNTER) | |
| UINT pccnt; | |
| UINT pccnt2; | |
| UINT pccnt3; | |
| UINT lastpc; | |
| #endif | |
| void pccore_exec(BRESULT draw) { | void pccore_exec(BRESULT draw) { |
| SINT32 frameclock; | |
| #if defined(MAINFRAMES_OLD) | |
| SINT32 dispclock; | |
| #endif | |
| #if defined(TRACE) && defined(NEVENT_COUNTER) | |
| UINT ncounter = 0; | |
| #endif | |
| corestat.drawframe = draw; | corestat.drawframe = draw; |
| pal_eventclear(); | |
| #if !defined(DISABLE_SOUND) | |
| soundmng_sync(); | soundmng_sync(); |
| #endif | |
| corestat.tl = 266 * pccore.multiple / 2; | frameclock = crtc.e.frameclock; |
| corestat.vl = min(corestat.tl, crtc.e.dl); | if (corestat.framebaseclock != frameclock) { |
| corestat.framebaseclock = frameclock; | |
| timing_setrate(frameclock); | |
| } | |
| corestat.vsync = 0; | corestat.vsync = 0; |
| nevent_set(NEVENT_FRAMES, corestat.vl * 250, | |
| nvitem_vdisp, NEVENT_RELATIVE); | iocore.e.framestartclock = CPU_CLOCKCOUNT; |
| #if !defined(MAINFRAMES_OLD) | |
| neitem_mainframes(NEVENT_FRAMES); | |
| #else | |
| #if !defined(FIX_Z80A) | |
| frameclock = frameclock * pccore.multiple / 2; | |
| #endif | |
| dispclock = min(frameclock, iocore.e.dispclock); | |
| // corestat.dispclock = dispclock; | |
| corestat.syncclock = frameclock - dispclock; | |
| nevent_set(NEVENT_FRAMES, dispclock, neitem_disp, NEVENT_RELATIVE); | |
| #endif | |
| do { | do { |
| #if defined(TRACE) && defined(NEVENT_COUNTER) | |
| ncounter++; | |
| #endif | |
| #if !defined(SINGLESTEPONLY) | #if !defined(SINGLESTEPONLY) |
| if (CPU_REMCLOCK > 0) { | if (CPU_REMCLOCK > 0) { |
| Z80_EXECUTE(); | Z80_EXECUTE(); |
| } | } |
| #else | #else |
| while(CPU_REMCLOCK > 0) { | while(CPU_REMCLOCK > 0) { |
| TRACEOUT(("%.4x", Z80_PC)); | // TRACEOUT(("%.4x", Z80_PC)); |
| #if defined(TRACE) && IPTRACE | #if defined(TRACE) && IPTRACE |
| treip[trpos & (IPTRACE - 1)] = Z80_PC; | treip[trpos & (IPTRACE - 1)] = Z80_PC; |
| trpos++; | trpos++; |
| Line 255 void pccore_exec(BRESULT draw) { | Line 312 void pccore_exec(BRESULT draw) { |
| scrnupdate(); | scrnupdate(); |
| sound_sync(); | sound_sync(); |
| fdc_callback(); | |
| #if defined(TRACE) && defined(NEVENT_COUNTER) | |
| TRACEOUT(("loop = %d", ncounter)); | |
| #endif | |
| #if defined(TRACE) && defined(CTCCOUNTER) | |
| TRACEOUT(("ctc = %d", ctccnt)); | |
| ctccnt = 0; | |
| #endif | |
| #if defined(TRACE) && defined(PCCOUNTER) | |
| TRACEOUT(("pccnt = %d %d %d", pccnt, pccnt2, pccnt3)); | |
| pccnt = 0; | |
| pccnt2 = 0; | |
| pccnt3 = 0; | |
| #endif | |
| #if defined(TRACE) && defined(IOCOUNTER) | |
| iocounter++; | |
| if (iocounter >= 60) { | |
| UINT i, j, cnt, pos; | |
| iocounter = 0; | |
| for (i=0; i<10; i++) { | |
| cnt = 0; | |
| pos = 0; | |
| for (j=0; j<0x2004; j++) { | |
| if (cnt < ocounter[j]) { | |
| cnt = ocounter[j]; | |
| pos = j; | |
| } | |
| } | |
| ocounter[pos] = 0; | |
| TRACEOUT(("o%2d - %.4x %8dtimes", i, pos, cnt)); | |
| } | |
| for (i=0; i<10; i++) { | |
| cnt = 0; | |
| pos = 0; | |
| for (j=0; j<0x2004; j++) { | |
| if (cnt < icounter[j]) { | |
| cnt = icounter[j]; | |
| pos = j; | |
| } | |
| } | |
| icounter[pos] = 0; | |
| TRACEOUT(("i%2d - %.4x %8dtimes", i, pos, cnt)); | |
| } | |
| } | |
| #endif | |
| } | } |