OSDN Git Service

c28d0d197d1878f62755873ae122d615b49f7f39
[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 void CPUREG::reset()
22 {
23         d_cpu->set_address_mask(0x000fffff);
24         nmi_enabled = false;
25 }
26
27 void CPUREG::write_io8(uint32_t addr, uint32_t data)
28 {
29         switch(addr) {
30         case 0x0050:
31                 nmi_enabled = false;
32                 break;
33         case 0x0052:
34                 nmi_enabled = true;
35                 break;
36         case 0x00f0:
37                 d_cpu->reset();
38                 d_cpu->set_address_mask(0x000fffff);
39                 break;
40         case 0x00f2:
41 //#if defined(SUPPORT_32BIT_ADDRESS)
42 //              d_cpu->set_address_mask(0xffffffff);
43 //#else
44                 d_cpu->set_address_mask(0x00ffffff);
45 //#endif
46                 break;
47 #if defined(SUPPORT_32BIT_ADDRESS)
48         case 0x00f6:
49                 switch(data) {
50                 case 0x02:
51 //                      d_cpu->set_address_mask(0xffffffff);
52                         d_cpu->set_address_mask(0x00ffffff);
53                         break;
54                 case 0x03:
55                         d_cpu->set_address_mask(0x000fffff);
56                         break;
57                 }
58                 break;
59 #endif
60         }
61 }
62
63 uint32_t CPUREG::read_io8(uint32_t addr)
64 {
65         uint32_t value;
66         
67         switch(addr) {
68         case 0x00f0:
69                 value  = 0x00;
70 //              value |= 0x80; // 1 = PC-9801NA, 0 = PC-9801NA/C
71 //              value |= 0x80; // 1 = PC-9821modelS1, 0 = PC-9821modelS2
72 //              value |= 0x80; // 1 = PC-9821CemodelS1, 0 = PC-9821CemodelS2
73 //              value |= 0x80; // 1 = PC-9821Xt, 0 = PC-9821Xa
74 //              value |= 0x80; // CPU MODE, 1 = High/Low, 0 = Middle (PC-9821Ap/As/Ae/Af)
75 //              value |= 0x40; // ODP, 1 = Existing (PC-9821Ts)
76 #if defined(SUPPORT_SCSI_IF)
77 //              value |= 0x40; // Internal 55-type SCSI-HDD, 0 = Existing
78 #endif
79 #if defined(SUPPORT_SASI_IF)
80 //              value |= 0x20; // Internal 27-type SASI-HDD, 0 = Existing
81 #endif
82 //              value |= 0x10; // Unknown
83                 value |= 0x08; // RAM access, 1 = Internal-standard/External-enhanced RAM, 0 = Internal-enhanced RAM
84 //              value |= 0x04; // Refresh mode, 1 = Standard, 0 = High speed
85 #if defined(HAS_I86) || defined(HAS_V30)
86                 value |= 0x02; // CPU mode, 1 = V30, 0 = 80286/80386
87 #endif
88                 value |= 0x01; // RAM access, 1 = Internal RAM, 0 = External-enhanced RAM
89                 return value;
90         case 0x00f2:
91                 return ((d_cpu->get_address_mask() & (1 << 20)) ? 0x00 : 0x01) | 0xfe;
92 #if defined(SUPPORT_32BIT_ADDRESS)
93         case 0x00f6:
94                 value  = 0x00;
95 #if defined(SUPPORT_HIRESO) && !defined(_PC98RL)
96                 value |= 0x10; // SASI-HDD, 1 = DMA ch0, 0 = DMA ch1
97 #endif
98                 if(nmi_enabled) {
99                         value |= 0x02; // NMI, 1 = Enabled
100                 }
101                 return ((d_cpu->get_address_mask() & (1 << 20)) ? 0x00 : 0x01) | value;
102 #endif
103         }
104         return 0xff;
105 }
106
107 #define STATE_VERSION   1
108
109 bool CPUREG::process_state(FILEIO* state_fio, bool loading)
110 {
111         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
112                 return false;
113         }
114         if(!state_fio->StateCheckInt32(this_device_id)) {
115                 return false;
116         }
117         state_fio->StateBool(nmi_enabled);
118         return true;
119 }