2 SHARP MZ-700 Emulator 'EmuZ-700'
3 SHARP MZ-1500 Emulator 'EmuZ-1500'
5 Author : Takeda.Toshiya
15 void JOYSTICK::initialize()
18 joy_stat = emu->get_joy_buffer();
21 register_vline_event(this);
24 // __ _______________________
25 // JA2 \_________/__y1___/__y0___/ \__ JA2は上下方向の状態をPWMする
26 // __ _________ _______ _______ _______ __
27 // JA1 __X____A____X___B___X___R___X___L___X__ JA1は左右とボタンの状態をそのまま送る
29 // |← 38 →|← 30→|← 30→|← 30→| (3.579545MHz)
36 uint32_t JOYSTICK::read_AM7J(int jnum)
43 clk = get_current_clock() & 0x007f;
51 js |= 0x0c; // LEFT+RIGHT
55 js |= 0x0c; // LEFT+RIGHT
57 case 0xc0: // RUN+SELECT
58 js |= 0x0c; // LEFT+RIGHT
76 // JA2 = 0, JA1 = TRG-A
78 if(js & 0x10) val &= ~0x08; // trigger A
79 } else if (clk < 68) {
80 // JA2 = y1, JA1 = TRG-B
82 if(js & 0x20) val &= ~0x08; // trigger B
83 } else if (clk < 98) {
84 // JA2 = y0, JA1 = RIGHT
86 if(js & 0x08) val &= ~0x08; // right
88 // JA2 = 1, JA1 = LEFT
89 if(js & 0x04) val &= ~0x08; // left
98 uint32_t JOYSTICK::read_io8(uint32_t addr)
102 switch (config.joystick_type) {
104 case DEVICE_JOYSTICK_1X03: // SHARP MZ-1X03
108 case DEVICE_JOYSTICK_JOY700: // TSUKUMO JOY-700
109 if(joy_stat[0] & 0x01) val &= ~0x10; // up : JB2
110 if(joy_stat[0] & 0x02) val &= ~0x08; // down : JB1
111 if(joy_stat[0] & 0x04) val &= ~0x02; // left : JA1
112 if(joy_stat[0] & 0x08) val &= ~0x04; // right : JA2
113 if(joy_stat[0] & 0x10) val &= ~0x1e; // trigger A : ALL
114 if(joy_stat[0] & 0x20) val &= ~0x1e; // trigger B : ALL
117 case DEVICE_JOYSTICK_AM7J: // AM7J ATARI Joystick adaptor
130 // MZ-1X03 は /VBLK=H でボタンの状態(押されていればL)
131 // /VBLK=L でスティックの傾き(PWM, 127.841kHz, (0〜255)+10のLowパルス) を出力する
132 // /VBLKが立ち下がってから 302 CPU clock待った後、28 CPU clock 単位のLowパルスを出力
134 uint64_t JOYSTICK::pulse_width_1x03(uint32_t js, uint32_t mmin, uint32_t mmax)
136 if (js & mmin) return 192;
137 if (js & mmax) return 10000;
141 void JOYSTICK::event_vline(int v, int clock)
143 if (config.joystick_type == DEVICE_JOYSTICK_1X03) {
147 if(joy_stat[0] & 0x10) val_1x03 &= ~0x02;
148 if(joy_stat[0] & 0x20) val_1x03 &= ~0x04;
149 if(joy_stat[1] & 0x10) val_1x03 &= ~0x08;
150 if(joy_stat[1] & 0x20) val_1x03 &= ~0x10;
151 } else if (v == 200) {
153 val_1x03 &= ~(0x06 | 0x18);
154 register_event_by_clock(this, EVENT_1X03_X1, pulse_width_1x03(joy_stat[0], 0x04, 0x08), false, NULL);
155 register_event_by_clock(this, EVENT_1X03_Y1, pulse_width_1x03(joy_stat[0], 0x01, 0x02), false, NULL);
156 register_event_by_clock(this, EVENT_1X03_X2, pulse_width_1x03(joy_stat[1], 0x04, 0x08), false, NULL);
157 register_event_by_clock(this, EVENT_1X03_Y2, pulse_width_1x03(joy_stat[1], 0x01, 0x02), false, NULL);
162 void JOYSTICK::event_callback(int event_id, int err)
165 case EVENT_1X03_X1: val_1x03 |= 0x02; break;
166 case EVENT_1X03_Y1: val_1x03 |= 0x04; break;
167 case EVENT_1X03_X2: val_1x03 |= 0x08; break;
168 case EVENT_1X03_Y2: val_1x03 |= 0x10; break;
172 #define STATE_VERSION 2
174 bool JOYSTICK::process_state(FILEIO* state_fio, bool loading)
176 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
179 if(!state_fio->StateCheckInt32(this_device_id)) {
182 state_fio->StateValue(val_1x03);