OSDN Git Service

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