OSDN Git Service

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