OSDN Git Service

[VM][WIP] Use namespace to devices per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / jx / floppy.cpp
1 /*
2         IBM Japan Ltd PC/JX Emulator 'eJX'
3
4         Author : Takeda.Toshiya
5         Date   : 2011.05.09-
6
7         [ diskette i/f ]
8 */
9
10 #include "floppy.h"
11 #include "../i8259.h"
12 #include "../upd765a.h"
13
14 namespace JX {
15
16 void FLOPPY::reset()
17 {
18         prev = 0;
19         register_id = -1;
20 }
21
22 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
23 {
24         switch(addr) {
25         case 0xf2:
26                 d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 1);        // drive enable
27                 if(data & 0x20) {
28                         // WatchDog Timer is enabled
29                         if((prev & 0x40) && !(data & 0x40)) {
30                                 if(register_id != -1) {
31                                         cancel_event(this, register_id);
32                                 }
33                                 register_event_by_clock(this, 0, 3 * CPU_CLOCKS, false, &register_id);
34                         }
35                 } else {
36                         if(register_id != -1) {
37                                 cancel_event(this, register_id);
38                                 register_id = -1;
39                         }
40                 }
41                 if((prev & 0x80) && !(data & 0x80)) {
42                         d_fdc->reset();
43                 }
44                 prev = data;
45                 break;
46         }
47 }
48
49 void FLOPPY::event_callback(int event_id, int err)
50 {
51         // WatchDog Timer
52         this->out_debug_log(_T("WatchDog Timer\n"));
53         d_pic->write_signal(SIG_I8259_IR6, 1, 1);
54         register_id = -1;
55 }
56
57 #define STATE_VERSION   1
58
59 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
60 {
61         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
62                 return false;
63         }
64         if(!state_fio->StateCheckInt32(this_device_id)) {
65                 return false;
66         }
67         state_fio->StateUint8(prev);
68         state_fio->StateInt32(register_id);
69         return true;
70 }
71
72 }