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 "../memory.h"
16 #include "../mc6809.h"
18 #include "../ym2203.h"
20 #include "fm7_common.h"
23 class FM7_MAINIO : public DEVICE {
39 bool clock_fast; // bit0 : maybe dummy
40 uint8 kbd_bit8; // bit7
42 bool lpt_strobe; // bit6 : maybe dummy entry
43 bool lpt_slctin; // bit7 : maybe dummy entry
48 uint8 lpt_outdata; // maybe dummy.
51 bool cmt_indat; // bit7
52 bool cmt_invert; // Invert signal
53 bool lpt_det2; // bit5 : maybe dummy.
54 bool lpt_det1; // bit4 : maybe dummy.
55 bool lpt_pe; // bit3 : maybe dummy.
56 bool lpt_ackng_inv; // bit2 : maybe dummy.
57 bool lpt_error_inv; // bit1 : maybe dummy.
58 bool lpt_busy; // bit0 : maybe dummy.
60 uint8 irqmask_reg0; // bit7-4, bit2-0 , '1' is enable. '0' is disable.
61 // 7-4 : RS232C / SYNDET,RXRDY,TXRDY,MFD
65 bool irqmask_mfd; // bit4: "0" = mask.
66 bool irqmask_timer; // bit2: "0" = mask.
67 bool irqmask_printer; // bit1: "0" = mask.
68 bool irqmask_keyboard; // bit0: "0" = mask.
71 uint8 irqstat_reg0; // bit 3-0, '0' is happened, '1' is not happened.
72 // bit3 : extended interrupt
73 // bit2-0: Same as FD02 : W .
74 /* FD03 : W , '1' = ON*/
77 bool irqstat_keyboard;
81 bool stat_fdmode_2hd; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
82 bool stat_kanjirom; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
83 bool stat_400linecard;// R/W : bit4, '0' = connected. FM-77 Only.
84 bool stat_400linemode; // R/W : bit3, '0' = 400line, '1' = 200line.
85 bool firq_break_key; // bit1, ON = '0'.
86 bool firq_sub_attention; // bit0, ON = '0'.
88 bool intmode_fdc; // bit2, '0' = normal, '1' = SFD.
91 bool extdet_neg; // bit0 : '1' = none , '0' = exists.
93 bool sub_cancel; // bit6 : '1' Cancel req.
94 bool z80_sel; // bit0 : '1' = Z80. Maybe only FM-7/77.
96 /* FD06 : R/W : RS-232C */
97 /* FD07 : R/W : RS-232C */
101 /* FD08 : Grafic pen, not implemented */
102 /* FD09 : Grafic pen, not implemented */
103 /* FD0A : Grafic pen, not implemented */
105 bool stat_bootsw_basic; // bit0 : '0' = BASIC '1' = DOS. Only 77AV/20/40.
108 uint8 psg_cmdreg; // PSG Register, Only bit 0-1 at FM-7/77 , 3-0 at FM-77AV series. Maybe dummy.
111 uint8 psg_statreg; // PSG data. maybe dummy.
114 bool psg_bus_high; // true when bus = high inpedance.
117 bool stat_romrammode; // R(true) = ROM, W(false) = RAM.
118 #if defined(_FM77AV_VARIANTS)
120 bool mode320; // bit6 : true = 320, false = 640
122 uint8 sub_monitor_type; // bit 2 - 0: default = 0.
125 /* FD15 / FD46 / FD51 : W */
126 bool connect_opn; // [0]
127 bool connect_whg; // [1]
128 bool connect_thg; // [2]
130 uint32 opn_address[4];
133 uint8 opn_cmdreg[4]; // OPN register, bit 3-0, maybe dummy.
134 uint8 opn_ch3mode[4];
140 bool intstat_whg; // bit3 : OPN interrupt. '0' = happened.
142 bool intstat_thg; // bit3 : OPN interrupt. '0' = happened.
146 bool intstat_opn; // bit3 : OPN interrupt. '0' = happened.
147 bool intstat_mouse; // bit2 : Mouse interrupt (not OPN-Mouse?), '0' = happened.
149 bool mouse_enable; // bit2 : '1' = enable.
167 uint8 fdc_headreg; // bit0, '0' = side0, '1' = side1
170 bool fdc_motor; // bit7 : '1' = ON, '0' = OFF
171 uint8 fdc_drvsel; // bit 1-0
178 bool connect_kanjiroml1;
179 pair kaddress; // FD20 : ADDRESS OF HIGH.
180 #ifdef _FM77AV_VARIANTS
181 bool connect_kanjiroml2;
182 pair kaddress_l2; // FD20 : ADDRESS OF HIGH.
187 uint8 multipage_disp; // bit6-4 : to display : GRB. '1' = disable, '0' = enable.
188 uint8 multipage_access; // bit2-0 : to access : GRB. '1' = disable, '0' = enable.
193 uint8 mmr_table[8 * 16];
195 uint32 window_offset;
197 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
201 bool enable_initiator;
204 void set_clockmode(uint8 flags);
205 uint8 get_clockmode(void);
206 void set_cmt_motor(uint8 flag);
207 bool get_cmt_motor(void);
209 virtual uint8 get_port_fd00(void);
210 virtual void set_port_fd00(uint8 data);
211 virtual uint32 get_keyboard(void); // FD01
212 virtual uint8 get_port_fd02(void);
213 virtual void set_port_fd02(uint8 val);
214 virtual uint8 get_irqstat_fd03(void);
215 virtual uint8 get_extirq_fd17(void);
216 virtual void set_ext_fd17(uint8 data);
218 void set_beep(uint32 data); // fd03
219 void reset_sound(void);
221 void reset_fdc(void);
222 void set_fdc_motor(bool flag);
224 void do_irq(bool flag);
225 void set_irq_timer(bool flag);
226 void set_irq_printer(bool flag);
227 void set_irq_keyboard(bool flag);
228 void set_irq_opn(bool flag);
229 void set_irq_mfd(bool flag);
230 void set_drq_mfd(bool flag);
231 void set_keyboard(uint32 data);
234 void do_firq(bool flag);
235 void do_nmi(bool flag);
237 void set_break_key(bool pressed);
238 void set_sub_attention(bool flag);
240 uint8 get_fd04(void);
241 void set_fd04(uint8 val);
242 uint8 get_fd05(void);
243 void set_fd05(uint8 val);
245 virtual void set_extdet(bool flag);
247 void set_psg(uint8 val);
250 void set_psg_cmd(uint8 cmd);
252 void write_fd0f(void) {
253 stat_romrammode = false;
255 uint8 read_fd0f(void) {
256 stat_romrammode = true;
259 bool get_rommode_fd0f(void) {
260 return stat_romrammode;
262 #if defined(_FM77AV_VARIANTS)
264 uint8 subsystem_read_status(void);
267 void opn_note_on(int index);
268 void set_opn(int index, uint8 val);
269 uint8 get_opn(int index);
270 void set_opn_cmd(int index, uint8 cmd);
271 void write_opn_reg(int index, uint32 addr, uint32 data);
273 uint8 get_extirq_whg(void);
274 uint8 get_extirq_thg(void);
275 uint32 update_joystatus(int index);
277 void write_kanjiaddr_lo(uint8 addr);
278 void write_kanjiaddr_hi(uint8 addr);
279 uint8 read_kanjidata_left(void);
280 uint8 read_kanjidata_right(void);
283 uint8 get_fdc_fd1c(void);
284 void set_fdc_fd1c(uint8 val);
285 void set_fdc_fd1d(uint8 val);
287 uint8 get_fdc_stat(void);
288 void set_fdc_cmd(uint8 val);
289 uint8 fdc_getdrqirq(void);
291 virtual void set_fdc_track(uint8 val);
292 virtual uint8 get_fdc_track(void);
294 uint8 get_fdc_motor(void);
296 void set_fdc_sector(uint8 val);
298 uint8 get_fdc_sector(void);
300 void set_fdc_data(uint8 val);
301 uint8 get_fdc_data(void);
302 /* Signal Handlers */
303 void set_beep_oneshot(void);
306 void event_beep_off(void);
307 void event_beep_cycle(void);
310 YM2203* opn[4]; // 0=OPN 1=WHG 2=THG 3=PSG
316 //FM7_PRINTER *printer;
317 //FM7_RS232C *rs232c;
327 FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
334 opn_psg_77av = false;
338 kbd_bit8 = 0; // bit7
345 cmt_indat = false; // bit7
346 cmt_invert = false; // Invert signal
350 lpt_ackng_inv = false;
351 lpt_error_inv = false;
354 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
355 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
356 stat_400linecard = false;// R/W : bit4, '0' = connected. FM-77 Only.
357 stat_400linemode = false; // R/W : bit3, '0' = 400line, '1' = 200line.
358 firq_break_key = false; // bit1, ON = '0'.
359 firq_sub_attention = false; // bit0, ON = '0'.
360 intmode_fdc = false; // bit2, '0' = normal, '1' = SFD.
363 z80_sel = false; // bit0 : '1' = Z80. Maybe only FM-7/77.
365 intstat_syndet = false;
366 intstat_rxrdy = false;
367 intstat_txrdy = false;
369 stat_bootsw_basic = true; // bit0 : '0' = BASIC '1' = DOS. Only 77AV/20/40.
376 psg_bus_high = false;
378 stat_romrammode = true; // ROM ON
384 psg_shared_opn = false;
386 for(i = 0; i < 3; i++) {
387 opn_address[i] = 0x00;
398 intstat_mouse = false;
399 mouse_enable = false;
411 // FD20, FD21, FD22, FD23
412 connect_kanjiroml1 = false;
413 #if defined(_FM77AV_VARIANTS)
414 enable_initiator = true;
415 // FD2C, FD2D, FD2E, FD2F
416 connect_kanjiroml2 = false;
418 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
423 uint8 opn_regs[4][0x100];
425 void initialize(void);
426 void write_data8(uint32 addr, uint32 data);
427 uint32 read_data8(uint32 addr);
429 void write_signal(int id, uint32 data, uint32 mask);
430 uint32 read_signal(uint32 addr);
431 void event_callback(int event_id, int err);
434 void set_context_kanjirom_class1(MEMORY *p)
437 if(p != NULL) connect_kanjiroml1 = true;
439 void set_context_kanjirom_class2(MEMORY *p)
441 #if defined(_FM77AV_VARIANTS)
443 if(p != NULL) connect_kanjiroml2 = true;
446 void set_context_beep(DEVICE *p)
451 void set_context_datarec(DEVICE *p)
455 void set_context_opn(YM2203 *p, int ch)
457 if((ch < 0) || (ch > 2)) return;
482 void set_context_psg(YM2203 *p)
486 void set_context_fdc(DEVICE *p){
495 emu->out_debug_log("FDC: connect=%d\n", connect_fdc);
498 void set_context_maincpu(MC6809 *p){
501 void set_context_mainmem(MEMORY *p){
504 void set_context_subcpu(MC6809 *p){
507 void set_context_display(DEVICE *p){
510 void set_context_z80cpu(Z80 *p){