OSDN Git Service

[General] Merge from upstream version, 2015-01-28.
[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 "../upd765a.h"
13 #include "../../fileio.h"
14
15 void FLOPPY::reset()
16 {
17         ctrlreg = 0x80;
18         modereg = 0x03;
19 }
20
21 void FLOPPY::write_io8(uint32 addr, uint32 data)
22 {
23         switch(addr & 0xffff) {
24         case 0xca:
25                 d_fdc->write_io8(1, data);
26                 break;
27         case 0xcc:
28                 if(!(ctrlreg & 0x80) && (data & 0x80)) {
29                         d_fdc->reset();
30                 }
31                 d_fdc->write_signal(SIG_UPD765A_FREADY, data, 0x40);
32                 d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
33                 ctrlreg = data;
34                 break;
35         case 0xbe:
36                 modereg = data;
37                 break;
38         }
39 }
40
41 uint32 FLOPPY::read_io8(uint32 addr)
42 {
43         switch(addr & 0xffff) {
44         case 0xc8:
45                 return d_fdc->read_io8(0);
46         case 0xca:
47                 return d_fdc->read_io8(1);
48         case 0xcc:
49                 return (d_fdc->disk_inserted() ? 0x10 : 0) | 0x64;
50         case 0xbe:
51                 return (modereg & 0x03) | 0x08;
52         }
53         return addr & 0xff;
54 }
55
56 #define STATE_VERSION   1
57
58 void FLOPPY::save_state(FILEIO* state_fio)
59 {
60         state_fio->FputUint32(STATE_VERSION);
61         state_fio->FputInt32(this_device_id);
62         
63         state_fio->FputUint8(ctrlreg);
64         state_fio->FputUint8(modereg);
65 }
66
67 bool FLOPPY::load_state(FILEIO* state_fio)
68 {
69         if(state_fio->FgetUint32() != STATE_VERSION) {
70                 return false;
71         }
72         if(state_fio->FgetInt32() != this_device_id) {
73                 return false;
74         }
75         ctrlreg = state_fio->FgetUint8();
76         modereg = state_fio->FgetUint8();
77         return true;
78 }
79