OSDN Git Service

[VM][FM77AV][MB61VH010] Fix line putting.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / fm7_mainio.h
1 /*
2  * FM-7 Main I/O [fm7_mainio.h]
3  *
4  * Author: K.Ohta <whatisthis.sowhat _at_ gmail.com>
5  * License: GPLv2
6  * History:
7  *   Jan 03, 2015 : Initial
8  *
9  */
10
11 #ifndef _VM_FM7_MAINIO_H_
12 #define _VM_FM7_MAINIO_H_
13
14 #include "../device.h"
15 #include "../memory.h"
16 #include "../mc6809.h"
17 #include "../z80.h"
18 #include "../ym2203.h"
19
20 #include "fm7_common.h"
21
22
23 class FM7_MAINIO : public DEVICE {
24  private:
25         bool opn_psg_77av;
26         bool beep_flag;
27         bool beep_snd;
28         int event_beep;  
29         int event_timerirq;  
30  protected:
31         VM* p_vm;
32         EMU* p_emu;
33
34         int nmi_count;
35         bool irqstat_bak;
36         bool firqstat_bak;
37    
38         /* FD00: R */
39         bool clock_fast; // bit0 : maybe dummy
40         uint8 kbd_bit8;  // bit7
41         /* FD00: W */
42         bool lpt_strobe;  // bit6 : maybe dummy entry
43         bool lpt_slctin;  // bit7 : maybe dummy entry
44
45         /* FD01 : R */
46         uint8 kbd_bit7_0;
47         /* FD01: W */
48         uint8 lpt_outdata; // maybe dummy.
49
50         /* FD02 : R */
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.
59         /* FD02 : W */
60         uint8 irqmask_reg0; // bit7-4, bit2-0 , '1' is enable.  '0' is disable.
61         // 7-4 :  RS232C / SYNDET,RXRDY,TXRDY,MFD
62         // 2 : TIMER
63         // 1 : PRINTER
64         // 0 : KEYBOARD
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.
69   
70         /* FD03: R */
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*/
75         bool irqstat_timer;
76         bool irqstat_printer;
77         bool irqstat_keyboard;
78    
79
80         /* FD04 : R */
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'.
87         /* FD04 : W */
88         bool intmode_fdc; // bit2, '0' = normal, '1' = SFD.
89
90         /* FD05 : R */
91         bool extdet_neg; // bit0 : '1' = none , '0' = exists.
92         /* FD05 : W */
93         bool sub_cancel; // bit6 : '1' Cancel req.
94         bool z80_sel;    // bit0 : '1' = Z80. Maybe only FM-7/77.
95
96         /* FD06 : R/W : RS-232C */
97         /* FD07 : R/W : RS-232C */
98         bool intstat_syndet;
99         bool intstat_rxrdy;
100         bool intstat_txrdy;
101         /* FD08 : Grafic pen, not implemented */
102         /* FD09 : Grafic pen, not implemented */
103         /* FD0A : Grafic pen, not implemented */
104         /* FD0B : R */
105         bool stat_bootsw_basic; // bit0 : '0' = BASIC '1' = DOS. Only 77AV/20/40.
106         uint32 bootmode;
107         /* FD0D : W */
108         uint8 psg_cmdreg; // PSG Register, Only bit 0-1 at FM-7/77 , 3-0 at FM-77AV series. Maybe dummy.
109
110         /* FD0E : R */
111         uint8 psg_statreg; // PSG data. maybe dummy.
112         uint32 psg_address;
113         uint32 psg_data;
114         bool  psg_bus_high; // true when bus = high inpedance.
115   
116         /* FD0F : R/W */
117         bool stat_romrammode; // R(true) = ROM, W(false) = RAM.
118 #if defined(_FM77AV_VARIANTS)
119         /* FD12 : R/W*/
120         bool mode320; // bit6 : true = 320, false = 640
121         /* FD13 : WO */
122         uint8 sub_monitor_type; // bit 2 - 0: default = 0.
123 #endif
124         
125         /* FD15 / FD46 / FD51 : W */
126         bool connect_opn; // [0]
127         bool connect_whg; // [1]
128         bool connect_thg; // [2]
129         bool psg_shared_opn;
130         uint32 opn_address[4];
131         uint32 opn_data[4];
132         uint32 opn_stat[4];
133         uint8  opn_cmdreg[4]; // OPN register, bit 3-0, maybe dummy.
134         uint8  opn_ch3mode[4];
135         /* OPN Joystick */
136         uint32 joyport_a;
137         uint32 joyport_b;
138
139         /* FD47 */
140         bool intstat_whg;   // bit3 : OPN interrupt. '0' = happened.
141         /* FD53 */
142         bool intstat_thg;   // bit3 : OPN interrupt. '0' = happened.
143
144         
145         /* FD17 : R */
146         bool intstat_opn;   // bit3 : OPN interrupt. '0' = happened.
147         bool intstat_mouse; // bit2 : Mouse interrupt (not OPN-Mouse?), '0' = happened.
148         /* FD17 : W */
149         bool mouse_enable; // bit2 : '1' = enable.
150         
151         /* FD18 : R */
152         bool connect_fdc;
153         uint8 fdc_statreg;
154         /* FD18 : W */
155         uint8 fdc_cmdreg;
156         
157         /* FD19 : R/W */
158         uint8 fdc_trackreg;
159         
160         /* FD1A : R/W */
161         uint8 fdc_sectreg;
162         
163         /* FD1B : R/W */
164         uint8 fdc_datareg;
165         
166         /* FD1C : R/W */
167         uint8 fdc_headreg; // bit0, '0' = side0, '1' = side1
168         
169         /* FD1D : R/W */
170         bool fdc_motor; // bit7 : '1' = ON, '0' = OFF
171         uint8 fdc_drvsel; // bit 1-0
172         
173         /* FD1F : R */
174         uint8 irqreg_fdc;
175         bool irqstat_fdc;
176    
177         /* FD20,FD21 : W */
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.
183 #endif  
184         /* FD20, FD21 : R */
185         
186         /* FD37 : W */
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.
189 #ifdef HAS_MMR
190         bool mmr_enabled;
191         bool mmr_fast;
192         uint8 mmr_segment;
193         uint8 mmr_table[8 * 16];
194         bool window_enabled;
195         uint32 window_offset;
196 #endif  
197 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
198         /* FD93: bit0 */
199         bool boot_ram;
200         /* FD10: bit1 */
201         bool enable_initiator;
202 #endif  
203         
204         void set_clockmode(uint8 flags);
205         uint8 get_clockmode(void);
206         void set_cmt_motor(uint8 flag);
207         bool get_cmt_motor(void);
208         
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);
217
218         void set_beep(uint32 data); // fd03
219         void reset_sound(void);
220         
221         void reset_fdc(void);
222         void set_fdc_motor(bool flag);
223         
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);  
232
233         // FD04
234         void do_firq(bool flag);
235         void do_nmi(bool flag);
236           
237         void set_break_key(bool pressed);
238         void set_sub_attention(bool flag);
239           
240         uint8 get_fd04(void);
241         void  set_fd04(uint8 val);
242         uint8 get_fd05(void);
243         void  set_fd05(uint8 val);
244         
245         virtual void set_extdet(bool flag);
246         // FD0D
247         void set_psg(uint8 val);
248         uint8 get_psg(void);
249         // FD0E
250         void set_psg_cmd(uint8 cmd);
251         
252         void write_fd0f(void)  {
253                 stat_romrammode = false;
254         }
255         uint8 read_fd0f(void)  {
256                 stat_romrammode = true;
257                 return 0xff;
258         }
259         bool get_rommode_fd0f(void) {
260                 return stat_romrammode;
261         }
262 #if defined(_FM77AV_VARIANTS)
263         // FD12
264         uint8 subsystem_read_status(void);
265 #endif   
266         // OPN
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);
272   
273         uint8 get_extirq_whg(void);
274         uint8 get_extirq_thg(void);
275         uint32 update_joystatus(int index);
276         
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);
281           
282           // FDC
283         uint8 get_fdc_fd1c(void);
284         void set_fdc_fd1c(uint8 val);
285         void set_fdc_fd1d(uint8 val);
286         
287         uint8 get_fdc_stat(void);
288         void set_fdc_cmd(uint8 val);
289         uint8 fdc_getdrqirq(void);
290
291         virtual void set_fdc_track(uint8 val);
292         virtual uint8 get_fdc_track(void);
293
294         uint8 get_fdc_motor(void);
295           
296         void set_fdc_sector(uint8 val);
297
298         uint8 get_fdc_sector(void);
299           
300         void set_fdc_data(uint8 val);
301         uint8 get_fdc_data(void);
302         /* Signal Handlers */
303         void set_beep_oneshot(void);
304         
305         /* Event Handlers */
306         void event_beep_off(void);
307         void event_beep_cycle(void);
308
309         /* Devices */
310         YM2203* opn[4]; // 0=OPN 1=WHG 2=THG 3=PSG
311         
312         DEVICE* drec;
313         //DEVICE* pcm1bit;
314         DEVICE* beep;
315         DEVICE* fdc;
316         //FM7_PRINTER *printer;
317         //FM7_RS232C *rs232c;
318         /* */
319         MEMORY *kanjiclass1;
320         MEMORY *kanjiclass2;
321         DEVICE *display;
322         MC6809 *maincpu;
323         MEMORY *mainmem;
324         MC6809 *subcpu;
325         Z80 *z80;
326  public:
327         FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
328         {
329                 int i;
330                 p_vm = parent_vm;
331                 p_emu = parent_emu;
332                 kanjiclass1 = NULL;
333                 kanjiclass2 = NULL;
334                 opn_psg_77av = false;
335                 nmi_count = 0;
336                 // FD00
337                 clock_fast = true;
338                 kbd_bit8 = 0;  // bit7
339                 lpt_strobe = false;
340                 lpt_slctin = false;
341                 // FD01
342                 kbd_bit7_0 = 0x00;
343                 lpt_outdata = 0x00;
344                 // FD02
345                 cmt_indat = false; // bit7
346                 cmt_invert = false; // Invert signal
347                 lpt_det2 = false;
348                 lpt_det1 = false;
349                 lpt_pe = false;
350                 lpt_ackng_inv = false;
351                 lpt_error_inv = false;
352                 lpt_busy = false;
353                 // FD04
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.
361                 // FD05
362                 extdet_neg = false;
363                 z80_sel = false;    // bit0 : '1' = Z80. Maybe only FM-7/77.
364                 // FD06,07
365                 intstat_syndet = false;
366                 intstat_rxrdy = false;
367                 intstat_txrdy = false;
368                 // FD0B
369                 stat_bootsw_basic = true; // bit0 : '0' = BASIC '1' = DOS. Only 77AV/20/40.
370                 bootmode = 0x00;
371                 // FD0D
372                 psg_cmdreg = 0;
373                 psg_statreg = 0x00;
374                 psg_address = 0x00;
375                 psg_data = 0x00;
376                 psg_bus_high = false;
377                 // FD0F
378                 stat_romrammode = true; // ROM ON
379                 
380                 // FD15/ FD46 / FD51
381                 connect_opn = false;
382                 connect_whg = false;
383                 connect_thg = false;
384                 psg_shared_opn = false;
385                 
386                 for(i = 0; i < 3; i++) {
387                         opn_address[i] = 0x00;
388                         opn_data[i] = 0x00;
389                         opn_cmdreg[i] = 0;
390                 }
391                 joyport_a = 0x00;
392                 joyport_b = 0x00;
393                 
394                 intstat_whg = false;
395                 intstat_thg = false;
396                 // FD17
397                 intstat_opn = false;
398                 intstat_mouse = false;
399                 mouse_enable = false;
400                 // FD18-FD1F
401                 connect_fdc = false;
402                 fdc_statreg = 0x00;
403                 fdc_cmdreg = 0x00;
404                 fdc_trackreg = 0x00;
405                 fdc_sectreg = 0x00;
406                 fdc_datareg = 0x00;
407                 fdc_headreg = 0x00;
408                 fdc_drvsel = 0x00;
409                 fdc_motor = false;
410                 irqstat_fdc = 0;
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;
417 #endif          
418 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
419                 boot_ram = false;
420 #endif          
421         }
422         ~FM7_MAINIO(){}
423         uint8  opn_regs[4][0x100];
424         
425         void initialize(void);
426         void write_data8(uint32 addr, uint32 data);
427         uint32 read_data8(uint32 addr);
428
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);
432         void reset(void);
433
434         void set_context_kanjirom_class1(MEMORY *p)
435         {
436                 kanjiclass1 = p;
437                 if(p != NULL) connect_kanjiroml1 = true;
438         }
439         void set_context_kanjirom_class2(MEMORY *p)
440         {
441 #if defined(_FM77AV_VARIANTS)
442                 kanjiclass2 = p;
443                 if(p != NULL) connect_kanjiroml2 = true;
444 #endif
445         }
446         void set_context_beep(DEVICE *p)
447         {
448                 //pcm1bit = p;
449                 beep = p;
450         }
451         void set_context_datarec(DEVICE *p)
452         {
453                 drec = p;
454         }
455         void set_context_opn(YM2203 *p, int ch)
456         {
457                 if((ch < 0) || (ch > 2)) return;
458                 if(p != NULL) {
459                         switch(ch) {
460                                 case 0:
461                                         connect_opn = true;
462                                         break;
463                                 case 1:
464                                         connect_whg = true;
465                                         break;
466                                 case 2:
467                                         connect_thg = true;
468                                         break;
469                         }
470                 }
471                 opn[ch] = p;
472                 if(connect_opn) {
473                         extdet_neg = true;
474                 }
475                 if(connect_whg) {
476                         extdet_neg = true;
477                 }
478                 if(connect_thg) {
479                         extdet_neg = true;
480                 }
481         }
482         void set_context_psg(YM2203 *p)
483         {
484                 opn[3] = p;
485         }
486         void set_context_fdc(DEVICE *p){
487                 if(p == NULL) {
488                         connect_fdc = false;
489                 } else {
490                         connect_fdc = true;
491                 }
492                 if(connect_fdc) {
493                         extdet_neg = true;
494                 }
495                 emu->out_debug_log("FDC: connect=%d\n", connect_fdc);
496                 fdc = p;
497         }
498         void set_context_maincpu(MC6809 *p){
499                 maincpu = p;
500         }
501         void set_context_mainmem(MEMORY *p){
502                 mainmem = p;
503         }
504         void set_context_subcpu(MC6809 *p){
505                 subcpu = p;
506         }
507         void set_context_display(DEVICE *p){
508                 display = p;
509         }
510         void set_context_z80cpu(Z80 *p){
511                 z80 = p;
512         }
513
514 };
515 #endif