joypad[0]->set_context_com(joystick, SIG_JOYPORT_CH0 | SIG_JOYPORT_TYPE_2BUTTONS | SIG_JOYPORT_COM, 0xffffffff);
joypad[1]->set_context_com(joystick, SIG_JOYPORT_CH1 | SIG_JOYPORT_TYPE_2BUTTONS | SIG_JOYPORT_COM, 0xffffffff);
+ mouse->set_context_com(joystick);
+
// cpu bus
cpu->set_context_mem(memory);
cpu->set_context_io(io);
set_device_name(_T("%s"), tmps);
// rawdata = emu->get_joy_buffer();
register_frame_event(this);
+ sel_line = false;
}
void JOYPAD::reset()
{
- sel_line = true;
+// sel_line = true;
// write_signals(&line_dat, 0);
query_joystick();
write_signals(&line_com, (enabled) ? 0xffffffff : 0x00000000);
break;
case SIG_JOYPAD_SELECT_BUS:
// out_debug_log(_T("SIG_JOYPAD_SELECT_BUS, VALUE=%08X"), ndata);
- if(ndata != 0) {
- sel_line = true;
- } else {
- sel_line = false;
+ if(enabled) {
+ if(ndata != 0) {
+ sel_line = true;
+ } else {
+ sel_line = false;
+ }
+ write_signals(&line_com, (sel_line) ? 0xffffffff : 0x00000000);
}
- write_signals(&line_com, (sel_line) ? 0xffffffff : 0x00000000);
break;
}
}
case 0x04d0:
case 0x04d2:
{
- retval = 0xff;
- uint8_t mask2 = (mouse_mask >> (port_num + 4)) & 0x01;
- if((mask2 & 0x01) == 0) { // COM
- retval = retval & ~0x40;
- }
if(emulate_mouse[port_num]) {
+ uint8_t mask2 = (mouse_mask >> (port_num + 4)) & 0x01;
+ retval = 0x00;
+ if((mask2 & 0x01) != 0) { // COM
+ retval = 0x40;
+ }
+ if(!(stat_com[port_num])) { // COM
+ retval &= ~0x40;
+ }
if(d_mouse != nullptr) {
- retval &= d_mouse->read_signal(SIG_MOUSE_DATA);
+ retval |= d_mouse->read_signal(SIG_MOUSE_DATA);
}
} else {
uint8_t trig = (mouse_mask >> (port_num << 1)) & 0x03;
+ retval = 0xff;
+ uint8_t mask2 = (mouse_mask >> (port_num + 4)) & 0x01;
+ if((mask2 & 0x01) == 0) { // COM
+ retval &= ~0x40;
+ }
if(connected_type[port_num] == SIG_JOYPORT_TYPE_NULL) {
// None Connected
return retval;
}
+ if(!(stat_com[port_num])) { // COM
+ retval &= ~0x40;
+ }
// Trigger independents from direction keys.
+ if((trig & 0x02) == 0) { // TRIG2
+ retval = retval & ~0x20;
+ }
if((joydata[port_num] & LINE_JOYPORT_B) != 0) {
- if((trig & 0x02) != 0) { // TRIG2
- retval = retval & ~0x20;
- }
+ retval = retval & ~0x20;
+ }
+ if((trig & 0x01) == 0) { // TRIG1
+ retval = retval & ~0x10;
}
if((joydata[port_num] & LINE_JOYPORT_A) != 0) {
- if((trig & 0x01) != 0) { // TRIG1
- retval = retval & ~0x10;
- }
+ retval = retval & ~0x10;
}
//if((mask & (0x10 << port_num)) == 0) {
// if((mask2 & 0x01) == 0) { // COM
*/
#include "./mouse.h"
+#include "./joystick.h"
namespace FMTOWNS {
// Values around mouse aren't initialized on reset.
// mouse_state = emu->get_mouse_buffer();
// update_config(); // Update MOUSE PORT.
+ if(mouse_connected) {
+ uint32_t com_d = SIG_JOYPORT_TYPE_MOUSE;
+ if(port_num != 0) {
+ com_d |= SIG_JOYPORT_CH1;
+ }
+ if(strobe) {
+ com_d |= SIG_JOYPORT_COM;
+ }
+ if(d_joyport != nullptr) {
+ d_joyport->write_signal(com_d, 0xffffffff, 0xffffffff);
+ }
+ }
}
void MOUSE::update_strobe()
{
+
bool _bak = strobe;
uint8_t _mask = ((port_num & 1) != 0) ? 0x20 : 0x10;
strobe = ((mouse_mask & _mask) != 0) ? true : false;
+
+ uint32_t com_d = SIG_JOYPORT_TYPE_MOUSE;
+ if(port_num != 0) {
+ com_d |= SIG_JOYPORT_CH1;
+ }
+ if(strobe) {
+ com_d |= SIG_JOYPORT_COM;
+ }
if((_bak != strobe)/* && (flag)*/) {
if(phase == 0) {
if(strobe) {
force_register_event(this, EVENT_MOUSE_TIMEOUT, 2000.0, false, event_timeout);
phase = 2; // SYNC from MAME 0.225. 20201126 K.O
}
+ if(d_joyport != nullptr) {
+ d_joyport->write_signal(com_d, 0xffffffff, 0xffffffff);
+ }
return;
}
phase++;
+ if(d_joyport != nullptr) {
+ d_joyport->write_signal(com_d, 0xffffffff, 0xffffffff);
+ }
}
}
rval |= (update_mouse() & 0x0f);
mouse_state = emu->get_mouse_buffer();
+ if((trig & 0x01) == 0) {
+ rval &= ~0x10; // Button LEFT
+ }
+ if((trig & 0x02) == 0) {
+ rval &= ~0x20; // Button RIGHT
+ }
if(mouse_state != NULL) {
uint32_t stat = mouse_state[2];
- if((trig & 0x01) != 0) {
- if((stat & 0x01) == 0) {
- rval &= ~0x10; // Button LEFT
- }
+ if((stat & 0x01) == 0) {
+ rval &= ~0x10; // Button LEFT
}
- if((trig & 0x02) != 0) {
- if((stat & 0x02) == 0) {
- rval &= ~0x20; // Button LEFT
- }
+ if((stat & 0x02) == 0) {
+ rval &= ~0x20; // Button RIGHT
}
}
if(!(strobe)) { // COM
class MOUSE : public DEVICE
{
private:
+ DEVICE* d_joyport;
const int32_t* mouse_state;
int phase;
public:
MOUSE(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
{
+ d_joyport = NULL;
set_device_name(_T("FM-Towns MOUSE"));
}
~MOUSE() {}
void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
bool process_state(FILEIO* state_fio, bool loading);
+
+ void set_context_com(DEVICE* dev)
+ {
+ d_joyport = dev;
+ }
};
}