--- np2/io/mouseif.c 2003/11/21 06:51:11 1.5 +++ np2/io/mouseif.c 2007/11/11 13:54:14 1.17 @@ -1,8 +1,9 @@ #include "compiler.h" #include "mousemng.h" -#include "i286.h" +#include "cpucore.h" #include "pccore.h" #include "iocore.h" +#include "keystat.h" // マウス ver0.28 @@ -19,12 +20,12 @@ void mouseif_sync(void) { // 今回の移動量を取得 mouseif.b = mousemng_getstat(&mouseif.sx, &mouseif.sy, 1); if (np2cfg.KEY_MODE == 3) { - mouseif.b &= keyext_getmouse(&mouseif.sx, &mouseif.sy); + mouseif.b &= keystat_getmouse(&mouseif.sx, &mouseif.sy); } mouseif.rx = mouseif.sx; mouseif.ry = mouseif.sy; - mouseif.lastc = I286_CLOCK + I286_BASECLOCK + I286_REMCLOCK; + mouseif.lastc = CPU_CLOCK + CPU_BASECLOCK + CPU_REMCLOCK; } static void calc_mousexy(void) { @@ -32,7 +33,7 @@ static void calc_mousexy(void) { UINT32 clock; SINT32 diff; - clock = I286_CLOCK + I286_BASECLOCK + I286_REMCLOCK; + clock = CPU_CLOCK + CPU_BASECLOCK + CPU_REMCLOCK; diff = clock - mouseif.lastc; if (diff >= 2000) { SINT32 dx; @@ -41,14 +42,14 @@ static void calc_mousexy(void) { diff /= 1000; dx = mouseif.sx; if (dx > 0) { - dx = dx * diff / pc.frame1000; + dx = dx * diff / mouseif.moveclock; if (dx > mouseif.rx) { dx = mouseif.rx; } } else if (dx < 0) { dx *= -1; - dx = dx * diff / pc.frame1000; + dx = dx * diff / mouseif.moveclock; dx *= -1; if (dx < mouseif.rx) { dx = mouseif.rx; @@ -59,14 +60,14 @@ static void calc_mousexy(void) { dy = mouseif.sy; if (dy > 0) { - dy = dy * diff / pc.frame1000; + dy = dy * diff / mouseif.moveclock; if (dy > mouseif.ry) { dy = mouseif.ry; } } else if (dy < 0) { dy *= -1; - dy = dy * diff / pc.frame1000; + dy = dy * diff / mouseif.moveclock; dy *= -1; if (dy < mouseif.ry) { dy = mouseif.ry; @@ -81,17 +82,17 @@ static void calc_mousexy(void) { void mouseint(NEVENTITEM item) { if (item->flag & NEVENT_SETEVENT) { - if (!(mouseif.portc & 0x10)) { + if (!(mouseif.upd8255.portc & 0x10)) { pic_setirq(0x0d); - nevent_set(NEVENT_MOUSE, pc.mouseclock << mouseif.timing, + nevent_set(NEVENT_MOUSE, mouseif.intrclock << mouseif.timing, mouseint, NEVENT_RELATIVE); } } } -static void setportc(BYTE value) { +static void setportc(REG8 value) { - if ((value & 0x80) && (!(mouseif.portc & 0x80))) { + if ((value & 0x80) && (!(mouseif.upd8255.portc & 0x80))) { calc_mousexy(); mouseif.latch_x = mouseif.x; mouseif.x = 0; @@ -110,110 +111,141 @@ static void setportc(BYTE value) { mouseif.latch_y = -128; } } - if ((value ^ mouseif.portc) & 0x10) { + if ((value ^ mouseif.upd8255.portc) & 0x10) { if (!(value & 0x10)) { if (!nevent_iswork(NEVENT_MOUSE)) { - nevent_set(NEVENT_MOUSE, pc.mouseclock << mouseif.timing, + // 割り込みを入れとく + pic_setirq(0x0d); + nevent_set(NEVENT_MOUSE, mouseif.intrclock << mouseif.timing, mouseint, NEVENT_ABSOLUTE); } } } - mouseif.portc = value; + mouseif.upd8255.portc = (UINT8)value; } // ---- I/O -static void IOOUTCALL mouseif_o7fdd(UINT port, BYTE dat) { +static void IOOUTCALL mouseif_o7fd9(UINT port, REG8 dat) { + + mouseif.upd8255.porta = dat; + (void)port; +} + +static void IOOUTCALL mouseif_o7fdb(UINT port, REG8 dat) { + + mouseif.upd8255.portb = dat; + (void)port; +} + +static void IOOUTCALL mouseif_o7fdd(UINT port, REG8 dat) { setportc(dat); (void)port; } -static void IOOUTCALL mouseif_o7fdf(UINT port, BYTE dat) { +static void IOOUTCALL mouseif_o7fdf(UINT port, REG8 dat) { - if (dat & 0xf0) { - mouseif.mode = dat; - if (dat == 0x93) { - setportc(0); - } + REG8 portc; + UINT sft; + + portc = 0; + if (dat & uPD8255_CTRL) { + mouseif.upd8255.mode = (UINT8)dat; +#if 0 + pic_resetirq(0x0d); + nevent_set(NEVENT_MOUSE, mouseif.intrclock << mouseif.timing, + mouseint, NEVENT_ABSOLUTE); +#endif } else { - if (dat & 1) { - setportc((BYTE)(mouseif.portc | (1 << (dat >> 1)))); - } - else { - setportc((BYTE)(mouseif.portc & (~(1 << (dat >> 1))))); - } + sft = (dat >> 1) & 7; + portc = mouseif.upd8255.portc; + portc &= (~(1 << sft)); + portc |= (dat & 1) << sft; } + setportc(portc); (void)port; } -static BYTE IOINPCALL mouseif_i7fd9(UINT port) { +static REG8 IOINPCALL mouseif_i7fd9(UINT port) { SINT16 x; SINT16 y; - BYTE ret; - BYTE portc; + REG8 ret; + REG8 portc; - calc_mousexy(); - ret = mouseif.b; - if (np2cfg.MOUSERAPID) { - ret |= mouseif.rapid; - } - ret &= 0xf0; - ret |= 0x50; - portc = mouseif.portc; - if (portc & 0x80) { - x = mouseif.latch_x; - y = mouseif.latch_y; - } - else { - x = mouseif.x; - y = mouseif.y; - } - if (portc & 0x40) { - x = y; - } - if (!(portc & 0x20)) { - ret |= x & 0x0f; + if (mouseif.upd8255.mode & uPD8255_PORTA) { + calc_mousexy(); + ret = mouseif.b; + if (np2cfg.MOUSERAPID) { + ret |= mouseif.rapid; + } + ret &= 0xf0; +#if 1 + ret |= 0x40; // for shizuku +#else + ret |= 0x50; +#endif + portc = mouseif.upd8255.portc; + if (portc & 0x80) { + x = mouseif.latch_x; + y = mouseif.latch_y; + } + else { + x = mouseif.x; + y = mouseif.y; + } + if (portc & 0x40) { + x = y; + } + if (!(portc & 0x20)) { + ret |= x & 0x0f; + } + else { + ret |= (x >> 4) & 0x0f; + } + return(ret); } else { - ret |= (x >> 4) & 0x0f; + return(mouseif.upd8255.porta); } -// TRACEOUT(("%x %x mouse [%x] %d -> %x", I286_CS, I286_IP, portc & 0x20, y, ret)); (void)port; - return(ret); } -static BYTE IOINPCALL mouseif_i7fdb(UINT port) { +static REG8 IOINPCALL mouseif_i7fdb(UINT port) { + if (mouseif.upd8255.mode & uPD8255_PORTB) { + return(0x40); + } + else { + return(mouseif.upd8255.portb); + } (void)port; - return(0x40); } -static BYTE IOINPCALL mouseif_i7fdd(UINT port) { +static REG8 IOINPCALL mouseif_i7fdd(UINT port) { - BYTE ret; - BYTE mode; + REG8 mode; + REG8 ret; - ret = mouseif.portc; - mode = mouseif.mode; - if (mode & 8) { + mode = mouseif.upd8255.mode; + ret = mouseif.upd8255.portc; + if (mode & uPD8255_PORTCH) { ret &= 0x1f; } - if (mode & 1) { + if (mode & uPD8255_PORTCL) { ret &= 0xf0; ret |= 0x08; - ret |= (np2cfg.dipsw[2] >> 5) & 0x04; - ret |= ((~np2cfg.dipsw[0]) >> 4) & 0x03; + ret |= (pccore.dipsw[2] >> 5) & 0x04; + ret |= ((~pccore.dipsw[0]) >> 4) & 0x03; } (void)port; return(ret); } - -static void IOOUTCALL mouseif_obfdb(UINT port, BYTE dat) { +static void IOOUTCALL mouseif_obfdb(UINT port, REG8 dat) { mouseif.timing = dat & 3; (void)port; @@ -222,15 +254,25 @@ static void IOOUTCALL mouseif_obfdb(UINT // ---- I/F -void mouseif_reset(void) { +void mouseif_reset(const NP2CFG *pConfig) { ZeroMemory(&mouseif, sizeof(mouseif)); - mouseif.mode = 0x93; - mouseif.portc = 0x10; // ver0.28 + mouseif.upd8255.porta = 0x00; + mouseif.upd8255.portb = 0x00; + mouseif.upd8255.portc = 0xf0; // ver0.82 + mouseif.upd8255.mode = 0x93; + mouseif.intrclock = pccore.realclock / 120; + mouseif.moveclock = pccore.realclock / 56400; + mouseif.latch_x = -1; + mouseif.latch_y = -1; + + (void)pConfig; } void mouseif_bind(void) { + iocore_attachout(0x7fd9, mouseif_o7fd9); + iocore_attachout(0x7fdb, mouseif_o7fdb); iocore_attachout(0x7fdd, mouseif_o7fdd); iocore_attachout(0x7fdf, mouseif_o7fdf); iocore_attachinp(0x7fd9, mouseif_i7fd9);