OSDN Git Service

[VM][FMTOWNS][MEMORY] Fix setup around memory banks by I/O 0404h and 0480h.
[csp-qt/common_source_project-fm7.git] / source / src / vm / j3100 / floppy.cpp
1 /*
2         TOSHIBA J-3100GT Emulator 'eJ-3100GT'
3         TOSHIBA J-3100SL Emulator 'eJ-3100SL'
4
5         Author : Takeda.Toshiya
6         Date   : 2011.08.16-
7
8         [ diskette i/f ]
9 */
10
11 #include "floppy.h"
12 #include "../disk.h"
13 #include "../upd765a.h"
14
15 namespace J3100 {
16         
17 void FLOPPY::initialize()
18 {
19         ctrl_reg = 0;
20 }
21
22 void FLOPPY::reset()
23 {
24         for(int i = 0; i < 4; i++) {
25                 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
26         }
27 }
28
29 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
30 {
31         switch(addr) {
32         case 0x3f2:
33                 // bit0-1: select drive
34                 d_fdc->write_signal(SIG_UPD765A_DRVSEL, data, 3);
35                 // bit3: reset fdc
36                 if((ctrl_reg & 4) && !(data & 4)) {
37                         d_fdc->reset();
38                 }
39                 // bit3: enable irq/drq
40                 d_fdc->write_signal(SIG_UPD765A_IRQ_MASK, !data, 8);
41                 d_fdc->write_signal(SIG_UPD765A_DRQ_MASK, !data, 8);
42                 // bit4: fdd #a motor
43                 // bit5: fdd #b motor
44                 ctrl_reg = data;
45                 break;
46         case 0x3f7:
47                 switch(data & 3) {
48                 case 0: // 500kbps (2hd)
49                         d_fdc->set_drive_type(ctrl_reg & 3, DRIVE_TYPE_2HD);
50                         break;
51                 case 1: // 300kbps (2dd)
52                 case 2: // 250kbps (2dd)
53                         d_fdc->set_drive_type(ctrl_reg & 3, DRIVE_TYPE_2DD);
54                         break;
55                 }
56                 break;
57         }
58 }
59
60 uint32_t FLOPPY::read_io8(uint32_t addr)
61 {
62         switch(addr) {
63         case 0x3f7:
64                 // bit7: 1=ejected
65                 return d_fdc->disk_ejected(ctrl_reg & 3) ? 0x8f : 0x0f;
66         }
67         return 0xff;
68 }
69
70 }