--- np2/io/iocore.c 2003/10/16 17:57:49 1.1.1.1 +++ np2/io/iocore.c 2004/03/19 00:30:01 1.13 @@ -1,5 +1,5 @@ #include "compiler.h" -#include "i286.h" +#include "cpucore.h" #include "pccore.h" #include "iocore.h" #include "cbuscore.h" @@ -12,18 +12,18 @@ _ARTIC artic; _CGROM cgrom; _CGWINDOW cgwindow; - _CPUIO cpuio; _CRTC crtc; _DMAC dmac; _EGC egc; - _EXTMEM extmem; + _EPSONIO epsonio; + _EMSIO emsio; _FDC fdc; _GDC gdc; _GDCS gdcs; _GRCG grcg; - _ITF itf; - _KEYB keyb; + _KEYBRD keybrd; _MOUSEIF mouseif; + _NECIO necio; _NMIIO nmiio; _NP2SYSP np2sysp; _PIC pic; @@ -50,16 +50,17 @@ typedef struct { typedef struct { IOFUNC base[256]; + UINT busclock; LISTARRAY iotbl; } _IOCORE, *IOCORE; static _IOCORE iocore; -static BYTE ioterminate[0x100]; +static UINT8 ioterminate[0x100]; // ---- -static void IOOUTCALL defout(UINT port, BYTE dat) { +static void IOOUTCALL defout8(UINT port, REG8 dat) { if ((port & 0xfff0) == cs4231.port) { cs4231io_w8(port, dat); @@ -69,9 +70,10 @@ static void IOOUTCALL defout(UINT port, dipsw_w8(port, dat); return; } +// TRACEOUT(("defout8 - %x %x %.4x %.4x", port, dat, CPU_CS, CPU_IP)); } -static BYTE IOINPCALL definp(UINT port) { +static REG8 IOINPCALL definp8(UINT port) { if ((port & 0xfff0) == cs4231.port) { return(cs4231io_r8(port)); @@ -79,6 +81,7 @@ static BYTE IOINPCALL definp(UINT port) if ((port & 0xf0ff) == 0x801e) { return(dipsw_r8(port)); } +// TRACEOUT(("definp8 - %x %.4x %.4x", port, CPU_CS, CPU_IP)); return(0xff); } @@ -346,7 +349,7 @@ BOOL iocore_attachinp(UINT port, IOINP f void iocore_create(void) { UINT i; -const BYTE *p; +const UINT8 *p; UINT r; ZeroMemory(&iocore, sizeof(iocore)); @@ -355,7 +358,7 @@ const BYTE *p; p = termtbl[i].item; r = termtbl[i].items; do { - ioterminate[*p++] = (BYTE)(i + 1); + ioterminate[*p++] = (UINT8)(i + 1); } while(--r); } } @@ -389,8 +392,8 @@ BOOL iocore_build(void) { goto icbld_err; } for (i=0; i<256; i++) { - cmn->ioout[i] = defout; - cmn->ioinp[i] = definp; + cmn->ioout[i] = defout8; + cmn->ioinp[i] = definp8; } sys = (IOFUNC)listarray_append(iotbl, cmn); if (sys == NULL) { @@ -416,7 +419,7 @@ icbld_err: static const IOCBFN resetfn[] = { // PC-9801 System... - cgrom_reset, cpuio_reset, crtc_reset, + cgrom_reset, crtc_reset, dmac_reset, gdc_reset, fdc_reset, keyboard_reset, nmiio_reset, pic_reset, printif_reset, rs232c_reset, systemport_reset, @@ -426,8 +429,15 @@ static const IOCBFN resetfn[] = { itimer_reset, mouseif_reset, // extend - itf_reset, artic_reset, egc_reset, - extmem_reset, np2sysp_reset}; + artic_reset, egc_reset, np2sysp_reset, + necio_reset, epsonio_reset, +#if !defined(CPUCORE_IA32) + emsio_reset, +#endif +#if defined(SUPPORT_PC9821) + pcidev_reset, +#endif + }; static const IOCBFN bindfn[] = { // PC-9801 System... @@ -441,8 +451,15 @@ static const IOCBFN bindfn[] = { itimer_bind, mouseif_bind, // extend - itf_bind, artic_bind, egc_bind, - extmem_bind, np2sysp_bind}; + artic_bind, egc_bind, np2sysp_bind, + necio_bind, epsonio_bind, +#if !defined(CPUCORE_IA32) + emsio_bind, +#endif +#if defined(SUPPORT_PC9821) + pcidev_bind, +#endif + }; void iocore_cb(const IOCBFN *cbfn, UINT count) { @@ -460,29 +477,35 @@ void iocore_reset(void) { void iocore_bind(void) { + iocore.busclock = pccore.multiple; iocore_cb(bindfn, sizeof(bindfn)/sizeof(IOCBFN)); } -void IOOUTCALL iocore_out8(UINT port, BYTE dat) { +void IOOUTCALL iocore_out8(UINT port, REG8 dat) { IOFUNC iof; +// VERBOSE(("iocore_out8(%x, %x)", port, dat)); + CPU_REMCLOCK -= iocore.busclock; iof = iocore.base[(port >> 8) & 0xff]; iof->ioout[port & 0xff](port, dat); } -BYTE IOINPCALL iocore_inp8(UINT port) { +REG8 IOINPCALL iocore_inp8(UINT port) { IOFUNC iof; +// VERBOSE(("iocore_inp8(%x)", port)); + CPU_REMCLOCK -= iocore.busclock; iof = iocore.base[(port >> 8) & 0xff]; return(iof->ioinp[port & 0xff](port)); } -void IOOUTCALL iocore_out16(UINT port, UINT16 dat) { +void IOOUTCALL iocore_out16(UINT port, REG16 dat) { IOFUNC iof; + CPU_REMCLOCK -= iocore.busclock; if ((port & 0xfff1) == 0x04a0) { egc_w16(port, dat); return; @@ -497,22 +520,23 @@ void IOOUTCALL iocore_out16(UINT port, U case TERM_MINUS: case TERM_EXT08: iof = iocore.base[(port >> 8) & 0xff]; - iof->ioout[port & 0xff](port, (BYTE)dat); + iof->ioout[port & 0xff](port, (UINT8)dat); return; } } iof = iocore.base[(port >> 8) & 0xff]; - iof->ioout[port & 0xff](port, (BYTE)dat); + iof->ioout[port & 0xff](port, (UINT8)dat); port++; iof = iocore.base[(port >> 8) & 0xff]; - iof->ioout[port & 0xff](port, (BYTE)(dat >> 8)); + iof->ioout[port & 0xff](port, (UINT8)(dat >> 8)); } -UINT16 IOINPCALL iocore_inp16(UINT port) { +REG16 IOINPCALL iocore_inp16(UINT port) { IOFUNC iof; - BYTE ret; + REG8 ret; + CPU_REMCLOCK -= iocore.busclock; if ((port & 0xfffc) == 0x005c) { return(artic_r16(port)); } @@ -524,7 +548,7 @@ UINT16 IOINPCALL iocore_inp16(UINT port) case TERM_ACTIVE: ret = iof->ioinp[port & 0xff](port); - return((I286_AX & 0xff00) + ret); + return((CPU_AX & 0xff00) + ret); case TERM_PLUS: ret = iof->ioinp[port & 0xff](port); @@ -544,3 +568,17 @@ UINT16 IOINPCALL iocore_inp16(UINT port) return((UINT16)((iof->ioinp[port & 0xff](port) << 8) + ret)); } +void IOOUTCALL iocore_out32(UINT port, UINT32 dat) { + + iocore_out16(port, (UINT16)dat); + iocore_out16(port+2, (UINT16)(dat >> 16)); +} + +UINT32 IOINPCALL iocore_inp32(UINT port) { + + REG16 ret; + + ret = iocore_inp16(port); + return(ret + (iocore_inp16(port+2) << 16)); +} +