--- np2/pccore.c 2003/10/20 12:08:01 1.6 +++ np2/pccore.c 2004/01/09 07:27:15 1.43 @@ -1,78 +1,76 @@ #include "compiler.h" +#include "strres.h" #include "dosio.h" -#include "scrnmng.h" #include "soundmng.h" #include "sysmng.h" #include "timemng.h" - -#include "i286.h" -#include "memory.h" +#include "cpucore.h" +#include "np2ver.h" #include "pccore.h" - #include "iocore.h" #include "cbuscore.h" - +#include "pc9861k.h" +#include "mpu98ii.h" +#include "bios.h" +#include "biosmem.h" #include "vram.h" #include "scrndraw.h" +#include "dispsync.h" #include "palettes.h" #include "maketext.h" #include "maketgrp.h" #include "makegrph.h" - #include "sound.h" -#include "beep.h" #include "fmboard.h" -#include "bios.h" -#include "timing.h" -#include "dialog.h" -#include "fddfile.h" -#include "fdd_mtr.h" -#include "calendar.h" +#include "beep.h" +#include "s98.h" #include "font.h" -#include "dispsync.h" -//#include "hostdrv.h" -#include "mpu98ii.h" #include "diskdrv.h" +#include "fddfile.h" +#include "fdd_mtr.h" #include "sxsi.h" - -#include "keydisp.h" -#include "pc9861k.h" +#include "calendar.h" +#include "timing.h" +#include "debugsub.h" +#if defined(SUPPORT_HOSTDRV) +#include "hostdrv.h" +#endif - const char np2version[] = "ver.0.38"; + const char np2version[] = NP2VER_CORE; - NP2CFG np2cfg = { - PCBASECLOCK25, 4, 0, - {0x3e, 0x63, 0x7a}, - {0x48, 0x05, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x6E}, - {0x0c, 0x08, 0x0c, 0x06, 0x03, 0x0c}, // ver0.27 - {1, 1, 6, 1, 8, 1}, - 0, 4, 32, 22050, 800, 0, 1, 1, 0, - 0, 0, -// 0, 0, {1, 2, 2, 1}, // ver0.28 - 0, {0, 0, 0}, 0xd1, 0x7f, 0xd1, 0, 0, 1, 0x82, // ver0.30 - 1, 80, 3, 1, 1, 0, 0x000000, 0xffffff, - 0, 0, 0, 0x40, 0, - 64, 64, 64, 64, 64, // ver0.27 + NP2CFG np2cfg = { + 0, 1, 0, 32, 0, 0, 0x40, + 0, 0, 0, 0, + {0x3e, 0x63, 0x7a}, 0, + 0, 0, {1, 1, 6, 1, 8, 1}, + + "VX", PCBASECLOCK25, 4, + {0x48, 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x6e}, + 1, 1, 2, 1, 0x000000, 0xffffff, + 22050, 800, 4, 0, + {0, 0, 0}, 0xd1, 0x7f, 0xd1, 0, 0, 1, + 3, {0x0c, 0x0c, 0x08, 0x06, 0x03, 0x0c}, 64, 64, 64, 64, 64, + 1, 0x82, 0, {0x17, 0x04, 0x1f}, {0x0c, 0x0c, 0x02, 0x10, 0x3f, 0x3f}, - 2, 1, 0, 0, - {"", ""}, ""}; + 1, 80, 0, 0, + {"", ""}, "", "", ""}; PCCORE pc = { PCBASECLOCK25, - 4, - 4 * PCBASECLOCK25, - 4 * PCBASECLOCK25 * 50 / 3104, - 4 * PCBASECLOCK25 * 5 / 3104, - 4 * PCBASECLOCK25 / 120, - 4 * PCBASECLOCK25 / 1920, - 4 * PCBASECLOCK25 / 3125, - (4 * PCBASECLOCK25 / 56400), - 100, 20, - 0}; + 4, + 4 * PCBASECLOCK25, + 4 * PCBASECLOCK25 * 50 / 3104, + 4 * PCBASECLOCK25 * 5 / 3104, + 4 * PCBASECLOCK25 / 120, + 4 * PCBASECLOCK25 / 1920, + 4 * PCBASECLOCK25 / 3125, + 4 * PCBASECLOCK25 / 56400, + 100, 20, 0, PCMODEL_VX}; // on=0, off=1 - BYTE dip_default[3] = {0x3e, 0x63, 0x7a}; - BYTE msw_default[8] = {0x48, 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x6E}; +// BYTE dip_default[3] = {0x3e, 0x63, 0x7a}; +static const BYTE msw_default[8] = + {0x48, 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x6e}; BYTE screenupdate = 3; int screendispflag = 1; @@ -80,12 +78,28 @@ BOOL drawframe; UINT drawcount = 0; - BYTE mem[0x200000]; // ver0.28 - // --------------------------------------------------------------------------- -static void setvsyncclock(void) { // ver0.28 +void getbiospath(char *path, const char *fname, int maxlen) { + +const char *p; + + p = np2cfg.biospath; + if (p[0]) { + file_cpyname(path, p, maxlen); + file_setseparator(path, maxlen); + file_catname(path, fname, maxlen); + } + else { + file_cpyname(path, file_getcd(fname), maxlen); + } +} + + +// ---- + +static void setvsyncclock(void) { UINT vfp; UINT vbp; @@ -122,7 +136,18 @@ static void setvsyncclock(void) { pc.vsyncclock = cnt - pc.dispclock; } -static void setpcclock(UINT base, UINT multiple) { // ver0.28 +static void setpcclock(const char *modelstr, UINT base, UINT multiple) { + + UINT8 model; + + model = PCMODEL_VX; + if (!milstr_cmp(modelstr, str_VM)) { + model = PCMODEL_VM; + } + else if (!milstr_cmp(modelstr, str_EPSON)) { + model = PCMODEL_EPSON | PCMODEL_VM; + } + pc.model = model; if (base >= ((PCBASECLOCK25 + PCBASECLOCK20) / 2)) { pc.baseclock = PCBASECLOCK25; // 2.5MHz @@ -162,6 +187,9 @@ static void sound_init(void) { rate = 0; } sound_create(rate, np2cfg.delayms); +#if defined(SUPPORT_WAVEMIX) + wavemix_initialize(rate); +#endif beep_initialize(rate); beep_setvol(np2cfg.BEEP_VOL); tms3631_initialize(rate); @@ -176,17 +204,23 @@ static void sound_init(void) { adpcm_setvol(np2cfg.vol_adpcm); pcm86gen_initialize(rate); pcm86gen_setvol(np2cfg.vol_pcm); + cs4231_initialize(rate); } static void sound_term(void) { soundmng_stop(); +#if defined(SUPPORT_WAVEMIX) + wavemix_deinitialize(); +#endif rhythm_deinitialize(); sound_destroy(); } void pccore_init(void) { + CPU_INITIALIZE(); + pal_initlcdtable(); pal_makelcdpal(); pal_makeskiptable(); @@ -207,16 +241,26 @@ void pccore_init(void) { pc9861k_construct(); iocore_create(); + +#if defined(SUPPORT_HOSTDRV) + hostdrv_initialize(); +#endif } void pccore_term(void) { +#if defined(SUPPORT_HOSTDRV) + hostdrv_deinitialize(); +#endif + + sound_term(); + fdd_eject(0); fdd_eject(1); fdd_eject(2); fdd_eject(3); - extmemmng_clear(); // ver0.28 + extmemmng_clear(); iocore_destroy(); @@ -224,8 +268,6 @@ void pccore_term(void) { rs232c_destruct(); mpu98ii_destruct(); - sound_term(); - sxsi_trash(); } @@ -237,8 +279,8 @@ void pccore_cfgupdate(void) { renewal = FALSE; for (i=0; i<8; i++) { - if (np2cfg.memsw[i] != mem[0xa3fe2 + i*4]) { - np2cfg.memsw[i] = mem[0xa3fe2 + i*4]; + if (np2cfg.memsw[i] != mem[MEMB_MSW + i*4]) { + np2cfg.memsw[i] = mem[MEMB_MSW + i*4]; renewal = TRUE; } } @@ -251,17 +293,15 @@ void pccore_reset(void) { int i; -// reset_hostdrv(); - ZeroMemory(mem, 0x10fff0); // ver0.28 ZeroMemory(mem + VRAM1_B, 0x18000); ZeroMemory(mem + VRAM1_E, 0x08000); ZeroMemory(mem + FONT_ADRS, 0x08000); - i286_reset(); - CPUTYPE = 0; + CPU_RESET(); + CPU_TYPE = 0; if (np2cfg.dipsw[2] & 0x80) { - CPUTYPE = CPUTYPE_V30; + CPU_TYPE = CPUTYPE_V30; } //メモリスイッチ @@ -279,23 +319,31 @@ void pccore_reset(void) { sound_init(); } - setpcclock(np2cfg.baseclock, np2cfg.multiple); + setpcclock(np2cfg.model, np2cfg.baseclock, np2cfg.multiple); sound_changeclock(); beep_changeclock(); nevent_init(); sound_reset(); +#if defined(SUPPORT_WAVEMIX) + wavemix_bind(); +#endif + + if (pc.model & PCMODEL_EPSON) { // RAM ctrl + CPU_RAM_D000 = 0xffff; + } iocore_reset(); // サウンドでpicを呼ぶので… cbuscore_reset(); fmboard_reset(np2cfg.SOUND_SW); + i286_memorymap((pc.model & PCMODEL_EPSON)?1:0); iocore_build(); iocore_bind(); cbuscore_bind(); fmboard_bind(); - timing_init(); + timing_reset(); fddmtr_init(); calendar_init(); vram_init(); @@ -307,21 +355,25 @@ void pccore_reset(void) { if (np2cfg.ITF_WORK) { CS_BASE = 0xf0000; - I286_CS = 0xf000; - I286_IP = 0xfff0; + CPU_CS = 0xf000; + CPU_IP = 0xfff0; } else { for (i=0; i<8; i++) { mem[0xa3fe2 + i*4] = msw_default[i]; } CS_BASE = 0xfd800; - I286_CS = 0xfd80; - I286_IP = 0x0002; + CPU_CS = 0xfd80; + CPU_IP = 0x0002; } - i286_resetprefetch(); + CPU_CLEARPREFETCH(); sysmng_cpureset(); soundmng_play(); + +#if defined(SUPPORT_HOSTDRV) + hostdrv_reset(); +#endif } static void drawscreen(void) { @@ -473,9 +525,9 @@ void screendisp(NEVENTITEM item) { void screenvsync(NEVENTITEM item) { - vramop.tramwait = np2cfg.wait[1]; - vramop.vramwait = np2cfg.wait[3]; - vramop.grcgwait = np2cfg.wait[5]; + MEMWAIT_TRAM = np2cfg.wait[1]; + MEMWAIT_VRAM = np2cfg.wait[3]; + MEMWAIT_GRCG = np2cfg.wait[5]; gdc_work(GDCWORK_MASTER); gdc.vsync = 0x20; if (gdc.vsyncint) { @@ -491,70 +543,84 @@ void screenvsync(NEVENTITEM item) { (void)item; } + // --------------------------------------------------------------------------- +#if defined(TRACE) +static int resetcnt = 0; +static int execcnt = 0; +int piccnt = 0; +#endif + void pccore_exec(BOOL draw) { drawframe = draw; + keyext_flash(); soundmng_sync(); mouseif_sync(); pal_eventclear(); gdc.vsync = 0; screendispflag = 1; - vramop.tramwait = np2cfg.wait[0]; - vramop.vramwait = np2cfg.wait[2]; - vramop.grcgwait = np2cfg.wait[4]; + MEMWAIT_TRAM = np2cfg.wait[0]; + MEMWAIT_VRAM = np2cfg.wait[2]; + MEMWAIT_GRCG = np2cfg.wait[4]; nevent_set(NEVENT_FLAMES, pc.dispclock, screenvsync, NEVENT_RELATIVE); // nevent_get1stevent(); while(screendispflag) { +#if defined(TRACE) + resetcnt++; +#endif pic_irq(); - if (cpuio.reset_req) { - cpuio.reset_req = 0; - I286_CS = 0xf000; + if (CPU_RESETREQ) { + CPU_RESETREQ = 0; +#if 1 + CPU_SHUT(); +#else + CPU_CS = 0xf000; CS_BASE = 0xf0000; - I286_IP = 0xfff0; -#ifdef CPU386 // defineを変えてね - I286_DX = 0x0300; + CPU_IP = 0xfff0; +#if defined(CPUCORE_IA32) + CPU_DX = 0x0300; +#endif + CPU_CLEARPREFETCH(); #endif - i286_resetprefetch(); } #if 1 // ndef TRACE - if (I286_REMCLOCK > 0) { - if (!(CPUTYPE & CPUTYPE_V30)) { - i286(); + if (CPU_REMCLOCK > 0) { + if (!(CPU_TYPE & CPUTYPE_V30)) { + CPU_EXEC(); } else { - v30(); + CPU_EXECV30(); } } #else - while(nevent.remainclock > 0) { -{ -static FILEH fh = FILEH_INVALID; -if (I286_CS == 0x0e14) { - if (fh == FILEH_INVALID) { - fh = file_create("log.txt"); - } -} -if (fh != FILEH_INVALID) { -char buf[32]; -wsprintf(buf, "%.4x:%.4x\r\n", I286_CS, I286_IP); -file_write(fh, buf, strlen(buf)); -} -} - i286_step(); + while(CPU_REMCLOCK > 0) { + TRACEOUT(("%.4x:%.4x", CPU_CS, CPU_IP)); + i286x_step(); } #endif nevent_progress(); } - artic_callback(); // ver0.28 + artic_callback(); mpu98ii_callback(); diskdrv_callback(); calendar_inc(); + S98_sync(); sound_sync(); // happy! + +#if defined(TRACE) + execcnt++; + if (execcnt >= 60) { +// TRACEOUT(("resetcnt = %d / pic %d", resetcnt, piccnt)); + execcnt = 0; + resetcnt = 0; + piccnt = 0; + } +#endif }