--- xmil/io/ppi.c 2004/08/12 13:32:52 1.11 +++ xmil/io/ppi.c 2005/02/04 06:42:11 1.18 @@ -1,7 +1,7 @@ #include "compiler.h" +#include "z80core.h" #include "pccore.h" #include "iocore.h" -#include "makescrn.h" // ---- 8255 PPI〜 @@ -9,31 +9,40 @@ static REG8 getportb(void) { REG8 ret; - UINT v; - - ret = cmt_test(); // | cmt_read(); // THUNDER BALL + REG8 ppib; +#if defined(MAINFRAMES_OLD) + SINT32 clock; +#endif - v = pccore_getraster(NULL); - if (v < crtc.e.dl) { +// if (subcpu.IBF) { +// subcpu.IBF = 0; +// ret |= 0x40; // 1:SUB-CPU BUSY +// } +// if (subcpu.OBF) { +// ret |= 0x20; // 1:SUB-CPU Data empty +// } + + ppib = iocore.s.ppib; + ret = ppib; + +// ret |= cmt_test(); // THUNDER BALL +// /* -> */ ppib |= 0x01; + + iocore.s.ppib = (UINT8)((ppib & (~0x40)) | 0x01); + +// ret |= cmt_read(); + +#if defined(MAINFRAMES_OLD) + clock = CPU_CLOCKCOUNT - iocore.e.framestartclock; + if (clock < iocore.e.dispclock) { ret |= 0x80; // 1:DISP } - if (subcpu.IBF) { - subcpu.IBF = 0; - ret |= 0x40; // 1:SUB-CPU BUSY - } - if (subcpu.OBF) { - ret |= 0x20; // 1:SUB-CPU Data empty - } - if (memio.ram) { - ret |= 0x10; // 1:RAM - } -#if 1 - if (!(v < crtc.e.vs)) { - ret |= 0x04; // V-SYNC - } -#else // ラプラステスト…VYSNCが長すぎるらしい - if (v_cnt == crtc.e.vs) { - ret |= 0x04; + + // 実機の動きを見ると どうも 読み込んだらリセットされるようだ? + // 有効範囲が絞れるならそうすべき(VSYNCを取りこぼすソフトがある + clock -= iocore.e.vsyncstart; + if ((clock >= 0) && (clock < iocore.e.vpulseclock)) { + ret |= 0x04; // 1:V-SYNC } #endif return(ret); @@ -41,28 +50,17 @@ static REG8 getportb(void) { static void setportc(REG8 dat) { - REG8 oldc; - UINT8 xl; + REG8 modify; - oldc = ppi.portc; - if (crtc.s.TXT_XL == 40) { - oldc |= 0x40; - } - else { - oldc &= ~0x40; - } + modify = ppi.portc ^ dat; ppi.portc = dat; - // cmt_write((REG8)(dat & 1)); - if ((oldc & 0x20) && (!(dat & 0x20))) { + if ((modify & 0x20) && (!(dat & 0x20))) { iocore.s.mode = 1; +// TRACEOUT(("iocore.s.mode = 1")); } - xl = ((dat & 0x40)?40:80); - if (crtc.s.TXT_XL != xl) { - crtc.s.TXT_XL = (UINT8)xl; -// crtc.s.GRP_XL = xl << 3; - vrambank_patch(); - scrnallflash = 1; + if (modify & 0x40) { + crtc_setwidth((REG8)(dat & 0x40)); } } @@ -120,14 +118,7 @@ REG8 IOINPCALL ppi_i(UINT port) { return(getportb()); case 2: -#if 1 - if (crtc.s.TXT_XL == 40) { - ppi.portc |= 0x40; - } - else { - ppi.portc &= ~0x40; - } -#endif + // mode? return(ppi.portc); case 3: @@ -144,7 +135,7 @@ void ppi_initialize(void) { ppi.porta = 0x00; ppi.portb = 0xff; ppi.portc = 0xff; - ppi.mode = 0x9b; + ppi.mode = 0x82; } void ppi_reset(void) {