--- xmil/io/iocore.c 2004/08/05 04:53:15 1.4 +++ xmil/io/iocore.c 2008/06/02 20:07:31 1.12 @@ -1,16 +1,18 @@ + +/* #define IOCOUNTER */ + #include "compiler.h" #include "pccore.h" #include "iocore.h" IOCORE iocore; - CGROM cgrom; // x1k; + CGROM cgrom; CMT cmt; CRTC crtc; CTC ctc; DMAC dma; FDC fdc; - MEMIO memio; PCG pcg; PPI ppi; SIO sio; @@ -18,7 +20,7 @@ SUBCPU subcpu; -// ---- +/* ---- */ static void IOOUTCALL dummy_out(UINT port, REG8 dat) { @@ -33,42 +35,7 @@ static REG8 IOINPCALL dummy_inp(UINT por } -// ---- - -static void IOOUTCALL opm_o(UINT port, REG8 dat) { - - REG8 lsb; - - lsb = (UINT8)port; - if (lsb == 0x00) { // 0700 - sndboard_opmreg(port, dat); - } - else if (lsb == 0x01) { // 0701 - sndboard_opmdat(port, dat); - } - else if ((lsb & (~3)) == 0x04) { // 0704-0707 - ctc_o(port, dat); - } -} - -static REG8 IOINPCALL opm_i(UINT port) { - - REG8 lsb; - - lsb = (UINT8)port; - if ((lsb & (~1)) == 0x00) { // 0700/0701 - return(sndboard_opmsta(port)); - } - else if ((lsb & (~3)) == 0x04) { // 0704-0707 - return(ctc_i(port)); - } - else { - return(0xff); - } -} - - -// ---- +/* ---- */ static void IOOUTCALL port1fxx_o(UINT port, REG8 dat) { @@ -76,28 +43,31 @@ static void IOOUTCALL port1fxx_o(UINT po REG8 msb6; lsb = (UINT8)port; + if (lsb == 0xd0) { + scrn_o(port, dat); + return; + } if (lsb < 0x80) { return; } msb6 = lsb & (~3); - if (pccore.ROM_TYPE >= 2) { - if (lsb < 0x90) { - dmac_o(port, dat); - return; - } - if ((msb6 == 0xa0) || (msb6 == 0xa8)) { - ctc_o(port, dat); - return; - } - if (lsb == 0xd0) { - scrn_o(port, dat); - return; - } - if (lsb == 0xe0) { - blackctrl_o(port, dat); - return; - } + if (lsb < 0x90) { + dmac_o(port, dat); + return; + } + if (msb6 == 0x90) { + sio_o(port, dat); + return; } + if ((msb6 == 0xa0) || (msb6 == 0xa8)) { + ctc_o(port, dat); + return; + } + if (lsb == 0xe0) { + blackctrl_o(port, dat); + return; + } +#if defined(SUPPORT_TURBOZ) if (pccore.ROM_TYPE >= 3) { if (lsb == 0xb0) { extpal_o(port, dat); @@ -116,10 +86,7 @@ static void IOOUTCALL port1fxx_o(UINT po return; } } - if (msb6 == 0x90) { - sio_o(port, dat); - return; - } +#endif } static REG8 IOINPCALL port1fxx_i(UINT port) { @@ -128,24 +95,26 @@ static REG8 IOINPCALL port1fxx_i(UINT po REG8 msb6; lsb = (UINT8)port; + if (lsb == 0xd0) { + return(scrn_i(port)); + } if (lsb < 0x80) { return(0xff); } msb6 = lsb & (~3); - if (pccore.ROM_TYPE >= 2) { - if (lsb < 0x90) { - return(dmac_i(port)); - } - if ((msb6 == 0xa0) || (msb6 == 0xa8)) { - return(ctc_i(port)); - } - if (lsb == 0xd0) { - return(scrn_i(port)); - } - if (lsb >= 0xf0) { - return(dipsw_i(port)); - } + if (lsb < 0x90) { + return(dmac_i(port)); + } + if (msb6 == 0x90) { + return(sio_i(port)); + } + if ((msb6 == 0xa0) || (msb6 == 0xa8)) { + return(ctc_i(port)); + } + if (lsb >= 0xf0) { + return(dipsw_i(port)); } +#if defined(SUPPORT_TURBOZ) if (pccore.ROM_TYPE >= 3) { if (lsb == 0xb0) { return(extpal_i(port)); @@ -163,16 +132,14 @@ static REG8 IOINPCALL port1fxx_i(UINT po return(blackctrl_i(port)); } } - if (msb6 == 0x90) { - return(sio_i(port)); - } +#endif return(0xff); } -// ---- +/* ---- */ -static const INPHTBL definp[0x20] = { +static const IOINP definp[0x20] = { dummy_inp, dummy_inp, dummy_inp, dummy_inp, dummy_inp, dummy_inp, @@ -191,9 +158,9 @@ static const INPHTBL definp[0x20] = { dummy_inp, subcpu_i, ppi_i, sndboard_psgsta, dummy_inp, dummy_inp, - dummy_inp, port1fxx_i}; + dummy_inp, dummy_inp}; -static const OUTHTBL defout[0x20] = { +static const IOOUT defout[0x20] = { dummy_out, dummy_out, dummy_out, dummy_out, dummy_out, dummy_out, @@ -206,68 +173,103 @@ static const OUTHTBL defout[0x20] = { palette_o, palette_o, palette_o, ply_o, - pcg_o, pcg_o, + dummy_out, pcg_o, pcg_o, pcg_o, crtc_o, subcpu_o, ppi_o, sndboard_psgdat, sndboard_psgreg, memio_rom, - memio_ram, port1fxx_o}; + memio_ram, dummy_out}; + + +typedef void (*INITFN)(void); +static const INITFN initfn[] = { + 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}; -// ---- +/* ---- */ void iocore_reset(void) { + UINT i; + ZeroMemory(&iocore, sizeof(iocore)); - CopyMemory(iocore.inph, definp, sizeof(definp)); - CopyMemory(iocore.outh, defout, sizeof(defout)); + CopyMemory(iocore.f.inpfn, definp, sizeof(definp)); + CopyMemory(iocore.f.outfn, defout, sizeof(defout)); + for (i=0; i<0x10; i++) { + iocore.f.inpfn[i+0x20] = tram_atr_i; + iocore.f.inpfn[i+0x30] = tram_ank_i; + iocore.f.outfn[i+0x20] = tram_atr_o; + iocore.f.outfn[i+0x30] = tram_ank_o; + } if (pccore.ROM_TYPE >= 2) { - iocore.inph[0x0b].fn = memio_ems_i; - iocore.outh[0x0b].fn = memio_ems_o; +#if defined(SUPPORT_BANKMEM) + iocore.f.inpfn[0x0b] = memio_bank_i; + iocore.f.outfn[0x0b] = memio_bank_o; +#endif + iocore.f.inpfn[0x1f] = port1fxx_i; + iocore.f.outfn[0x1f] = port1fxx_o; + for (i=0; i<8; i++) { + iocore.f.inpfn[i+0x38] = tram_knj_i; + iocore.f.outfn[i+0x38] = tram_knj_o; + } } +#if defined(SUPPORT_TURBOZ) if (pccore.ROM_TYPE >= 3) { - iocore.inph[0x10].fn = palette_i; - iocore.inph[0x11].fn = palette_i; - iocore.inph[0x12].fn = palette_i; - iocore.inph[0x13].fn = ply_i; + iocore.f.inpfn[0x10] = palette_i; + iocore.f.inpfn[0x11] = palette_i; + iocore.f.inpfn[0x12] = palette_i; + iocore.f.inpfn[0x13] = ply_i; } +#endif +#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) if (pccore.SOUND_SW) { - iocore.inph[0x07].fn = opm_i; - iocore.outh[0x07].fn = opm_o; + iocore.f.inpfn[0x07] = opm_i; + iocore.f.outfn[0x07] = opm_o; + } +#endif + for (i=0; i> 8; - if (ppi.IO_MODE) { + if (iocore.s.mode) { gram2_o(port, dat); } else if (msb >= 0x40) { gram_o(port, dat); - } - else if (msb >= 0x20) { - tram_o(port, dat); +#if defined(TRACE) && defined(IOCOUNTER) + ocounter[0x2000 + (port >> 14)]++; +#endif } else { - (*iocore.outh[msb].fn)(port, dat); +#if defined(TRACE) && defined(IOCOUNTER) + if (port < 0x2000) { + ocounter[port]++; + } + else { + ocounter[0x1ffc + (port >> 11)]++; + } +#endif + (*iocore.f.outfn[msb])(port, dat); } } @@ -276,15 +278,23 @@ REG8 IOINPCALL iocore_inp(UINT port) { UINT msb; msb = port >> 8; - ppi.IO_MODE = 0; + iocore.s.mode = 0; if (msb >= 0x40) { +#if defined(TRACE) && defined(IOCOUNTER) + icounter[0x2000 + (port >> 14)]++; +#endif return(gram_i(port)); } - else if (msb >= 0x20) { - return(tram_i(port)); - } else { - return((*iocore.inph[msb].fn)(port)); +#if defined(TRACE) && defined(IOCOUNTER) + if (port < 0x2000) { + icounter[port]++; + } + else { + icounter[0x1ffc + (port >> 11)]++; + } +#endif + return((*iocore.f.inpfn[msb])(port)); } }