Vastly overhauled the UI, there's now a completely new Settings dialog as well as a status bar with disk activity icons and removable drive menus;

Thoroughly clean up the code to vastly reduce the number of compiler warnings and found and fixed several bugs in the process;
Applied all mainline PCem commits;
Added SCSI hard disk emulation;
Commented out all unfinished machines and graphics cards;
Added the AOpen AP53 and ASUS P/I-P55T2 machines as well as another Tyan 440FX machine, all three with AMI WinBIOS (patch from TheCollector1995);
Added the Diamond Stealth 3D 3000 (S3 ViRGE/VX) graphics card (patch from TheCollector1995);
Added the PS/2 XT IDE (AccuLogic) HDD Controller (patch from TheCollector1995);
Added Microsoft/Logitech Bus Mouse emulation (patch from waltje);
Overhauled the makefiles (patch from waltje);
Added the Adaptec AHA-1542CF SCSI controller (patch from waltje);
Added preliminary (but still unfinished) Adaptec AHA-154x SCSI controller BIOS support (patch from waltje);
Added an ISABugger debugging device (patch from waltje);
Added sanity checks to the Direct3D code.
This commit is contained in:
OBattler
2017-05-05 01:49:42 +02:00
parent d07d53962c
commit f6ef1f833c
346 changed files with 24292 additions and 18058 deletions

184
src/ibm.h
View File

@@ -24,13 +24,6 @@ extern int mmu_perm;
#define readmemw(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==-1 || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFE)?readmemwl(s,a):*(uint16_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
#define readmeml(s,a) ((readlookup2[(uint32_t)((s)+(a))>>12]==-1 || (s)==0xFFFFFFFF || (((s)+(a))&0xFFF)>0xFFC)?readmemll(s,a):*(uint32_t *)(readlookup2[(uint32_t)((s)+(a))>>12]+(uint32_t)((s)+(a))))
//#define writememb(a,v) if (writelookup2[(a)>>12]==0xFFFFFFFF) writemembl(a,v); else ram[writelookup2[(a)>>12]+((a)&0xFFF)]=v
//#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
//#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
//#define readmemb(a) ((isram[((a)>>16)&255] && !(cr0>>31))?ram[a&0xFFFFFF]:readmembl(a))
//#define writememb(a,v) if (isram[((a)>>16)&255] && !(cr0>>31)) ram[a&0xFFFFFF]=v; else writemembl(a,v)
//void writememb(uint32_t addr, uint8_t val);
uint8_t readmembl(uint32_t addr);
void writemembl(uint32_t addr, uint8_t val);
uint8_t readmemb386l(uint32_t seg, uint32_t addr);
@@ -138,7 +131,6 @@ struct
uint32_t pc;
uint32_t oldpc;
uint32_t op32;
uint32_t last_ea;
int TOP;
@@ -167,15 +159,20 @@ struct
MMX_REG MM[8];
uint16_t old_npxc, new_npxc;
uint32_t last_ea;
} cpu_state;
#define cycles cpu_state._cycles
#define COMPILE_TIME_ASSERT(expr) typedef char COMP_TIME_ASSERT[(expr) ? 1 : 0];
#ifdef __MSC__
# define COMPILE_TIME_ASSERT(expr) /*nada*/
#else
# define COMPILE_TIME_ASSERT(expr) typedef char COMP_TIME_ASSERT[(expr) ? 1 : 0];
#endif
COMPILE_TIME_ASSERT(sizeof(cpu_state) <= 128);
COMPILE_TIME_ASSERT(sizeof(cpu_state) <= 128)
#define cpu_state_offset(MEMBER) ((uintptr_t)&cpu_state.MEMBER - (uintptr_t)&cpu_state - 128)
#define cpu_state_offset(MEMBER) ((uint8_t)((uintptr_t)&cpu_state.MEMBER - (uintptr_t)&cpu_state - 128))
/*x86reg regs[8];*/
@@ -242,9 +239,7 @@ uint32_t dr[8];
#define IOPL ((flags>>12)&3)
#define IOPLp ((!(msw&1)) || (CPL<=IOPL))
//#define IOPLp 1
//#define IOPLV86 ((!(msw&1)) || (CPL<=IOPL))
extern int cycles_lost;
extern int israpidcad;
extern int is486;
@@ -260,6 +255,12 @@ extern int CPUID;
extern int cpl_override;
/*Timer*/
typedef struct PIT_nr
{
int nr;
struct PIT *pit;
} PIT_nr;
typedef struct PIT
{
uint32_t l[3];
@@ -284,9 +285,13 @@ typedef struct PIT
uint8_t read_status[3];
int do_read_status[3];
PIT_nr pit_nr[3];
void (*set_out_funcs[3])(int new_out, int old_out);
} PIT;
PIT pit;
PIT pit, pit2;
void setpitclock(float clock);
float pit_timer0_freq();
@@ -300,7 +305,7 @@ float pit_timer0_freq();
/*DMA*/
typedef struct DMA
{
uint16_t ab[4],ac[4];
uint32_t ab[4],ac[4];
uint16_t cb[4];
int cc[4];
int wp;
@@ -309,6 +314,13 @@ typedef struct DMA
uint8_t stat;
uint8_t command;
uint8_t request;
int xfr_command, xfr_channel;
int byte_ptr;
int is_ps2;
uint8_t arb_level[4];
uint8_t ps2_mode[4];
} DMA;
DMA dma,dma16;
@@ -341,8 +353,8 @@ int disctime;
char discfns[4][256];
int driveempty[4];
#define MDA ((gfxcard==GFX_MDA || gfxcard==GFX_HERCULES || gfxcard==GFX_HERCULESPLUS || gfxcard==GFX_INCOLOR) && (romset<ROM_TANDY || romset>=ROM_IBMAT))
#define VGA ((gfxcard>=GFX_TVGA || romset==ROM_ACER386) && gfxcard!=GFX_COLORPLUS && gfxcard!=GFX_INCOLOR && gfxcard!=GFX_WY700 && gfxcard!=GFX_COMPAQ_EGA && gfxcard!=GFX_SUPER_EGA && gfxcard!=GFX_HERCULESPLUS && romset!=ROM_PC1640 && romset!=ROM_PC1512 && romset!=ROM_TANDY && romset!=ROM_PC200)
#define MDA ((gfxcard==GFX_MDA || gfxcard==GFX_HERCULES || gfxcard==GFX_HERCULESPLUS || gfxcard==GFX_INCOLOR || gfxcard==GFX_GENIUS) && (romset<ROM_TANDY || romset>=ROM_IBMAT))
#define VGA ((gfxcard>=GFX_TVGA || romset==ROM_ACER386) && gfxcard!=GFX_COLORPLUS && gfxcard!=GFX_INCOLOR && gfxcard!=GFX_WY700 && gfxcard!=GFX_GENIUS && gfxcard!=GFX_COMPAQ_EGA && gfxcard!=GFX_SUPER_EGA && gfxcard!=GFX_HERCULESPLUS && romset!=ROM_PC1640 && romset!=ROM_PC1512 && romset!=ROM_TANDY && romset!=ROM_PC200)
#define PCJR (romset == ROM_IBMPCJR)
#define AMIBIOS (romset==ROM_AMI386SX || romset==ROM_AMI486 || romset == ROM_WIN486)
@@ -395,13 +407,16 @@ enum
ROM_PORTABLE,
ROM_PORTABLEII,
ROM_PORTABLEIII,
ROM_PORTABLEIII386, //The original Compaq Portable III shipped with an Intel 80286 CPU, but later switched to a 386DX.
ROM_PORTABLEIII386, /* The original Compaq Portable III shipped with an Intel 80286 CPU, but later switched to a 386DX. */
ROM_IBMPS1_2121,
ROM_AMI386DX_OPTI495,
ROM_MR386DX_OPTI495,
ROM_IBMPS2_M30_286,
ROM_IBMPS2_M50,
ROM_IBMPS2_M55SX,
ROM_IBMPS2_M80,
ROM_DTK486, /*DTK PKM-0038S E-2 / SiS 471 / Award BIOS / SiS 85C471*/
ROM_VLI486SV2G, /*ASUS VL/I-486SV2G / SiS 471 / Award BIOS / SiS 85C471*/
@@ -410,13 +425,15 @@ enum
ROM_PLATO, /*Intel Premiere/PCI II / 430NX / AMI BIOS / SMC FDC37C665*/
ROM_MB500N, /*PC Partner MB500N / 430FX / Award BIOS / SMC FDC37C665*/
ROM_P54TP4XE, /*ASUS P/I-P55TP4XE / 430FX / Award BIOS / SMC FDC37C665*/
ROM_AP53, /*AOpen AP53 / 430HX / AMI BIOS / SMC FDC37C665/669*/
ROM_P55T2S, /*ASUS P/I-P55T2S / 430HX / AMI BIOS / National Semiconductors PC87306*/
ROM_ACERM3A, /*Acer M3A / 430HX / Acer BIOS / SMC FDC37C932FR*/
ROM_ACERV35N, /*Acer V35N / 430HX / Acer BIOS / SMC FDC37C932FR*/
ROM_P55T2P4, /*ASUS P/I-P55T2P4 / 430HX / Award BIOS / Winbond W8387F*/
ROM_P55TVP4, /*ASUS P/I-P55TVP4 / 430HX / Award BIOS / Winbond W8387F*/
ROM_P55VA, /*Epox P55-VA / 430VX / Award BIOS / SMC FDC37C932FR*/
ROM_440FX, /*Unknown / 440FX / Award BIOS / SMC FDC37C665*/
ROM_440FX, /*Tyan Titan-Pro AT / 440FX / Award BIOS / SMC FDC37C665*/
ROM_MARL, /*Intel Advanced/ML / 430HX / AMI BIOS / National Semiconductors PC87306*/
ROM_THOR, /*Intel Advanced/ATX / 430FX / AMI BIOS / National Semiconductors PC87306*/
@@ -433,6 +450,8 @@ enum
ROM_CMDPC60,
ROM_S1668, /*Tyan Titan-Pro ATX / 440FX / AMI BIOS / SMC FDC37C669*/
ROM_MAX
};
@@ -466,6 +485,9 @@ enum
GFX_INCOLOR, /* Hercules InColor */
GFX_COLORPLUS, /* Plantronics ColorPlus */
GFX_WY700, /* Wyse 700 */
GFX_GENIUS, /* MDSI Genius */
GFX_MACH64VT2, /*ATI Mach64 VT2*/
GFX_COMPAQ_EGA, /*Compaq EGA*/
GFX_SUPER_EGA, /*Using Chips & Technologies SuperEGA BIOS*/
GFX_COMPAQ_VGA, /*Compaq/Paradise VGA*/
@@ -485,6 +507,8 @@ enum
GFX_TRIGEM_UNK,
GFX_OTI037, /*Oak OTI-037*/
GFX_VIRGEVX, /*S3 Virge/VX*/
GFX_MAX
};
@@ -532,7 +556,12 @@ char pcempath[512];
/*Hard disc*/
typedef struct __attribute__((__packed__))
#ifdef __MSC__
# pragma pack(push,1)
typedef struct
#else
typedef struct __attribute((__packed__))
#endif
{
FILE *f;
uint64_t spt,hpc; /*Sectors per track, heads per cylinder*/
@@ -540,15 +569,78 @@ typedef struct __attribute__((__packed__))
int is_hdi;
uint32_t base;
uint64_t at_spt,at_hpc; /*[Translation] Sectors per track, heads per cylinder*/
int bus; /* 0 = none, 1 = MFM/RLL, 2 = IDE, 3 = SCSI */
uint8_t mfm_channel;
uint8_t ide_channel;
uint8_t scsi_id;
uint8_t scsi_lun;
} hard_disk_t;
#ifdef __MSC__
# pragma pack(pop)
#endif
#ifdef __MSC__
# pragma pack(push,1)
typedef struct
#else
typedef struct __attribute((__packed__))
#endif
{
/* Stuff for SCSI hard disks. */
uint8_t cdb[16];
uint8_t current_cdb[16];
uint8_t max_cdb_len;
int requested_blocks;
int max_blocks_at_once;
uint16_t request_length;
int block_total;
int all_blocks_total;
uint32_t packet_len;
int packet_status;
uint8_t status;
uint8_t phase;
uint32_t pos;
int callback;
int total_read;
int unit_attention;
uint8_t sense[256];
uint8_t previous_command;
uint8_t error;
uint16_t buffer[390144];
uint32_t sector_pos;
uint32_t sector_len;
uint32_t last_sector;
uint32_t seek_pos;
int data_pos;
int old_len;
int cdb_len_setting;
int cdb_len;
int request_pos;
uint64_t base;
uint8_t hd_cdb[16];
} scsi_hard_disk_t;
#ifdef __MSC__
# pragma pack(pop)
#endif
#define HDC_NUM 16
#define IDE_NUM 8
#define MFM_NUM 2
#define SCSI_NUM 16 /* Theoretically the controller can have at least 64 devices, or even 128 in case of a wide bus, but
let's not exaggerate with them - 16 ought to be enough for everyone. */
hard_disk_t hdc[IDE_NUM];
hard_disk_t hdc[HDC_NUM];
scsi_hard_disk_t shdc[HDC_NUM];
FILE *shdf[HDC_NUM];
uint64_t hdt[128][3];
uint64_t hdt_mfm[128][3];
extern char hdd_fn[HDC_NUM][512];
int image_is_hdi(const char *s);
int image_is_hdx(const char *s, int check_signature);
/*Keyboard*/
int keybsenddelay;
@@ -573,6 +665,7 @@ extern int ui_writeprot[4];
void pclog(const char *format, ...);
extern int nmi;
extern int nmi_auto_clear;
extern float isa_timing, bus_timing;
@@ -590,6 +683,7 @@ void onesec();
void resetpc_cad();
extern int dump_on_exit;
extern int start_in_fullscreen;
extern int window_w, window_h, window_x, window_y, window_remember;
@@ -647,3 +741,51 @@ extern int invert_display;
uint32_t svga_color_transform(uint32_t color);
extern int scale;
/* Function prototypes. */
void BuslogicSoftReset();
int checkio(int port);
void closepc();
void codegen_block_end();
void codegen_reset();
void cpu_set_edx();
int divl(uint32_t val);
void dumpregs();
void exec386(int cycs);
void exec386_dynarec(int cycs);
void execx86(int cycs);
void flushmmucache();
void flushmmucache_cr3();
int idivl(int32_t val);
void initpc(int argc, char *argv[]);
void loadcscall(uint16_t seg);
void loadcsjmp(uint16_t seg, uint32_t oxpc);
void mmu_invalidate(uint32_t addr);
void pclog(const char *format, ...);
void pmodeint(int num, int soft);
void pmoderetf(int is32, uint16_t off);
void pmodeiret(int is32);
void port_92_clear_reset();
uint8_t readdacfifo();
void refreshread();
int rep386(int fv);
void resetmcr();
void resetpchard();
void resetreadlookup();
void resetx86();
void runpc();
void saveconfig();
void softresetx86();
void speedchanged();
void trc_reset(uint8_t val);
void update_status_bar_icon(int tag, int active);
void x86_int_sw(int num);
void x86gpf(char *s, uint16_t error);
void x86np(char *s, uint16_t error);
void x86ss(char *s, uint16_t error);
void x86ts(char *s, uint16_t error);
void x87_dumpregs();
void x87_reset();
extern int serial_enabled[2];
extern int lpt_enabled, bugger_enabled;