OSDN Git Service

[General] Merge upstream, 2015-01-30 Writetrk.test.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fmr50 / floppy.cpp
1 /*
2         FUJITSU FMR-50 Emulator 'eFMR-50'
3         FUJITSU FMR-60 Emulator 'eFMR-60'
4
5         Author : Takeda.Toshiya
6         Date   : 2008.04.30 -
7
8         [ floppy ]
9 */
10
11 #include "floppy.h"
12 #include "../i8259.h"
13 #include "../mb8877.h"
14
15 void FLOPPY::initialize()
16 {
17         drvreg = drvsel = 0;
18         irq = irqmsk = false;
19         changed[0] = changed[1] = changed[2] = changed[3] = false;
20 }
21
22 void FLOPPY::write_io8(uint32 addr, uint32 data)
23 {
24         int nextdrv = drvsel;
25         
26         switch(addr & 0xffff) {
27         case 0x208:
28                 // drive control register
29                 irqmsk = ((data & 1) != 0);
30                 update_intr();
31                 d_fdc->write_signal(SIG_MB8877_MOTOR, data, 0x10);
32                 d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 4);
33                 break;
34         case 0x20c:
35                 // drive select register
36                 if(data & 1) {
37                         nextdrv = 0;
38                 } else if(data & 2) {
39                         nextdrv = 1;
40                 } else if(data & 4) {
41                         nextdrv = 2;
42                 } else if(data & 8) {
43                         nextdrv = 3;
44                 }
45                 if(drvsel != nextdrv) {
46                         d_fdc->write_signal(SIG_MB8877_DRIVEREG, drvsel = nextdrv, 3);
47                 }
48                 drvreg = data;
49                 break;
50         }
51 }
52
53 uint32 FLOPPY::read_io8(uint32 addr)
54 {
55         switch(addr & 0xffff) {
56         case 0x208:
57                 if(changed[drvsel]) {
58                         changed[drvsel] = false;
59                         return d_fdc->fdc_status() | 0xe1;      // fdd*2
60                 }
61 //              return d_fdc->fdc_status() | 0x60;      // fdd*1
62                 return d_fdc->fdc_status() | 0xe0;      // fdd*2
63         case 0x20c:
64                 return drvreg;
65         }
66         return 0xff;
67 }
68
69 void FLOPPY::write_signal(int id, uint32 data, uint32 mask)
70 {
71         if(id == SIG_FLOPPY_IRQ) {
72                 irq = ((data & mask) != 0);
73                 update_intr();
74         }
75 }
76
77 void FLOPPY::update_intr()
78 {
79         d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR6, irq && irqmsk ? 1 : 0, 1);
80 }
81