OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc98ha / floppy.cpp
1 /*
2         NEC PC-98LT Emulator 'ePC-98LT'
3         NEC PC-98HA Emulator 'eHANDY98'
4
5         Author : Takeda.Toshiya
6         Date   : 2008.06.11 -
7
8         [ floppy ]
9 */
10
11 #include "floppy.h"
12 #include "../disk.h"
13 #include "../upd765a.h"
14
15 namespace PC98HA {
16
17 void FLOPPY::reset()
18 {
19 /*
20         for(int i = 0; i < 4; i++) {
21                 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
22         }
23 */
24         ctrlreg = 0x80;
25         modereg = 0x03;
26 }
27
28 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
29 {
30         switch(addr & 0xffff) {
31         case 0xca:
32                 d_fdc->write_io8(1, data);
33                 break;
34         case 0xcc:
35                 if(!(ctrlreg & 0x80) && (data & 0x80)) {
36                         d_fdc->reset();
37                 }
38                 d_fdc->write_signal(SIG_UPD765A_FREADY, data, 0x40);
39                 d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
40                 ctrlreg = data;
41                 break;
42         case 0xbe:
43 /*
44                 if(!(modereg & 2) && (data & 2)) {
45                         d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
46                         d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
47                 } else if((modereg & 2) && !(data & 2)) {
48                         d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
49                         d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
50                 }
51 */
52                 modereg = data;
53                 break;
54         }
55 }
56
57 uint32_t FLOPPY::read_io8(uint32_t addr)
58 {
59         switch(addr & 0xffff) {
60         case 0xc8:
61                 return d_fdc->read_io8(0);
62         case 0xca:
63                 return d_fdc->read_io8(1);
64         case 0xcc:
65                 return (d_fdc->is_disk_inserted() ? 0x10 : 0) | 0x64;
66         case 0xbe:
67                 return (modereg & 0x03) | 0x08;
68         }
69         return addr & 0xff;
70 }
71
72 #define STATE_VERSION   1
73
74 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
75 {
76         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
77                 return false;
78         }
79         if(!state_fio->StateCheckInt32(this_device_id)) {
80                 return false;
81         }
82         state_fio->StateUint8(ctrlreg);
83         state_fio->StateUint8(modereg);
84         return true;
85 }
86
87 }