OSDN Git Service

f9186bd8c04c3557abc918a9ca04e1b02cf44476
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc9801 / cpureg.cpp
1 /*
2         NEC PC-9801VX Emulator 'ePC-9801VX'
3         NEC PC-9801RA Emulator 'ePC-9801RA'
4         NEC PC-98XA Emulator 'ePC-98XA'
5         NEC PC-98XL Emulator 'ePC-98XL'
6         NEC PC-98RL Emulator 'ePC-98RL'
7
8         Author : Takeda.Toshiya
9         Date   : 2017.06.25-
10
11         [ cpu regs ]
12 */
13
14 #include "cpureg.h"
15 #if defined(SUPPORT_32BIT_ADDRESS)
16 #include "../i386.h"
17 #else
18 #include "../i286.h"
19 #endif
20
21 namespace PC9801 {
22
23 void CPUREG::reset()
24 {
25         d_cpu->set_address_mask(0x000fffff);
26         nmi_enabled = false;
27 }
28
29 void CPUREG::write_io8(uint32_t addr, uint32_t data)
30 {
31         switch(addr) {
32         case 0x0050:
33                 nmi_enabled = false;
34                 break;
35         case 0x0052:
36                 nmi_enabled = true;
37                 break;
38         case 0x00f0:
39                 d_cpu->reset();
40                 d_cpu->set_address_mask(0x000fffff);
41                 break;
42         case 0x00f2:
43 //#if defined(SUPPORT_32BIT_ADDRESS)
44 //              d_cpu->set_address_mask(0xffffffff);
45 //#else
46                 d_cpu->set_address_mask(0x00ffffff);
47 //#endif
48                 break;
49 #if defined(SUPPORT_32BIT_ADDRESS)
50         case 0x00f6:
51                 switch(data) {
52                 case 0x02:
53 //                      d_cpu->set_address_mask(0xffffffff);
54                         d_cpu->set_address_mask(0x00ffffff);
55                         break;
56                 case 0x03:
57                         d_cpu->set_address_mask(0x000fffff);
58                         break;
59                 }
60                 break;
61 #endif
62         }
63 }
64
65 uint32_t CPUREG::read_io8(uint32_t addr)
66 {
67         uint32_t value;
68         
69         switch(addr) {
70         case 0x00f0:
71                 value  = 0x00;
72 //              value |= 0x80; // 1 = PC-9801NA, 0 = PC-9801NA/C
73 //              value |= 0x80; // 1 = PC-9821modelS1, 0 = PC-9821modelS2
74 //              value |= 0x80; // 1 = PC-9821CemodelS1, 0 = PC-9821CemodelS2
75 //              value |= 0x80; // 1 = PC-9821Xt, 0 = PC-9821Xa
76 //              value |= 0x80; // CPU MODE, 1 = High/Low, 0 = Middle (PC-9821Ap/As/Ae/Af)
77 //              value |= 0x40; // ODP, 1 = Existing (PC-9821Ts)
78 #if defined(SUPPORT_SCSI_IF)
79 //              value |= 0x40; // Internal 55-type SCSI-HDD, 0 = Existing
80 #endif
81 #if defined(SUPPORT_SASI_IF)
82 //              value |= 0x20; // Internal 27-type SASI-HDD, 0 = Existing
83 #endif
84 //              value |= 0x10; // Unknown
85                 value |= 0x08; // RAM access, 1 = Internal-standard/External-enhanced RAM, 0 = Internal-enhanced RAM
86 //              value |= 0x04; // Refresh mode, 1 = Standard, 0 = High speed
87 #if defined(HAS_I86) || defined(HAS_V30)
88                 value |= 0x02; // CPU mode, 1 = V30, 0 = 80286/80386
89 #endif
90                 value |= 0x01; // RAM access, 1 = Internal RAM, 0 = External-enhanced RAM
91                 return value;
92         case 0x00f2:
93                 return ((d_cpu->get_address_mask() & (1 << 20)) ? 0x00 : 0x01) | 0xfe;
94 #if defined(SUPPORT_32BIT_ADDRESS)
95         case 0x00f6:
96                 value  = 0x00;
97 #if defined(SUPPORT_HIRESO) && !defined(_PC98RL)
98                 value |= 0x10; // SASI-HDD, 1 = DMA ch0, 0 = DMA ch1
99 #endif
100                 if(nmi_enabled) {
101                         value |= 0x02; // NMI, 1 = Enabled
102                 }
103                 return ((d_cpu->get_address_mask() & (1 << 20)) ? 0x00 : 0x01) | value;
104 #endif
105         }
106         return 0xff;
107 }
108
109 #define STATE_VERSION   1
110
111 bool CPUREG::process_state(FILEIO* state_fio, bool loading)
112 {
113         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
114                 return false;
115         }
116         if(!state_fio->StateCheckInt32(this_device_id)) {
117                 return false;
118         }
119         state_fio->StateBool(nmi_enabled);
120         return true;
121 }
122
123 }
124