OSDN Git Service

[VM] .
[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 void FLOPPY::reset()
16 {
17 /*
18         for(int i = 0; i < 4; i++) {
19                 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
20         }
21 */
22         ctrlreg = 0x80;
23         modereg = 0x03;
24 }
25
26 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
27 {
28         switch(addr & 0xffff) {
29         case 0xca:
30                 d_fdc->write_io8(1, data);
31                 break;
32         case 0xcc:
33                 if(!(ctrlreg & 0x80) && (data & 0x80)) {
34                         d_fdc->reset();
35                 }
36                 d_fdc->write_signal(SIG_UPD765A_FREADY, data, 0x40);
37                 d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
38                 ctrlreg = data;
39                 break;
40         case 0xbe:
41 /*
42                 if(!(modereg & 2) && (data & 2)) {
43                         d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
44                         d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
45                 } else if((modereg & 2) && !(data & 2)) {
46                         d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
47                         d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
48                 }
49 */
50                 modereg = data;
51                 break;
52         }
53 }
54
55 uint32_t FLOPPY::read_io8(uint32_t addr)
56 {
57         switch(addr & 0xffff) {
58         case 0xc8:
59                 return d_fdc->read_io8(0);
60         case 0xca:
61                 return d_fdc->read_io8(1);
62         case 0xcc:
63                 return (d_fdc->is_disk_inserted() ? 0x10 : 0) | 0x64;
64         case 0xbe:
65                 return (modereg & 0x03) | 0x08;
66         }
67         return addr & 0xff;
68 }
69
70 #define STATE_VERSION   1
71
72 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
73 {
74         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
75                 return false;
76         }
77         if(!state_fio->StateCheckInt32(this_device_id)) {
78                 return false;
79         }
80         state_fio->StateUint8(ctrlreg);
81         state_fio->StateUint8(modereg);
82         return true;
83 }