--- xmil/pccore.c 2004/08/12 11:03:08 1.22 +++ xmil/pccore.c 2005/02/04 06:42:07 1.36 @@ -1,7 +1,21 @@ + +// #define SINGLESTEPONLY +// #define IPTRACE (1 << 14) +// #define NEVENT_COUNTER +// #define PCCOUNTER +// #define IOCOUNTER +// #define CTCCOUNTER + #include "compiler.h" +#if defined(TRACE) && IPTRACE #include "dosio.h" +#endif +#if defined(SUPPORT_TURBOZ) #include "scrnmng.h" +#endif +#if !defined(DISABLE_SOUND) #include "soundmng.h" +#endif #include "sysmng.h" #include "timemng.h" #include "xmilver.h" @@ -19,60 +33,35 @@ #include "sndctrl.h" #include "font.h" #include "fddfile.h" -#include "defrom.res" const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE); - XMILCFG xmilcfg = { 2, 0, 1, + XMILCFG xmilcfg = { 2, 1, 0x03, 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}; PCCORE pccore; 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) { + Z80_INITIALIZE(); fddfile_initialize(); sndctrl_initialize(); makescrn_initialize(); - font_load(NULL, TRUE); + (void)font_load(NULL, TRUE); crtc_initialize(); pcg_initialize(); @@ -89,26 +78,43 @@ void pccore_deinitialize(void) { fddfile_eject(3); } +#if 0 +void neitem_dummy(UINT id) { + + nevent_repeat(id); +} +#endif + void pccore_reset(void) { +#if !defined(DISABLE_SOUND) soundmng_stop(); if (corestat.soundrenewal) { corestat.soundrenewal = 0; sndctrl_deinitialize(); sndctrl_initialize(); } - sound_reset(); - +#endif +#if !defined(FIX_Z80A) pccore.baseclock = 2000000; pccore.multiple = 2; pccore.realclock = pccore.baseclock * pccore.multiple; +#endif 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; // スクリーンモードの変更... +#if defined(SUPPORT_TURBOZ) if (pccore.ROM_TYPE >= 3) { if (scrnmng_setcolormode(TRUE) != SUCCESS) { pccore.ROM_TYPE = 2; @@ -117,47 +123,32 @@ void pccore_reset(void) { else { scrnmng_setcolormode(FALSE); } +#endif - sound_changeclock(); sysmng_cpureset(); + sound_changeclock(); + sound_reset(); + Z80_RESET(); nevent_allreset(); ievent_reset(); + calendar_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_initialize(); pal_reset(); makescrn_reset(); timing_reset(); +#if !defined(DISABLE_SOUND) soundmng_play(); +#endif } // ---- -// #define IPTRACE (1 << 14) - #if defined(TRACE) && IPTRACE static UINT trpos = 0; static UINT16 treip[IPTRACE]; @@ -188,82 +179,126 @@ void iptrace_out(void) { #endif -#if 0 -void nvitem_raster(UINT id) { +#if !defined(MAINFRAMES_OLD) +void neitem_mainframes(UINT id) { - nevent_repeat(id); - sound_makesample(pcmbufsize[v_cnt]); -// x1_ctc_int(); - if (!((++keyintcnt) & 15)) { - x1_sub_int(); - if (xmilcfg.MOUSE_SW) { - sio_int(); + SINT32 clock; + REG8 ppib; + SINT32 next; + + clock = CPU_CLOCKCOUNT - iocore.e.framestartclock; + ppib = iocore.s.ppib & (~0x84); + do { + next = iocore.e.dispclock; + if (clock < next) { + ppib |= 0x80; + break; } - } - v_cnt++; - if (crtc.s.CRT_YL == v_cnt) { - pcg.r.vsync = 1; - if (xmilcfg.DISPSYNC & 1) { - scrnupdate(); + next = iocore.e.dispclock; + if (clock < next) { + if (xmilcfg.DISPSYNC & 1) { + scrnupdate(); + } + break; } - } -} -#endif - -UINT pccore_getraster(UINT *h) { - - SINT32 work; - UINT vl; - - work = nevent_getwork(NEVENT_FRAMES); - vl = work / 250; - if (h) { - *h = work - (vl * 250); - } - if (corestat.vsync) { - vl += corestat.vl; - } - return(vl); + 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); } - -void nvitem_vdisp(UINT id) { +#else +void neitem_disp(UINT id) { corestat.vsync = 1; - pcg.r.vsync = 1; if (xmilcfg.DISPSYNC & 1) { scrnupdate(); } - nevent_set(id, (corestat.tl - corestat.vl) * 250, - nvitem_vsync, NEVENT_RELATIVE); + nevent_set(id, corestat.syncclock, neitem_vsync, NEVENT_RELATIVE); } -void nvitem_vsync(UINT id) { +void neitem_vsync(UINT id) { corestat.vsync = 2; (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) { + SINT32 frameclock; +#if defined(MAINFRAMES_OLD) + SINT32 dispclock; +#endif +#if defined(TRACE) && defined(NEVENT_COUNTER) + UINT ncounter = 0; +#endif + corestat.drawframe = draw; + pal_eventclear(); +#if !defined(DISABLE_SOUND) soundmng_sync(); +#endif - corestat.tl = 266 * pccore.multiple / 2; - corestat.vl = min(corestat.tl, crtc.s.CRT_YL); + frameclock = crtc.e.frameclock; + if (corestat.framebaseclock != frameclock) { + corestat.framebaseclock = frameclock; + timing_setrate(frameclock); + } 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 { +#if defined(TRACE) && defined(NEVENT_COUNTER) + ncounter++; +#endif #if !defined(SINGLESTEPONLY) if (CPU_REMCLOCK > 0) { Z80_EXECUTE(); } #else while(CPU_REMCLOCK > 0) { - TRACEOUT(("%.4x", Z80_PC)); + // TRACEOUT(("%.4x", Z80_PC)); #if defined(TRACE) && IPTRACE treip[trpos & (IPTRACE - 1)] = Z80_PC; trpos++; @@ -276,7 +311,52 @@ void pccore_exec(BRESULT draw) { } while(corestat.vsync < 2); scrnupdate(); - calendar_inc(); 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 }