2 * FM-7 Main I/O [fm7_mainio.h]
4 * Author: K.Ohta <whatisthis.sowhat _at_ gmail.com>
7 * Jan 03, 2015 : Initial
11 #ifndef _VM_FM7_MAINIO_H_
12 #define _VM_FM7_MAINIO_H_
14 #include "../device.h"
15 #include "../mc6809.h"
17 #include "../ym2203.h"
18 #include "../datarec.h"
20 #include "fm7_common.h"
21 #include "./joystick.h"
29 class FM7_MAINIO : public DEVICE {
35 int event_beep_oneshot;
38 outputs_t clock_status;
39 outputs_t printer_reset_bus;
40 outputs_t printer_strobe_bus;
41 outputs_t printer_select_bus;
48 uint8 io_w_latch[0x100];
51 bool clock_fast; // bit0 : maybe dummy
54 bool lpt_strobe; // bit6 : maybe dummy entry
55 bool lpt_slctin; // bit7 : maybe dummy entry
57 uint8 lpt_outdata; // maybe dummy.
60 bool cmt_indat; // bit7 : Data of casette.
61 bool cmt_invert; // Invert signal
62 bool lpt_det2; // bit5 : DET2(Normally high).
63 bool lpt_det1; // bit4 : DET1(Normally high).
64 bool lpt_pe; // bit3 : PAPER EMPTY.
65 bool lpt_ackng_inv; // bit2 : ACK
66 bool lpt_error_inv; // bit1 : ERROR
67 bool lpt_busy; // bit0 : BUSY.
71 uint8 irqmask_reg0; // bit7-4, bit2-0 , '1' is enable. '0' is disable.
72 // 7-4 : RS232C / SYNDET,RXRDY,TXRDY,MFD
76 bool irqmask_syndet; // bit7: "0" = mask.
77 bool irqmask_rxrdy; // bit6: "0" = mask.
78 bool irqmask_txrdy; // bit5: "0" = mask.
79 bool irqmask_mfd; // bit4: "0" = mask.
80 bool irqmask_timer; // bit2: "0" = mask.
81 bool irqmask_printer; // bit1: "0" = mask.
82 bool irqmask_keyboard; // bit0: "0" = mask.
85 uint8_t irqstat_reg0; // bit 3-0, '0' is happened, '1' is not happened.
86 // bit3 : extended interrupt
87 // bit2-0: Same as FD02 : W .
88 /* FD03 : W , '1' = ON*/
91 bool irqstat_keyboard;
97 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
98 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
99 bool stat_kanjirom; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
100 bool stat_400linemode; // R/W : bit3, '0' = 400line, '1' = 200line.
101 #elif defined(_FM77_VARIANTS)
102 bool stat_fdmode_2hd; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
103 bool stat_kanjirom; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
104 bool stat_400linecard;// R/W : bit4, '0' = connected. FM-77 Only.
105 //bool stat_400linemode; // R/W : bit3, '0' = 400line, '1' = 200line.
107 bool firq_break_key; // bit1, ON = '0'.
108 bool firq_sub_attention; // bit0, ON = '0'.
110 bool intmode_fdc; // bit2, '0' = normal, '1' = SFD.
111 #if defined(_FM77AV_VARIANTS)
115 bool extdet_neg; // bit0 : '1' = none , '0' = exists.
118 bool sub_halt; // bit7 : '1' Halt req.
119 bool sub_cancel; // bit6 : '1' Cancel req.
120 bool sub_halt_bak; // bit7 : shadow.
121 bool sub_cancel_bak; // bit6 : shadow.
122 #if defined(WITH_Z80)
123 bool z80_sel; // bit0 : '1' = Z80. Maybe only FM-7/77.
125 /* FD06 : R/W : RS-232C */
126 /* FD07 : R/W : RS-232C */
132 bool irqreq_txrdy; /* FD08 : Grafic pen, not implemented */
133 /* FD09 : Grafic pen, not implemented */
134 /* FD0A : Grafic pen, not implemented */
141 bool stat_romrammode; // R(true) = ROM, W(false) = RAM.
142 #if defined(_FM77AV_VARIANTS)
146 uint8 sub_monitor_type; // bit 2 - 0: default = 0.
147 uint8 sub_monitor_bak; // bit 2 - 0: default = 0.
150 /* FD15 / FD46 / FD51 : W */
152 bool connect_psg; // [0]
154 bool connect_opn; // [0]
155 bool connect_whg; // [1]
156 bool connect_thg; // [2]
158 uint32 opn_address[4];
161 uint8 opn_cmdreg[4]; // OPN register, bit 3-0, maybe dummy.
162 uint8 opn_ch3mode[4];
165 bool intstat_whg; // bit3 : OPN interrupt. '0' = happened.
167 bool intstat_thg; // bit3 : OPN interrupt. '0' = happened.
171 bool intstat_opn; // bit3 : OPN interrupt. '0' = happened.
172 bool intstat_mouse; // bit2 : Mouse interrupt (not OPN-Mouse?), '0' = happened.
174 bool mouse_enable; // bit2 : '1' = enable.
184 uint8_t fdc_trackreg;
193 uint8_t fdc_headreg; // bit0, '0' = side0, '1' = side1
196 bool fdc_motor; // bit7 : '1' = ON, '0' = OFF
197 uint8_t fdc_drvsel; // bit 1-0
198 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
199 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
202 uint8_t fdc_drive_table[4];
203 uint8_t fdc_reg_fd1e;
211 bool connect_kanjiroml1;
212 #ifdef _FM77AV_VARIANTS
213 bool connect_kanjiroml2;
218 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
222 bool enable_initiator;
228 void set_clockmode(uint8 flags);
229 uint8 get_clockmode(void);
230 void set_cmt_motor(uint8 flag);
231 bool get_cmt_motor(void);
233 virtual uint8 get_port_fd00(void);
234 virtual void set_port_fd00(uint8 data);
235 virtual uint8 get_port_fd02(void);
236 virtual void set_port_fd02(uint8 val);
237 virtual uint8 get_irqstat_fd03(void);
238 virtual uint8 get_extirq_fd17(void);
239 virtual void set_ext_fd17(uint8 data);
241 void set_beep(uint32 data); // fd03
242 void reset_sound(void);
243 void reset_printer(void);
245 void reset_fdc(void);
246 void set_fdc_motor(bool flag);
249 void set_irq_syndet(bool flag);
250 void set_irq_rxrdy(bool flag);
251 void set_irq_txrdy(bool flag);
253 void set_irq_timer(bool flag);
254 void set_irq_printer(bool flag);
255 void set_irq_keyboard(bool flag);
256 void set_irq_opn(bool flag);
257 void set_irq_mfd(bool flag);
258 void set_drq_mfd(bool flag);
262 void do_nmi(bool flag);
264 void set_break_key(bool pressed);
265 void set_sub_attention(bool flag);
267 uint8_t get_fd04(void);
268 void set_fd04(uint8_t val);
269 uint8_t get_fd05(void);
270 void set_fd05(uint8_t val);
272 virtual void set_extdet(bool flag);
274 void set_psg(uint8_t val);
275 uint8_t get_psg(void);
277 void set_psg_cmd(uint8_t cmd);
279 void write_fd0f(void);
280 uint8_t read_fd0f(void);
281 bool get_rommode_fd0f(void);
282 #if defined(_FM77AV_VARIANTS)
284 uint8_t subsystem_read_status(void);
287 void opn_note_on(int index);
288 void set_opn(int index, uint8_t val);
289 uint8_t get_opn(int index);
290 void set_opn_cmd(int index, uint8_t cmd);
291 void write_opn_reg(int index, uint32_t addr, uint32_t data);
293 uint8_t get_extirq_whg(void);
294 uint8_t get_extirq_thg(void);
296 void write_kanjiaddr_lo(uint8_t addr);
297 void write_kanjiaddr_hi(uint8_t addr);
298 uint8_t read_kanjidata_left(void);
299 uint8_t read_kanjidata_right(void);
300 #if defined(CAPABLE_KANJI_CLASS2)
301 void write_kanjiaddr_lo_l2(uint8_t addr);
302 void write_kanjiaddr_hi_l2(uint8_t addr);
303 uint8_t read_kanjidata_left_l2(void);
304 uint8_t read_kanjidata_right_l2(void);
307 uint8_t get_fdc_fd1c(void);
308 void set_fdc_fd1c(uint8_t val);
309 void set_fdc_fd1d(uint8_t val);
311 uint8_t get_fdc_fd1e(void);
312 void set_fdc_fd1e(uint8_t val);
314 uint8_t get_fdc_stat(void);
315 void set_fdc_cmd(uint8_t val);
316 uint8_t fdc_getdrqirq(void);
318 virtual void set_fdc_track(uint8_t val);
319 virtual uint8_t get_fdc_track(void);
321 uint8_t get_fdc_motor(void);
322 void set_fdc_sector(uint8_t val);
323 uint8_t get_fdc_sector(void);
325 void set_fdc_data(uint8_t val);
326 uint8_t get_fdc_data(void);
328 void set_fdc_misc(uint8_t val);
329 uint8_t get_fdc_misc(void);
330 /* Signal Handlers */
331 void set_beep_oneshot(void);
334 void event_beep_off(void);
335 void event_beep_cycle(void);
338 YM2203* opn[1]; // Optional PSG.
340 YM2203* opn[4]; // 0=OPN 1=WHG 2=THG 3=PSG
352 //FM7_RS232C *rs232c;
365 FM7_MAINIO(VM* parent_vm, EMU* parent_emu);
367 void event_vline(int v, int clock);
369 uint8 opn_regs[4][0x100];
370 uint32 read_io8(uint32 addr); // This is only for debug.
374 void write_data8(uint32 addr, uint32 data);
375 void write_dma_data8(uint32 addr, uint32 data);
376 void write_dma_io8(uint32 addr, uint32 data);
378 uint32 read_data8(uint32 addr);
379 uint32 read_dma_data8(uint32 addr);
380 uint32 read_dma_io8(uint32 addr);
382 void write_signal(int id, uint32 data, uint32 mask);
383 uint32 read_signal(int id);
385 void event_callback(int event_id, int err);
387 void update_config();
388 void save_state(FILEIO *state_fio);
389 bool load_state(FILEIO *state_fio);
390 const _TCHAR *get_device_name(void)
392 return _T("FM7_MAIN_IO");
395 void set_context_printer(DEVICE *p)
399 void set_context_kanjirom_class1(DEVICE *p)
402 if(p != NULL) connect_kanjiroml1 = true;
404 void set_context_kanjirom_class2(DEVICE *p)
406 #if defined(_FM77AV_VARIANTS)
408 if(p != NULL) connect_kanjiroml2 = true;
411 void set_context_beep(DEVICE *p)
416 void set_context_datarec(DATAREC *p)
421 void set_context_opn(YM2203 *p, int ch)
423 if((ch < 0) || (ch > 2)) return;
441 #if !defined(_FM77AV_VARIANTS)
442 void set_context_psg(YM2203 *p)
452 void set_context_fdc(MB8877 *p){
461 emu->out_debug_log(_T("FDC: connect=%d"), connect_fdc);
464 void set_context_maincpu(MC6809 *p){
467 void set_context_mainmem(DEVICE *p){
470 void set_context_subcpu(MC6809 *p){
473 void set_context_display(DEVICE *p){
476 void set_context_keyboard(DEVICE *p){
479 void set_context_joystick(DEVICE *p){
482 void set_context_clock_status(DEVICE *p, int id, uint32_t mask) {
483 register_output_signal(&clock_status, p, id, mask);
485 void set_context_printer_reset(DEVICE *p, int id, uint32_t mask) {
486 register_output_signal(&printer_reset_bus, p, id, mask);
488 void set_context_z80cpu(Z80 *p){
494 void set_context_dmac(HD6844 *p){