--- np2/io/mouseif.c 2003/10/16 17:57:55 1.1 +++ np2/io/mouseif.c 2004/03/14 23:45:44 1.11 @@ -1,7 +1,9 @@ #include "compiler.h" #include "mousemng.h" +#include "cpucore.h" #include "pccore.h" #include "iocore.h" +#include "keystat.h" // マウス ver0.28 @@ -17,11 +19,13 @@ void mouseif_sync(void) { // 今回の移動量を取得 mouseif.b = mousemng_getstat(&mouseif.sx, &mouseif.sy, 1); + if (np2cfg.KEY_MODE == 3) { + mouseif.b &= keystat_getmouse(&mouseif.sx, &mouseif.sy); + } mouseif.rx = mouseif.sx; mouseif.ry = mouseif.sy; - mouseif.lastc = nevent.clock + nevent.baseclock - - nevent.remainclock; + mouseif.lastc = CPU_CLOCK + CPU_BASECLOCK + CPU_REMCLOCK; } static void calc_mousexy(void) { @@ -29,32 +33,42 @@ static void calc_mousexy(void) { UINT32 clock; SINT32 diff; - clock = nevent.clock + nevent.baseclock - nevent.remainclock; + clock = CPU_CLOCK + CPU_BASECLOCK + CPU_REMCLOCK; diff = clock - mouseif.lastc; if (diff >= 2000) { - short dx, dy; + SINT32 dx; + SINT32 dy; mouseif.rapid ^= 0xa0; diff /= 1000; - dx = (short)((long)mouseif.sx * diff / (long)pc.frame1000); - if (dx >= 0) { // 正 + dx = mouseif.sx; + if (dx > 0) { + dx = dx * diff / mouseif.moveclock; if (dx > mouseif.rx) { dx = mouseif.rx; } } - else { // 負 + else if (dx < 0) { + dx *= -1; + dx = dx * diff / mouseif.moveclock; + dx *= -1; if (dx < mouseif.rx) { dx = mouseif.rx; } } mouseif.x += dx; mouseif.rx -= dx; - dy = (short)((long)mouseif.sy * diff / (long)pc.frame1000); - if (dy >= 0) { // 正 + + dy = mouseif.sy; + if (dy > 0) { + dy = dy * diff / mouseif.moveclock; if (dy > mouseif.ry) { dy = mouseif.ry; } } - else { // 負 + else if (dy < 0) { + dy *= -1; + dy = dy * diff / mouseif.moveclock; + dy *= -1; if (dy < mouseif.ry) { dy = mouseif.ry; } @@ -70,13 +84,13 @@ void mouseint(NEVENTITEM item) { if (item->flag & NEVENT_SETEVENT) { if (!(mouseif.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))) { calc_mousexy(); @@ -100,55 +114,57 @@ static void setportc(BYTE value) { if ((value ^ mouseif.portc) & 0x10) { if (!(value & 0x10)) { if (!nevent_iswork(NEVENT_MOUSE)) { - nevent_set(NEVENT_MOUSE, pc.mouseclock << mouseif.timing, + nevent_set(NEVENT_MOUSE, mouseif.intrclock << mouseif.timing, mouseint, NEVENT_ABSOLUTE); } } } - mouseif.portc = value; + mouseif.portc = (UINT8)value; } // ---- I/O -static void IOOUTCALL mouseif_o7fdd(UINT port, BYTE dat) { +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); - } - } - else { + if (!(dat & 0xf0)) { if (dat & 1) { - setportc((BYTE)(mouseif.portc | (1 << (dat >> 1)))); + setportc((REG8)(mouseif.portc | (1 << (dat >> 1)))); } else { - setportc((BYTE)(mouseif.portc & (~(1 << (dat >> 1))))); + setportc((REG8)(mouseif.portc & (~(1 << (dat >> 1))))); } } + else if (dat & 0x80) { + mouseif.mode = (UINT8)dat; + pic_resetirq(0x0d); + nevent_set(NEVENT_MOUSE, mouseif.intrclock << mouseif.timing, + mouseint, NEVENT_ABSOLUTE); + setportc(0); + } (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 & 0xf0; + ret = mouseif.b; if (np2cfg.MOUSERAPID) { ret |= mouseif.rapid; } - ret |= 0x40; + ret &= 0xf0; + ret |= 0x50; portc = mouseif.portc; if (portc & 0x80) { x = mouseif.latch_x; @@ -171,16 +187,16 @@ static BYTE IOINPCALL mouseif_i7fd9(UINT return(ret); } -static BYTE IOINPCALL mouseif_i7fdb(UINT port) { +static REG8 IOINPCALL mouseif_i7fdb(UINT port) { (void)port; return(0x40); } -static BYTE IOINPCALL mouseif_i7fdd(UINT port) { +static REG8 IOINPCALL mouseif_i7fdd(UINT port) { - BYTE ret; - BYTE mode; + REG8 ret; + REG8 mode; ret = mouseif.portc; mode = mouseif.mode; @@ -198,7 +214,7 @@ static BYTE IOINPCALL mouseif_i7fdd(UINT } -static void IOOUTCALL mouseif_obfdb(UINT port, BYTE dat) { +static void IOOUTCALL mouseif_obfdb(UINT port, REG8 dat) { mouseif.timing = dat & 3; (void)port; @@ -211,7 +227,9 @@ void mouseif_reset(void) { ZeroMemory(&mouseif, sizeof(mouseif)); mouseif.mode = 0x93; - mouseif.portc = 0x10; // ver0.28 + mouseif.portc = 0x10; + mouseif.intrclock = pccore.realclock / 120; + mouseif.moveclock = pccore.realclock / 56400; } void mouseif_bind(void) {