OSDN Git Service

[VM][FMTOWNS][MEMORY] Fix setup around memory banks by I/O 0404h and 0480h.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pasopia / floppy.cpp
1 /*
2         TOSHIBA PASOPIA Emulator 'EmuPIA'
3
4         Author : Takeda.Toshiya
5         Date   : 2012.03.01 -
6
7         [ floppy ]
8 */
9
10 #include "floppy.h"
11 #include "../upd765a.h"
12
13 namespace PASOPIA {
14
15 void FLOPPY::initialize()
16 {
17         intr = false;
18 }
19
20 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
21 {
22         if(!supported) {
23                 // OA-BASIC without floppy drives
24                 return;
25         }
26         
27         switch(addr & 0xff) {
28         case 0xe0:
29                 // tc off
30                 d_fdc->write_signal(SIG_UPD765A_TC, 0, 1);
31                 break;
32         case 0xe2:
33                 // tc on
34                 d_fdc->write_signal(SIG_UPD765A_TC, 1, 1);
35                 break;
36         case 0xe4:
37         case 0xe5:
38                 d_fdc->write_io8(addr, data);
39                 break;
40         case 0xe6:
41                 // fdc reset
42                 if(data & 0x80) {
43                         d_fdc->reset();
44                 }
45                 // motor on/off
46                 d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x40);
47                 break;
48         }
49 }
50
51 uint32_t FLOPPY::read_io8(uint32_t addr)
52 {
53         if(!supported) {
54                 // OA-BASIC without floppy drives
55                 return 0xff;
56         }
57         
58         switch(addr & 0xff) {
59         case 0xe4:
60         case 0xe5:
61                 return d_fdc->read_io8(addr);
62         case 0xe6:
63                 // fdc intr
64                 return intr ? 0x80 : 0;
65         }
66         return 0xff;
67 }
68
69 void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
70 {
71         if(id == SIG_FLOPPY_INTR) {
72                 intr = ((data & mask) != 0);
73         }
74 }
75
76 #define STATE_VERSION   1
77
78 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
79 {
80         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
81                 return false;
82         }
83         if(!state_fio->StateCheckInt32(this_device_id)) {
84                 return false;
85         }
86         state_fio->StateValue(intr);
87         state_fio->StateValue(supported);
88         return true;
89 }
90
91 }