| version 1.14, 2004/08/08 06:59:21 | version 1.22, 2004/08/12 11:03:08 | 
| Line 8 | Line 8 | 
 | #include        "z80core.h" | #include        "z80core.h" | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "iocore.h" | #include        "iocore.h" | 
 |  | #include        "nevent.h" | 
 |  | #include        "ievent.h" | 
 | #include        "timing.h" | #include        "timing.h" | 
 | #include        "calendar.h" | #include        "calendar.h" | 
 | #include        "keystat.h" | #include        "keystat.h" | 
| Line 22 | Line 24 | 
 |  |  | 
 | const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE); | const OEMCHAR xmilversion[] = OEMTEXT(XMILVER_CORE); | 
 |  |  | 
| XMILCFG         xmilcfg = {     0, 0, 1, | XMILCFG         xmilcfg = { 2, 0, 1, | 
| 2, 0, 1, | 1, 0, 0, 0, | 
| 22050, 1000, 0, 80, | 22050, 500, 0, 0, 80, | 
| 0, 0, | 0, 0, 0, 0}; | 
| 0, 0, |  | 
| 0, 0, 0, |  | 
| 1, 0}; |  | 
 |  |  | 
| PCCORE          pccore = {250, 0, 1, 0}; | PCCORE          pccore; | 
 | CORESTAT        corestat; | CORESTAT        corestat; | 
 | BYTE            mMAIN[0x10000]; | BYTE            mMAIN[0x10000]; | 
 | BYTE            mBIOS[0x8000]; | BYTE            mBIOS[0x8000]; | 
| BYTE            mBANK[16][0x8000]; | #if defined(SUPPORT_BANKMEM) | 
| WORD            v_cnt; | UINT8           mBANK[16][0x8000]; | 
| int                     s_cnt; | #endif | 
|  |  | 
 | BYTE            *RAM0r; | BYTE            *RAM0r; | 
 | BYTE            *RAM0w; | BYTE            *RAM0w; | 
 | DWORD           h_cntbase; |  | 
 |  |  | 
 |  |  | 
|  | // ---- | 
| /*********************************************************************** |  | 
| IPL-ROM LOAD |  | 
| ***********************************************************************/ |  | 
 |  |  | 
 | static void ipl_load(void) { | static void ipl_load(void) { | 
 |  |  | 
| Line 70  static void ipl_load(void) { | Line 64  static void ipl_load(void) { | 
 | } | } | 
 |  |  | 
 |  |  | 
| /*********************************************************************** | // ---- | 
| 初期化 |  | 
| ***********************************************************************/ | void pccore_initialize(void) { | 
|  |  | 
| static BRESULT reset_x1(BYTE ROM_TYPE, BYTE SOUND_SW, BYTE DIP_SW) { | fddfile_initialize(); | 
|  | sndctrl_initialize(); | 
| pccore.HSYNC_CLK = 250; | makescrn_initialize(); | 
| pccore.ROM_TYPE = ROM_TYPE; |  | 
| pccore.SOUND_SW = SOUND_SW; | font_load(NULL, TRUE); | 
| pccore.DIP_SW = DIP_SW; |  | 
|  | 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) { | if (pccore.ROM_TYPE >= 3) { | 
| Line 91  static BRESULT reset_x1(BYTE ROM_TYPE, B | Line 118  static BRESULT reset_x1(BYTE ROM_TYPE, B | 
 | scrnmng_setcolormode(FALSE); | scrnmng_setcolormode(FALSE); | 
 | } | } | 
 |  |  | 
| ipl_load(); | sound_changeclock(); | 
|  | sysmng_cpureset(); | 
 |  |  | 
 | Z80_RESET(); | Z80_RESET(); | 
 |  | nevent_allreset(); | 
 |  | ievent_reset(); | 
 | iocore_reset(); | iocore_reset(); | 
 |  |  | 
 |  | ipl_load(); | 
 |  |  | 
 | RAM0r = mBIOS; | RAM0r = mBIOS; | 
 | RAM0w = mMAIN; | RAM0w = mMAIN; | 
 | h_cntbase = 0; |  | 
 | sysmng_cpureset(); |  | 
 |  |  | 
 | calendar_initialize(); |  | 
 |  |  | 
 | cgrom_reset(); | cgrom_reset(); | 
 | cmt_reset(); | cmt_reset(); | 
| Line 117  static BRESULT reset_x1(BYTE ROM_TYPE, B | Line 145  static BRESULT reset_x1(BYTE ROM_TYPE, B | 
 | subcpu_reset(); | subcpu_reset(); | 
 | vramio_reset(); | vramio_reset(); | 
 |  |  | 
 |  | calendar_initialize(); | 
 | pal_reset(); | pal_reset(); | 
 | makescrn_reset(); | makescrn_reset(); | 
 | timing_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(); | soundmng_play(); | 
 | } | } | 
 |  |  | 
 | void pccore_deinitialize(void) { |  | 
 |  |  | 
 | sndctrl_deinitialize(); |  | 
 |  |  | 
 | //      keyboard_term(); |  | 
 |  |  | 
 | fdd_eject(0); |  | 
 | fdd_eject(1); |  | 
 | fdd_eject(2); |  | 
 | fdd_eject(3); |  | 
 | } |  | 
 |  |  | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| Line 208  void iptrace_out(void) { | Line 187  void iptrace_out(void) { | 
 | } | } | 
 | #endif | #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; | corestat.drawframe = draw; | 
 |  | soundmng_sync(); | 
 |  |  | 
| v_cnt = 0; | corestat.tl = 266 * pccore.multiple / 2; | 
| s_cnt = 0; | corestat.vl = min(corestat.tl, crtc.s.CRT_YL); | 
| inttiming = xmilcfg.CPU8MHz & 1; | corestat.vsync = 0; | 
|  | nevent_set(NEVENT_FRAMES, corestat.vl * 250, | 
| while(s_cnt < 266) { | nvitem_vdisp, NEVENT_RELATIVE); | 
| while(h_cnt < pccore.HSYNC_CLK) { | do { | 
| #if IPTRACE | #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; | treip[trpos & (IPTRACE - 1)] = Z80_PC; | 
 | trpos++; | trpos++; | 
 | #endif | #endif | 
| Z80_EXECUTE(); | Z80_STEP(); | 
| 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(); |  | 
| } |  | 
 | } | } | 
| } | #endif | 
| sound_sync(); | nevent_progress(); | 
| calendar_inc(); | ievent_progress(); | 
|  | } while(corestat.vsync < 2); | 
|  |  | 
 | scrnupdate(); | scrnupdate(); | 
 |  | calendar_inc(); | 
 |  | sound_sync(); | 
 | } | } | 
 |  |  |