OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[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
13 namespace PASOPIA7 {
14
15 void IOTRAP::initialize()
16 {
17         nmi_mask = pasopia = false;
18 }
19
20 void IOTRAP::write_io8(uint32_t addr, uint32_t data)
21 {
22         switch(addr & 0xff) {
23         case 0x00:
24         case 0x01:
25         case 0x02:
26         case 0x03:
27                 if(pasopia) {
28                         // trap : 8255-2 Port B, bit 1
29                         d_pio2->write_signal(SIG_I8255_PORT_B, 2, 2);
30                         // nmi
31                         if(!nmi_mask) {
32                                 d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
33                         }
34                 }
35                 break;
36         }
37 }
38
39 uint32_t IOTRAP::read_io8(uint32_t addr)
40 {
41         switch(addr & 0xff) {
42         case 0x00:
43         case 0x01:
44         case 0x02:
45         case 0x03:
46                 if(pasopia) {
47                         // trap : 8255-2 Port B, bit 1
48                         d_pio2->write_signal(SIG_I8255_PORT_B, 2, 2);
49                         // nmi
50                         if(!nmi_mask) {
51                                 d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
52                         }
53                 }
54                 return 0xff;
55         }
56         return 0xff;
57 }
58
59 void IOTRAP::write_signal(int id, uint32_t data, uint32_t mask)
60 {
61         if(id == SIG_IOTRAP_I8255_2_A) {
62                 // reset nmi : 8255-2 Port B, bit 1+2
63                 if(data & 1) {
64                         d_pio2->write_signal(SIG_I8255_PORT_B, 0, 6);
65                 }
66         } else if(id == SIG_IOTRAP_I8255_2_C) {
67                 nmi_mask = ((data & 0x80) != 0);
68                 pasopia = ((data & 0x40) != 0);
69         }
70 }
71
72 void IOTRAP::do_reset()
73 {
74         // reset : 8255-2 Port B, bit 2
75         d_pio2->write_signal(SIG_I8255_PORT_B, 4, 4);
76         // nmi
77         if(!nmi_mask) {
78                 d_cpu->write_signal(SIG_CPU_NMI, 1, 1);
79         }
80 }
81
82 #define STATE_VERSION   1
83
84 bool IOTRAP::process_state(FILEIO* state_fio, bool loading)
85 {
86         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
87                 return false;
88         }
89         if(!state_fio->StateCheckInt32(this_device_id)) {
90                 return false;
91         }
92         state_fio->StateBool(nmi_mask);
93         state_fio->StateBool(pasopia);
94         return true;
95 }
96
97 }