PCem

view src/ibm.h @ 120:47132154ffe7

Added emulation of Phoenix Trio32. Based on patch from Battler. Paradise Bahamas 64, Number Nine 9FX and Phoenix Trio32 now have configurable memory sizes.
author TomW
date Wed Jul 09 21:45:42 2014 +0100
parents e4da69090d05
children 84742b645324
line source
1 #include <stdio.h>
2 #include <stdint.h>
3 #include <string.h>
4 #define printf pclog
6 /*Memory*/
7 uint8_t *ram,*vram;
9 uint32_t rammask;
11 int readlookup[256],readlookupp[256];
12 uint32_t *readlookup2;
13 int readlnext;
14 int writelookup[256],writelookupp[256];
15 uint32_t *writelookup2;
16 int writelnext;
18 extern int mmu_perm;
20 #define readmemb(a) ((readlookup2[(a)>>12]==0xFFFFFFFF)?readmembl(a):*(uint8_t *)(readlookup2[(a) >> 12] + (a)))
21 #define readmemw(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFE)?readmemwl(s,a):*(uint16_t *)(readlookup2[((s)+(a))>>12]+(s)+(a)))
22 #define readmeml(s,a) ((readlookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFC)?readmemll(s,a):*(uint32_t *)(readlookup2[((s)+(a))>>12]+(s)+(a)))
24 //#define writememb(a,v) if (writelookup2[(a)>>12]==0xFFFFFFFF) writemembl(a,v); else ram[writelookup2[(a)>>12]+((a)&0xFFF)]=v
25 //#define writememw(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememwl(s,a,v); else *((uint16_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v
26 //#define writememl(s,a,v) if (writelookup2[((s)+(a))>>12]==0xFFFFFFFF || (s)==0xFFFFFFFF) writememll(s,a,v); else *((uint32_t *)(&ram[writelookup2[((s)+(a))>>12]+(((s)+(a))&0xFFF)]))=v
27 //#define readmemb(a) ((isram[((a)>>16)&255] && !(cr0>>31))?ram[a&0xFFFFFF]:readmembl(a))
28 //#define writememb(a,v) if (isram[((a)>>16)&255] && !(cr0>>31)) ram[a&0xFFFFFF]=v; else writemembl(a,v)
30 //void writememb(uint32_t addr, uint8_t val);
31 uint8_t readmembl(uint32_t addr);
32 void writemembl(uint32_t addr, uint8_t val);
33 uint8_t readmemb386l(uint32_t seg, uint32_t addr);
34 void writememb386l(uint32_t seg, uint32_t addr, uint8_t val);
35 uint16_t readmemwl(uint32_t seg, uint32_t addr);
36 void writememwl(uint32_t seg, uint32_t addr, uint16_t val);
37 uint32_t readmemll(uint32_t seg, uint32_t addr);
38 void writememll(uint32_t seg, uint32_t addr, uint32_t val);
40 uint8_t *getpccache(uint32_t a);
42 uint32_t mmutranslatereal(uint32_t addr, int rw);
44 void addreadlookup(uint32_t virt, uint32_t phys);
45 void addwritelookup(uint32_t virt, uint32_t phys);
48 /*IO*/
49 uint8_t inb(uint16_t port);
50 void outb(uint16_t port, uint8_t val);
51 uint16_t inw(uint16_t port);
52 void outw(uint16_t port, uint16_t val);
53 uint32_t inl(uint16_t port);
54 void outl(uint16_t port, uint32_t val);
56 FILE *romfopen(char *fn, char *mode);
57 extern int shadowbios,shadowbios_write;
58 extern int cache;
59 extern int mem_size;
60 extern int readlnum,writelnum;
61 extern int memwaitstate;
64 /*Processor*/
65 #define EAX regs[0].l
66 #define ECX regs[1].l
67 #define EDX regs[2].l
68 #define EBX regs[3].l
69 #define ESP regs[4].l
70 #define EBP regs[5].l
71 #define ESI regs[6].l
72 #define EDI regs[7].l
73 #define AX regs[0].w
74 #define CX regs[1].w
75 #define DX regs[2].w
76 #define BX regs[3].w
77 #define SP regs[4].w
78 #define BP regs[5].w
79 #define SI regs[6].w
80 #define DI regs[7].w
81 #define AL regs[0].b.l
82 #define AH regs[0].b.h
83 #define CL regs[1].b.l
84 #define CH regs[1].b.h
85 #define DL regs[2].b.l
86 #define DH regs[2].b.h
87 #define BL regs[3].b.l
88 #define BH regs[3].b.h
90 typedef union
91 {
92 uint32_t l;
93 uint16_t w;
94 struct
95 {
96 uint8_t l,h;
97 } b;
98 } x86reg;
100 x86reg regs[8];
101 uint16_t flags,eflags;
102 uint32_t /*cs,ds,es,ss,*/oldds,oldss,pc,olddslimit,oldsslimit,olddslimitw,oldsslimitw;
103 //uint16_t msw;
105 extern int ins,output;
106 extern int cycdiff;
108 typedef struct
109 {
110 uint32_t base;
111 uint32_t limit,limitw;
112 uint8_t access;
113 uint16_t seg;
114 } x86seg;
116 x86seg gdt,ldt,idt,tr;
117 x86seg _cs,_ds,_es,_ss,_fs,_gs;
118 x86seg _oldds;
120 uint32_t pccache;
121 uint8_t *pccache2;
122 /*Segments -
123 _cs,_ds,_es,_ss are the segment structures
124 CS,DS,ES,SS is the 16-bit data
125 cs,ds,es,ss are defines to the bases*/
126 //uint16_t CS,DS,ES,SS;
127 #define CS _cs.seg
128 #define DS _ds.seg
129 #define ES _es.seg
130 #define SS _ss.seg
131 #define FS _fs.seg
132 #define GS _gs.seg
133 #define cs _cs.base
134 #define ds _ds.base
135 #define es _es.base
136 #define ss _ss.base
137 #define fs _fs.base
138 #define gs _gs.base
140 #define CPL ((_cs.access>>5)&3)
142 void loadseg(uint16_t seg, x86seg *s);
143 void loadcs(uint16_t seg);
145 union
146 {
147 uint32_t l;
148 uint16_t w;
149 } CR0;
151 #define cr0 CR0.l
152 #define msw CR0.w
154 uint32_t cr2,cr3;
156 #define C_FLAG 0x0001
157 #define P_FLAG 0x0004
158 #define A_FLAG 0x0010
159 #define Z_FLAG 0x0040
160 #define N_FLAG 0x0080
161 #define T_FLAG 0x0100
162 #define I_FLAG 0x0200
163 #define D_FLAG 0x0400
164 #define V_FLAG 0x0800
165 #define NT_FLAG 0x4000
166 #define VM_FLAG 0x0002 /*In EFLAGS*/
168 #define WP_FLAG 0x10000 /*In CR0*/
170 #define IOPL ((flags>>12)&3)
172 #define IOPLp ((!(msw&1)) || (CPL<=IOPL))
173 //#define IOPLp 1
175 //#define IOPLV86 ((!(msw&1)) || (CPL<=IOPL))
176 extern int cycles;
177 extern int cycles_lost;
178 extern int is486;
179 extern uint8_t opcode;
180 extern int insc;
181 extern int fpucount;
182 extern float mips,flops;
183 extern int clockrate;
184 extern int cgate16;
185 extern int CPUID;
187 extern int cpl_override;
189 /*Timer*/
190 typedef struct PIT
191 {
192 uint32_t l[3];
193 int c[3];
194 uint8_t m[3];
195 uint8_t ctrl,ctrls[2];
196 int wp,rm[3],wm[3];
197 uint16_t rl[3];
198 int thit[3];
199 int delay[3];
200 int rereadlatch[3];
201 int gate[3];
202 int out[3];
203 int running[3];
204 int enabled[3];
205 int newcount[3];
206 int count[3];
207 int using_timer[3];
208 int initial[3];
209 } PIT;
211 PIT pit;
212 void setpitclock(float clock);
213 int pitcount;
215 float pit_timer0_freq();
219 /*DMA*/
220 typedef struct DMA
221 {
222 uint16_t ab[4],ac[4];
223 uint16_t cb[4];
224 int cc[4];
225 int wp;
226 uint8_t m,mode[4];
227 uint8_t page[4];
228 uint8_t stat;
229 uint8_t command;
230 } DMA;
232 DMA dma,dma16;
235 /*PPI*/
236 typedef struct PPI
237 {
238 int s2;
239 uint8_t pa,pb;
240 } PPI;
242 PPI ppi;
243 extern int key_inhibit;
246 /*PIC*/
247 typedef struct PIC
248 {
249 uint8_t icw1,mask,ins,pend,mask2;
250 int icw;
251 uint8_t vector;
252 int read;
253 } PIC;
255 PIC pic,pic2;
256 extern int pic_intpending;
257 int intcount;
260 int disctime;
261 char discfns[2][256];
262 int driveempty[2];
265 /*Config stuff*/
266 #define MDA ((gfxcard==GFX_MDA || gfxcard==GFX_HERCULES) && (romset<ROM_TANDY || romset>=ROM_IBMAT))
267 #define HERCULES (gfxcard==GFX_HERCULES && (romset<ROM_TANDY || romset>=ROM_IBMAT))
268 #define AMSTRAD (romset==ROM_PC1512 || romset==ROM_PC1640 || romset==ROM_PC3086)
269 #define AMSTRADIO (romset==ROM_PC1512 || romset==ROM_PC1640 || romset==ROM_PC200 || romset==ROM_PC2086 || romset == ROM_PC3086)
270 #define TANDY (romset==ROM_TANDY/* || romset==ROM_IBMPCJR*/)
271 #define VID_EGA (gfxcard==GFX_EGA)
272 #define EGA (romset==ROM_PC1640 || VID_EGA || VGA)
273 #define VGA ((gfxcard>=GFX_TVGA || romset==ROM_ACER386) && romset!=ROM_PC1640 && romset!=ROM_PC1512 && romset!=ROM_TANDY && romset!=ROM_PC200)
274 #define SVGA (gfxcard==GFX_ET4000 && VGA)
275 #define TRIDENT (gfxcard==GFX_TVGA && !OTI067)
276 #define OTI067 (romset==ROM_ACER386)
277 #define ET4000 (gfxcard==GFX_ET4000 && VGA)
278 #define ET4000W32 (gfxcard==GFX_ET4000W32 && VGA)
279 #define AT (romset>=ROM_IBMAT)
280 #define PCI (romset >= ROM_PCI486)
281 #define PCJR (romset == ROM_IBMPCJR)
283 #define AMIBIOS (romset==ROM_AMI386 || romset==ROM_AMI486 || romset == ROM_WIN486)
285 int GAMEBLASTER, GUS, SSI2001;
287 enum
288 {
289 ROM_IBMPC = 0, /*301 keyboard error, 131 cassette (!!!) error*/
290 ROM_IBMXT, /*301 keyboard error*/
291 ROM_IBMPCJR,
292 ROM_GENXT, /*'Generic XT BIOS'*/
293 ROM_DTKXT,
294 ROM_EUROPC,
295 ROM_OLIM24,
296 ROM_TANDY,
297 ROM_PC1512,
298 ROM_PC200,
299 ROM_PC1640,
300 ROM_PC2086,
301 ROM_PC3086,
302 ROM_IBMAT,
303 ROM_CMDPC30,
304 ROM_AMI286,
305 ROM_DELL200,
306 ROM_MISC286,
307 ROM_IBMAT386,
308 ROM_ACER386,
309 ROM_MEGAPC,
310 ROM_AMI386,
311 ROM_AMI486,
312 ROM_WIN486,
313 ROM_PCI486,
314 ROM_SIS496,
315 ROM_430VX,
317 ROM_MAX
318 };
320 extern int romspresent[ROM_MAX];
322 //#define ROM_IBMPCJR 5 /*Not working! ROMs are corrupt*/
323 #define is386 (romset>=ROM_IBMAT386)
324 #define is386sx 0
326 int hasfpu;
327 int romset;
329 enum
330 {
331 GFX_CGA = 0,
332 GFX_MDA,
333 GFX_HERCULES,
334 GFX_EGA, /*Using IBM EGA BIOS*/
335 GFX_TVGA, /*Using Trident TVGA8900D BIOS*/
336 GFX_ET4000, /*Tseng ET4000*/
337 GFX_ET4000W32, /*Tseng ET4000/W32p (Diamond Stealth 32)*/
338 GFX_BAHAMAS64, /*S3 Vision864 (Paradise Bahamas 64)*/
339 GFX_N9_9FX, /*S3 764/Trio64 (Number Nine 9FX)*/
340 GFX_VIRGE, /*S3 Virge*/
341 GFX_TGUI9440, /*Trident TGUI9440*/
342 GFX_VGA, /*IBM VGA*/
343 GFX_VGAEDGE16, /*ATI VGA Edge-16 (18800-1)*/
344 GFX_VGACHARGER, /*ATI VGA Charger (28800-5)*/
345 GFX_OTI067, /*Oak OTI-067*/
346 GFX_MACH64GX, /*ATI Graphics Pro Turbo (Mach64)*/
347 GFX_CL_GD5429, /*Cirrus Logic CL-GD5429*/
348 GFX_VIRGEDX, /*S3 Virge/DX*/
349 GFX_PHOENIX_TRIO32, /*S3 732/Trio32 (Phoenix)*/
351 GFX_MAX
352 };
354 extern int gfx_present[GFX_MAX];
356 int gfxcard;
358 int cpuspeed;
361 /*Video*/
362 void (*pollvideo)();
363 void pollega();
364 int readflash;
365 uint8_t hercctrl;
366 int slowega,egacycles,egacycles2;
367 extern uint8_t gdcreg[16];
368 extern int egareads,egawrites;
369 extern int cga_comp;
370 extern int vid_resize;
371 extern int vid_api;
372 extern int winsizex,winsizey;
373 extern int chain4;
375 uint8_t readvram(uint16_t addr);
376 void writevram(uint16_t addr, uint8_t val);
377 void writevramgen(uint16_t addr, uint8_t val);
379 uint8_t readtandyvram(uint16_t addr);
380 void writetandy(uint16_t addr, uint8_t val);
381 void writetandyvram(uint16_t addr, uint8_t val);
383 extern int et4k_b8000;
384 extern int changeframecount;
385 extern uint8_t changedvram[(8192*1024)/1024];
387 void writeega_chain4(uint32_t addr, uint8_t val);
388 extern uint32_t svgarbank,svgawbank;
390 /*Serial*/
391 extern int mousedelay;
394 /*Sound*/
395 uint8_t spkstat;
397 float spktime;
398 int rtctime;
399 int soundtime,gustime,gustime2,vidtime;
400 int ppispeakon;
401 float CGACONST;
402 float MDACONST;
403 float VGACONST1,VGACONST2;
404 float RTCCONST;
405 int gated,speakval,speakon;
407 #define SOUNDBUFLEN (48000/10)
410 /*Sound Blaster*/
411 /*int sbenable,sblatchi,sblatcho,sbcount,sb_enable_i,sb_count_i;
412 int16_t sbdat;*/
413 void setsbclock(float clock);
415 #define SADLIB 1 /*No DSP*/
416 #define SB1 2 /*DSP v1.05*/
417 #define SB15 3 /*DSP v2.00*/
418 #define SB2 4 /*DSP v2.01 - needed for high-speed DMA*/
419 #define SBPRO 5 /*DSP v3.00*/
420 #define SBPRO2 6 /*DSP v3.02 + OPL3*/
421 #define SB16 7 /*DSP v4.05 + OPL3*/
422 #define SADGOLD 8 /*AdLib Gold*/
423 #define SND_WSS 9 /*Windows Sound System*/
424 #define SND_PAS16 10 /*Pro Audio Spectrum 16*/
426 int sbtype;
428 int clocks[3][12][4];
429 int at70hz;
431 char pcempath[512];
434 /*Hard disc*/
436 typedef struct
437 {
438 FILE *f;
439 int spt,hpc; /*Sectors per track, heads per cylinder*/
440 int tracks;
441 } PcemHDC;
443 PcemHDC hdc[2];
445 /*Keyboard*/
446 int keybsenddelay;
449 /*CD-ROM*/
450 extern int cdrom_drive;
451 extern int idecallback[2];
452 extern int cdrom_enabled;
454 void pclog(const char *format, ...);
455 extern int nmi;
457 extern int times;
460 extern float isa_timing, bus_timing;
462 extern int frame;
465 uint8_t *vramp;
467 uint64_t timer_read();
468 extern uint64_t timer_freq;