OSDN Git Service

[General] Convert sourcecode's CRLF format: DOS(WINDOWS) to Unix, to apply patches...
[csp-qt/common_source_project-fm7.git] / source / src / vm / pasopia7 / iotrap.cpp
1 /*
2         TOSHIBA PASOPIA 7 Emulator 'EmuPIA7'
3
4         Author : Takeda.Toshiya
5         Date   : 2006.09.20 -
6
7         [ i/o trap ]
8 */
9
10 #include "iotrap.h"
11 #include "../i8255.h"
12 #include "../../fileio.h"
13
14 void IOTRAP::initialize()
15 {
16         nmi_mask = pasopia = false;
17 }
18
19 void IOTRAP::write_io8(uint32 addr, uint32 data)
20 {
21         switch(addr & 0xff) {
22         case 0x00:
23         case 0x01:
24         case 0x02:
25         case 0x03:
26                 if(pasopia) {
27                         // trap : 8255-2 Port B, bit 1
28                         d_pio2->write_signal(SIG_I8255_PORT_B, 2, 2);
29                         // nmi
30                         if(!nmi_mask) {
31                                 d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
32                         }
33                 }
34                 break;
35         }
36 }
37
38 uint32 IOTRAP::read_io8(uint32 addr)
39 {
40         switch(addr & 0xff) {
41         case 0x00:
42         case 0x01:
43         case 0x02:
44         case 0x03:
45                 if(pasopia) {
46                         // trap : 8255-2 Port B, bit 1
47                         d_pio2->write_signal(SIG_I8255_PORT_B, 2, 2);
48                         // nmi
49                         if(!nmi_mask) {
50                                 d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
51                         }
52                 }
53                 return 0xff;
54         }
55         return 0xff;
56 }
57
58 void IOTRAP::write_signal(int id, uint32 data, uint32 mask)
59 {
60         if(id == SIG_IOTRAP_I8255_2_A) {
61                 // reset nmi : 8255-2 Port B, bit 1+2
62                 if(data & 1) {
63                         d_pio2->write_signal(SIG_I8255_PORT_B, 0, 6);
64                 }
65         } else if(id == SIG_IOTRAP_I8255_2_C) {
66                 nmi_mask = ((data & 0x80) != 0);
67                 pasopia = ((data & 0x40) != 0);
68         }
69 }
70
71 void IOTRAP::do_reset()
72 {
73         // reset : 8255-2 Port B, bit 2
74         d_pio2->write_signal(SIG_I8255_PORT_B, 4, 4);
75         // nmi
76         if(!nmi_mask) {
77                 d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
78         }
79 }
80
81 #define STATE_VERSION   1
82
83 void IOTRAP::save_state(FILEIO* state_fio)
84 {
85         state_fio->FputUint32(STATE_VERSION);
86         state_fio->FputInt32(this_device_id);
87         
88         state_fio->FputBool(nmi_mask);
89         state_fio->FputBool(pasopia);
90 }
91
92 bool IOTRAP::load_state(FILEIO* state_fio)
93 {
94         if(state_fio->FgetUint32() != STATE_VERSION) {
95                 return false;
96         }
97         if(state_fio->FgetInt32() != this_device_id) {
98                 return false;
99         }
100         nmi_mask = state_fio->FgetBool();
101         pasopia = state_fio->FgetBool();
102         return true;
103 }
104