PCem

view src/model.c @ 164:9a88154e8608

Implemented NMI mask register for XT machines. Fixed PC200 NMI stuff.
author TomW
date Sat Sep 27 18:39:06 2014 +0100
parents af02d3d16c98
children
line source
1 #include "ibm.h"
2 #include "cpu.h"
3 #include "model.h"
4 #include "io.h"
6 #include "acer386sx.h"
7 #include "ali1429.h"
8 #include "amstrad.h"
9 #include "device.h"
10 #include "dma.h"
11 #include "fdc.h"
12 #include "gameport.h"
13 #include "headland.h"
14 #include "i430vx.h"
15 #include "ide.h"
16 #include "jim.h"
17 #include "keyboard_amstrad.h"
18 #include "keyboard_at.h"
19 #include "keyboard_olim24.h"
20 #include "keyboard_pcjr.h"
21 #include "keyboard_xt.h"
22 #include "lpt.h"
23 #include "mouse_ps2.h"
24 #include "mouse_serial.h"
25 #include "neat.h"
26 #include "nmi.h"
27 #include "nvr.h"
28 #include "olivetti_m24.h"
29 #include "pci.h"
30 #include "pic.h"
31 #include "piix.h"
32 #include "pit.h"
33 #include "serial.h"
34 #include "sis496.h"
35 #include "sound_sn76489.h"
36 #include "um8669f.h"
37 #include "um8881f.h"
38 #include "wd76c10.h"
39 #include "xtide.h"
41 void xt_init();
42 void pcjr_init();
43 void tandy1k_init();
44 void ams_init();
45 void europc_init();
46 void olim24_init();
47 void at_init();
48 void at_neat_init();
49 void at_acer386sx_init();
50 void at_wd76c10_init();
51 void at_ali1429_init();
52 void at_headland_init();
53 void at_um8881f_init();
54 void at_sis496_init();
55 void at_i430vx_init();
57 int model;
59 MODEL models[] =
60 {
61 {"IBM PC", ROM_IBMPC, { "", cpus_8088, "", NULL, "", NULL}, 0, xt_init},
62 {"IBM XT", ROM_IBMXT, { "", cpus_8088, "", NULL, "", NULL}, 0, xt_init},
63 {"IBM PCjr", ROM_IBMPCJR, { "", cpus_pcjr, "", NULL, "", NULL}, 1, pcjr_init},
64 {"Generic XT clone", ROM_GENXT, { "", cpus_8088, "", NULL, "", NULL}, 0, xt_init},
65 {"DTK XT clone", ROM_DTKXT, { "", cpus_8088, "", NULL, "", NULL}, 0, xt_init},
66 {"Tandy 1000", ROM_TANDY, { "", cpus_8088, "", NULL, "", NULL}, 1, tandy1k_init},
67 {"Amstrad PC1512", ROM_PC1512, { "", cpus_pc1512, "", NULL, "", NULL}, 1, ams_init},
68 {"Sinclair PC200", ROM_PC200, { "", cpus_8086, "", NULL, "", NULL}, 1, ams_init},
69 {"Euro PC", ROM_EUROPC, { "", cpus_8086, "", NULL, "", NULL}, 0, europc_init},
70 {"Olivetti M24", ROM_OLIM24, { "", cpus_8086, "", NULL, "", NULL}, 1, olim24_init},
71 {"Amstrad PC1640", ROM_PC1640, { "", cpus_8086, "", NULL, "", NULL}, 1, ams_init},
72 {"Amstrad PC2086", ROM_PC2086, { "", cpus_8086, "", NULL, "", NULL}, 1, ams_init},
73 {"Amstrad PC3086", ROM_PC3086, { "", cpus_8086, "", NULL, "", NULL}, 1, ams_init},
74 {"IBM AT", ROM_IBMAT, { "", cpus_ibmat, "", NULL, "", NULL}, 0, at_init},
75 {"Commodore PC 30 III", ROM_CMDPC30, { "", cpus_286, "", NULL, "", NULL}, 0, at_init},
76 {"AMI 286 clone", ROM_AMI286, { "", cpus_286, "", NULL, "", NULL}, 0, at_neat_init},
77 {"DELL System 200", ROM_DELL200, { "", cpus_286, "", NULL, "", NULL}, 0, at_init},
78 {"Acer 386SX25/N", ROM_ACER386, { "Intel", cpus_acer, "", NULL, "", NULL}, 1, at_acer386sx_init},
79 {"Amstrad MegaPC", ROM_MEGAPC, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 1, at_wd76c10_init},
80 {"AMI 386 clone", ROM_AMI386, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 0, at_headland_init},
81 {"AMI 486 clone", ROM_AMI486, { "Intel", cpus_i486, "AMD", cpus_Am486, "Cyrix", cpus_Cx486}, 0, at_ali1429_init},
82 {"AMI WinBIOS 486", ROM_WIN486, { "Intel", cpus_i486, "AMD", cpus_Am486, "Cyrix", cpus_Cx486}, 0, at_ali1429_init},
83 /* {"AMI WinBIOS 486 PCI", ROM_PCI486, { "Intel", cpus_i486, "AMD", cpus_Am486, "Cyrix", cpus_Cx486}, 0, at_um8881f_init},*/
84 {"Award SiS 496/497", ROM_SIS496, { "Intel", cpus_i486, "AMD", cpus_Am486, "Cyrix", cpus_Cx486}, 0, at_sis496_init},
85 {"Award 430VX PCI", ROM_430VX, { "IDT", cpus_WinChip, "", NULL, "", NULL}, 0, at_i430vx_init},
86 {"", -1, {"", 0, "", 0, "", 0}, 0}
87 };
89 int model_count()
90 {
91 return (sizeof(models) / sizeof(MODEL)) - 1;
92 }
94 int model_getromset()
95 {
96 return models[model].id;
97 }
99 int model_getmodel(int romset)
100 {
101 int c = 0;
103 while (models[c].id != -1)
104 {
105 if (models[c].id == romset)
106 return c;
107 c++;
108 }
110 return 0;
111 }
113 char *model_getname()
114 {
115 return models[model].name;
116 }
118 void common_init()
119 {
120 dma_init();
121 fdc_add();
122 lpt_init();
123 pic_init();
124 pit_init();
125 serial1_init(0x3f8, 4);
126 serial2_init(0x2f8, 3);
127 device_add(&gameport_device);
128 }
130 void xt_init()
131 {
132 common_init();
133 pit_set_out_func(1, pit_refresh_timer_xt);
134 keyboard_xt_init();
135 mouse_serial_init();
136 xtide_init();
137 nmi_init();
138 }
140 void pcjr_init()
141 {
142 fdc_add_pcjr();
143 pic_init();
144 pit_init();
145 pit_set_out_func(0, pit_irq0_timer_pcjr);
146 serial1_init(0x2f8, 3);
147 keyboard_pcjr_init();
148 device_add(&sn76489_device);
149 nmi_mask = 0x80;
150 }
152 void tandy1k_init()
153 {
154 common_init();
155 keyboard_xt_init();
156 mouse_serial_init();
157 device_add(&sn76489_device);
158 xtide_init();
159 nmi_init();
160 }
162 void ams_init()
163 {
164 common_init();
165 amstrad_init();
166 keyboard_amstrad_init();
167 nvr_init();
168 xtide_init();
169 nmi_init();
170 }
172 void europc_init()
173 {
174 common_init();
175 jim_init();
176 keyboard_xt_init();
177 mouse_serial_init();
178 xtide_init();
179 nmi_init();
180 }
182 void olim24_init()
183 {
184 common_init();
185 keyboard_olim24_init();
186 nvr_init();
187 olivetti_m24_init();
188 xtide_init();
189 nmi_init();
190 }
192 void at_init()
193 {
194 common_init();
195 pit_set_out_func(1, pit_refresh_timer_at);
196 dma16_init();
197 ide_init();
198 keyboard_at_init();
199 if (models[model].init == at_init)
200 mouse_serial_init();
201 nvr_init();
202 pic2_init();
203 }
205 void at_neat_init()
206 {
207 at_init();
208 mouse_serial_init();
209 neat_init();
210 }
212 void at_acer386sx_init()
213 {
214 at_init();
215 mouse_ps2_init();
216 acer386sx_init();
217 }
219 void at_wd76c10_init()
220 {
221 at_init();
222 mouse_ps2_init();
223 wd76c10_init();
224 }
226 void at_headland_init()
227 {
228 at_init();
229 headland_init();
230 mouse_serial_init();
231 }
233 void at_ali1429_init()
234 {
235 at_init();
236 ali1429_init();
237 mouse_serial_init();
238 }
240 void at_um8881f_init()
241 {
242 at_init();
243 mouse_serial_init();
244 pci_init();
245 um8881f_init();
246 }
248 void at_sis496_init()
249 {
250 at_init();
251 mouse_serial_init();
252 pci_init();
253 device_add(&sis496_device);
254 }
256 void at_i430vx_init()
257 {
258 at_init();
259 mouse_serial_init();
260 pci_init();
261 i430vx_init();
262 piix_init(7);
263 um8669f_init();
264 }
266 void model_init()
267 {
268 pclog("Initting as %s\n", model_getname());
269 io_init();
271 models[model].init();
272 }