--- xmil/pccore.c 2004/08/07 12:10:27 1.13 +++ xmil/pccore.c 2004/08/12 11:03:08 1.22 @@ -8,6 +8,8 @@ #include "z80core.h" #include "pccore.h" #include "iocore.h" +#include "nevent.h" +#include "ievent.h" #include "timing.h" #include "calendar.h" #include "keystat.h" @@ -22,33 +24,25 @@ const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE); - XMILCFG xmilcfg = { 0, 0, 1, - 2, 0, 1, - 22050, 1000, 0, 80, - 0, 0, - 0, 0, - 0, 0, 0, - 1, 0}; + XMILCFG xmilcfg = { 2, 0, 1, + 1, 0, 0, 0, + 22050, 500, 0, 0, 80, + 0, 0, 0, 0}; - PCCORE pccore = {250, 0, 1, 0}; + PCCORE pccore; CORESTAT corestat; BYTE mMAIN[0x10000]; BYTE mBIOS[0x8000]; - BYTE mBANK[16][0x8000]; - WORD v_cnt; - int s_cnt; - +#if defined(SUPPORT_BANKMEM) + UINT8 mBANK[16][0x8000]; +#endif BYTE *RAM0r; BYTE *RAM0w; - DWORD h_cntbase; +// ---- -/*********************************************************************** - IPL-ROM LOAD -***********************************************************************/ - -void ipl_load(void) { +static void ipl_load(void) { FILEH hdl; @@ -70,16 +64,49 @@ void ipl_load(void) { } -/*********************************************************************** - 初期化 -***********************************************************************/ - -static BRESULT reset_x1(BYTE ROM_TYPE, BYTE SOUND_SW, BYTE DIP_SW) { - - pccore.HSYNC_CLK = 250; - pccore.ROM_TYPE = ROM_TYPE; - pccore.SOUND_SW = SOUND_SW; - pccore.DIP_SW = DIP_SW; +// ---- + +void pccore_initialize(void) { + + fddfile_initialize(); + sndctrl_initialize(); + makescrn_initialize(); + + font_load(NULL, TRUE); + + crtc_initialize(); + pcg_initialize(); + ppi_initialize(); +} + +void pccore_deinitialize(void) { + + sndctrl_deinitialize(); + + fddfile_eject(0); + fddfile_eject(1); + fddfile_eject(2); + fddfile_eject(3); +} + +void pccore_reset(void) { + + soundmng_stop(); + if (corestat.soundrenewal) { + corestat.soundrenewal = 0; + sndctrl_deinitialize(); + sndctrl_initialize(); + } + sound_reset(); + + + pccore.baseclock = 2000000; + pccore.multiple = 2; + pccore.realclock = pccore.baseclock * pccore.multiple; + + pccore.ROM_TYPE = xmilcfg.ROM_TYPE; + pccore.SOUND_SW = xmilcfg.SOUND_SW; + pccore.DIP_SW = xmilcfg.DIP_SW; // スクリーンモードの変更... if (pccore.ROM_TYPE >= 3) { @@ -91,17 +118,18 @@ static BRESULT reset_x1(BYTE ROM_TYPE, B scrnmng_setcolormode(FALSE); } - ipl_load(); + sound_changeclock(); + sysmng_cpureset(); Z80_RESET(); + nevent_allreset(); + ievent_reset(); iocore_reset(); + ipl_load(); + RAM0r = mBIOS; RAM0w = mMAIN; - h_cntbase = 0; - sysmng_cpureset(); - - calendar_initialize(); cgrom_reset(); cmt_reset(); @@ -117,63 +145,14 @@ static BRESULT reset_x1(BYTE ROM_TYPE, B subcpu_reset(); vramio_reset(); + calendar_initialize(); pal_reset(); makescrn_reset(); timing_reset(); - return(SUCCESS); -} - - - -/*********************************************************************** - 実行/終了 -***********************************************************************/ - -static BYTE keyintcnt = 0; - -void pccore_initialize(void) { - - sndctrl_initialize(); - makescrn_initialize(); - - font_load(NULL, TRUE); - - crtc_initialize(); - pcg_initialize(); - ppi_initialize(); - -// reset_x1(xmilcfg.ROM_TYPE, xmilcfg.SOUND_SW, xmilcfg.DIP_SW); - -// keystat_initialize(); -// keystat_reset(); -} -void pccore_reset(void) { - - soundmng_stop(); - if (corestat.soundrenewal) { - corestat.soundrenewal = 0; - sndctrl_deinitialize(); - sndctrl_initialize(); - } - sound_reset(); - - reset_x1(xmilcfg.ROM_TYPE, xmilcfg.SOUND_SW, xmilcfg.DIP_SW); soundmng_play(); } -void pccore_deinitialize(void) { - - sndctrl_deinitialize(); - -// keyboard_term(); - - fdd_eject(0); - fdd_eject(1); - fdd_eject(2); - fdd_eject(3); -} - // ---- @@ -208,52 +187,96 @@ void iptrace_out(void) { } #endif -void pccore_exec(BRESULT draw) { - REG8 inttiming; +#if 0 +void nvitem_raster(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(); + } + } + v_cnt++; + if (crtc.s.CRT_YL == v_cnt) { + pcg.r.vsync = 1; + if (xmilcfg.DISPSYNC & 1) { + scrnupdate(); + } + } +} +#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); +} + +void nvitem_vdisp(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); +} + +void nvitem_vsync(UINT id) { + + corestat.vsync = 2; + (void)id; +} + + +// #define SINGLESTEPONLY + +void pccore_exec(BRESULT draw) { corestat.drawframe = draw; + soundmng_sync(); - v_cnt = 0; - s_cnt = 0; - inttiming = xmilcfg.CPU8MHz & 1; - - while(s_cnt < 266) { - while(h_cnt < pccore.HSYNC_CLK) { -#if IPTRACE + corestat.tl = 266 * pccore.multiple / 2; + corestat.vl = min(corestat.tl, crtc.s.CRT_YL); + corestat.vsync = 0; + nevent_set(NEVENT_FRAMES, corestat.vl * 250, + nvitem_vdisp, NEVENT_RELATIVE); + do { +#if !defined(SINGLESTEPONLY) + if (CPU_REMCLOCK > 0) { + Z80_EXECUTE(); + } +#else + while(CPU_REMCLOCK > 0) { + TRACEOUT(("%.4x", Z80_PC)); +#if defined(TRACE) && IPTRACE treip[trpos & (IPTRACE - 1)] = Z80_PC; trpos++; #endif - Z80_EXECUTE(); - z80dmap(); - } - h_cnt -= pccore.HSYNC_CLK; - h_cntbase += pccore.HSYNC_CLK; - inttiming ^= 2; - if (inttiming != 3) { - sound_makesample(pcmbufsize[s_cnt]); -// if (xmilcfg.SOUNDPLY) { -// juliet2_exec(); -// } - s_cnt++; - x1_ctc_int(); - if (!((++keyintcnt) & 15)) { - x1_sub_int(); - if (xmilcfg.MOUSE_SW) { - sio_int(); - } - } - } - v_cnt++; - if (crtc.s.CRT_YL == v_cnt) { - pcg.r.vsync = 1; - if (xmilcfg.DISPSYNC & 1) { - scrnupdate(); - } + Z80_STEP(); } - } - sound_sync(); - calendar_inc(); +#endif + nevent_progress(); + ievent_progress(); + } while(corestat.vsync < 2); + scrnupdate(); + calendar_inc(); + sound_sync(); }