PCem
changeset 10:9541531878eb
Initial SiS496/497 emulation.
Fixed ESP value on ENTER when page fault after first push.
Fixed execution time of IDE Set Idle command.
Fixed head number on FDC Read Sector ID command.
| author | TomW |
|---|---|
| date | Mon Jul 15 18:23:26 2013 +0100 |
| parents | 229a4aba5d38 |
| children | cb2dbd7b7974 |
| files | src/fdc.c src/ibm.h src/ide.c src/mem.c src/model.c src/vid_svga.c src/x86_ops_stack.h |
| diffstat | 7 files changed, 40 insertions(+), 17 deletions(-) [+] |
line diff
1.1 --- a/src/fdc.c Tue Jul 09 19:30:53 2013 +0100 1.2 +++ b/src/fdc.c Mon Jul 15 18:23:26 2013 +0100 1.3 @@ -310,7 +310,7 @@ 1.4 fdc.stat = 1 << fdc.drive; 1.5 // disctime = 8000000; 1.6 } 1.7 - if (discint == 0xf) 1.8 + if (discint == 0xf || discint == 10) 1.9 { 1.10 fdc.head = (fdc.params[0] & 4) ? 1 : 0; 1.11 }
2.1 --- a/src/ibm.h Tue Jul 09 19:30:53 2013 +0100 2.2 +++ b/src/ibm.h Mon Jul 15 18:23:26 2013 +0100 2.3 @@ -321,6 +321,7 @@ 2.4 ROM_AMI486, 2.5 ROM_WIN486, 2.6 ROM_PCI486, 2.7 + ROM_SIS496, 2.8 ROM_430VX 2.9 }; 2.10
3.1 --- a/src/ide.c Tue Jul 09 19:30:53 2013 +0100 3.2 +++ b/src/ide.c Mon Jul 15 18:23:26 2013 +0100 3.3 @@ -651,7 +651,7 @@ 3.4 }*/ 3.5 #endif 3.6 // if ((cr0&1) && !(eflags&VM_FLAG)) 3.7 -// pclog("WriteIDE %04X %02X from %04X(%08X):%08X\n", addr, val, CS, cs, pc); 3.8 +// pclog("WriteIDE %04X %02X from %04X(%08X):%08X %i\n", addr, val, CS, cs, pc, ins); 3.9 // return; 3.10 addr|=0x80; 3.11 // if (ide_board) pclog("Write IDEb %04X %02X %04X(%08X):%04X %i %02X %02X\n",addr,val,CS,cs,pc,ins,ide->atastat,ide_drives[0].atastat); 3.12 @@ -847,7 +847,8 @@ 3.13 case WIN_SETIDLE1: /* Idle */ 3.14 ide->atastat = BUSY_STAT; 3.15 timer_process(); 3.16 - idecallback[ide_board]=200*IDE_TIME; 3.17 + callbackide(ide_board); 3.18 +// idecallback[ide_board]=200*IDE_TIME; 3.19 timer_update_outstanding(); 3.20 return; 3.21 3.22 @@ -913,7 +914,7 @@ 3.23 }*/ 3.24 #endif 3.25 // if ((cr0&1) && !(eflags&VM_FLAG)) 3.26 -// pclog("ReadIDE %04X from %04X(%08X):%08X\n", addr, CS, cs, pc); 3.27 +// pclog("ReadIDE %04X from %04X(%08X):%08X\n", addr, CS, cs, pc); 3.28 // return 0xFF; 3.29 3.30 if (ide->type == IDE_NONE && addr != 0x1f6) return 0xff; 3.31 @@ -1060,13 +1061,15 @@ 3.32 } 3.33 } 3.34 } 3.35 -// if (ide_board) pclog("Read IDEw %04X\n",temp); 3.36 +// pclog("Read IDEw %04X\n",temp); 3.37 return temp; 3.38 } 3.39 3.40 uint32_t readidel(int ide_board) 3.41 { 3.42 - uint16_t temp = readidew(ide_board); 3.43 + uint16_t temp; 3.44 +// pclog("Read IDEl %i\n", ide_board); 3.45 + temp = readidew(ide_board); 3.46 return temp | (readidew(ide_board) << 16); 3.47 } 3.48
4.1 --- a/src/mem.c Tue Jul 09 19:30:53 2013 +0100 4.2 +++ b/src/mem.c Mon Jul 15 18:23:26 2013 +0100 4.3 @@ -586,6 +586,14 @@ 4.4 //is486=1; 4.5 return 1; 4.6 4.7 + case ROM_SIS496: 4.8 + f = romfopen("roms/sis496/SIS496-1.AWA", "rb"); 4.9 + if (!f) break; 4.10 + fread(rom, 0x20000, 1, f); 4.11 + fclose(f); 4.12 + biosmask = 0x1ffff; 4.13 + return 1; 4.14 + 4.15 case ROM_430VX: 4.16 // f = romfopen("roms/430vx/Ga586atv.bin", "rb"); 4.17 // f = fopen("roms/430vx/vx29.BIN", "rb"); 4.18 @@ -792,7 +800,7 @@ 4.19 // if (output == 3) pclog("Do translate %08X %i %08X\n", addr, rw, temp); 4.20 if (!(temp&1))// || (CPL==3 && !(temp&4) && !cpl_override) || (rw && !(temp&2) && (CPL==3 || cr0&WP_FLAG))) 4.21 { 4.22 -// /*if (!nopageerrors && opcode != 0xf3 && opcode != 0x89) */pclog("Section not present! %08X %08X %02X %04X:%08X %i %i\n",addr,temp,opcode,CS,pc,CPL,rw); 4.23 +// if (!nopageerrors) pclog("Section not present! %08X %08X %02X %04X:%08X %i %i\n",addr,temp,opcode,CS,pc,CPL,rw); 4.24 4.25 cr2=addr; 4.26 temp&=1; 4.27 @@ -812,7 +820,7 @@ 4.28 // if (output == 3) pclog("Do translate %08X %08X\n", temp, temp3); 4.29 if (!(temp&1) || (CPL==3 && !(temp3&4) && !cpl_override) || (rw && !(temp3&2) && (CPL==3 || cr0&WP_FLAG))) 4.30 { 4.31 -// /*if (!nopageerrors && opcode != 0xf3 && opcode != 0x89) */pclog("Page not present! %08X %08X %02X %02X %i %08X %04X:%08X %04X:%08X %i %i %i\n",addr,temp,opcode,opcode2,frame,rmdat32, CS,pc,SS,ESP,ins,CPL,rw); 4.32 +// if (!nopageerrors) pclog("Page not present! %08X %08X %02X %02X %i %08X %04X:%08X %04X:%08X %i %i %i\n",addr,temp,opcode,opcode2,frame,rmdat32, CS,pc,SS,ESP,ins,CPL,rw); 4.33 4.34 // dumpregs(); 4.35 // exit(-1); 4.36 @@ -1006,7 +1014,7 @@ 4.37 addr &= rammask; 4.38 4.39 if (_mem_write_b[addr >> 14]) _mem_write_b[addr >> 14](addr, val, _mem_priv[addr >> 14]); 4.40 -// else pclog("Bad write %08X %02X %04X:%08X\n", addr, val, CS, pc); 4.41 +// else pclog("Bad write %08X %02X %04X:%08X\n", addr, val, CS, pc); 4.42 } 4.43 4.44 uint8_t readmemb386l(uint32_t seg, uint32_t addr) 4.45 @@ -1058,7 +1066,7 @@ 4.46 pclog("writemembl %08X %02X\n", addr, val);*/ 4.47 4.48 if (_mem_write_b[addr >> 14]) _mem_write_b[addr >> 14](addr, val, _mem_priv[addr >> 14]); 4.49 -// else pclog("Bad write %08X %02X %04X:%08X\n", addr, val, CS, pc); 4.50 +// else pclog("Bad write %08X %02X %04X:%08X\n", addr, val, CS, pc); 4.51 } 4.52 4.53 uint16_t readmemwl(uint32_t seg, uint32_t addr) 4.54 @@ -1150,7 +1158,7 @@ 4.55 _mem_write_b[(addr2 + 1) >> 14](addr2 + 1, val >> 8, _mem_priv[addr2 >> 14]); 4.56 return; 4.57 } 4.58 -// pclog("Bad write %08X %04X\n", addr, val); 4.59 +// pclog("Bad write %08X %04X\n", addr2, val); 4.60 } 4.61 4.62 uint32_t readmemll(uint32_t seg, uint32_t addr) 4.63 @@ -1241,7 +1249,7 @@ 4.64 _mem_write_b[addr2 >> 14](addr2 + 3, val >> 24, _mem_priv[addr2 >> 14]); 4.65 return; 4.66 } 4.67 -// pclog("Bad write %08X %08X\n", addr, val); 4.68 +// pclog("Bad write %08X %08X\n", addr2, val); 4.69 } 4.70 4.71 uint8_t mem_read_ram(uint32_t addr, void *priv) 4.72 @@ -1290,12 +1298,12 @@ 4.73 // if (pc==0x547D) output=3; 4.74 return 0x40; 4.75 } 4.76 -// if (output) pclog("Read BIOS %08X %02X %04X:%04X\n", addr, rom[addr & biosmask], CS, pc); 4.77 +// pclog("Read BIOS %08X %02X %04X:%04X\n", addr, rom[addr & biosmask], CS, pc); 4.78 return rom[addr & biosmask]; 4.79 } 4.80 uint16_t mem_read_biosw(uint32_t addr, void *priv) 4.81 { 4.82 -// /*if (output) */pclog("Read BIOS %08X %04X %04X:%04X\n", addr, *(uint16_t *)&rom[addr & biosmask], CS, pc); 4.83 +// pclog("Read BIOS %08X %04X %04X:%04X\n", addr, *(uint16_t *)&rom[addr & biosmask], CS, pc); 4.84 return *(uint16_t *)&rom[addr & biosmask]; 4.85 } 4.86 uint32_t mem_read_biosl(uint32_t addr, void *priv)
5.1 --- a/src/model.c Tue Jul 09 19:30:53 2013 +0100 5.2 +++ b/src/model.c Mon Jul 15 18:23:26 2013 +0100 5.3 @@ -28,6 +28,7 @@ 5.4 #include "piix.h" 5.5 #include "pit.h" 5.6 #include "serial.h" 5.7 +#include "sis496.h" 5.8 #include "sound_sn76489.h" 5.9 #include "um8669f.h" 5.10 #include "um8881f.h" 5.11 @@ -46,6 +47,7 @@ 5.12 void at_ali1429_init(); 5.13 void at_headland_init(); 5.14 void at_um8881f_init(); 5.15 +void at_sis496_init(); 5.16 void at_i430vx_init(); 5.17 5.18 int model; 5.19 @@ -74,6 +76,7 @@ 5.20 {"AMI 486 clone", ROM_AMI486, { "Intel", cpus_i486, "AMD", cpus_Am486, "Cyrix", cpus_Cx486}, 0, at_ali1429_init}, 5.21 {"AMI WinBIOS 486", ROM_WIN486, { "Intel", cpus_i486, "AMD", cpus_Am486, "Cyrix", cpus_Cx486}, 0, at_ali1429_init}, 5.22 {"AMI WinBIOS 486 PCI", ROM_PCI486, { "Intel", cpus_i486, "AMD", cpus_Am486, "Cyrix", cpus_Cx486}, 0, at_um8881f_init}, 5.23 + {"Award SiS 496/497", ROM_SIS496, { "Intel", cpus_i486, "AMD", cpus_Am486, "Cyrix", cpus_Cx486}, 0, at_sis496_init}, 5.24 {"Award 430VX PCI", ROM_430VX, { "IDT", cpus_WinChip, "", NULL, "", NULL}, 0, at_i430vx_init}, 5.25 {"", -1, {"", 0, "", 0, "", 0}, 0} 5.26 }; 5.27 @@ -198,6 +201,14 @@ 5.28 um8881f_init(); 5.29 } 5.30 5.31 +void at_sis496_init() 5.32 +{ 5.33 + at_init(); 5.34 + mouse_serial_init(); 5.35 + pci_init(); 5.36 + device_add(&sis496_device); 5.37 +} 5.38 + 5.39 void at_i430vx_init() 5.40 { 5.41 at_init();
6.1 --- a/src/vid_svga.c Tue Jul 09 19:30:53 2013 +0100 6.2 +++ b/src/vid_svga.c Mon Jul 15 18:23:26 2013 +0100 6.3 @@ -552,7 +552,7 @@ 6.4 6.5 svga->video_res_x = wx; 6.6 svga->video_res_y = wy + 1; 6.7 - pclog("%i %i %i\n", svga->video_res_x, svga->video_res_y, svga->lowres); 6.8 +// pclog("%i %i %i\n", svga->video_res_x, svga->video_res_y, svga->lowres); 6.9 if (!(svga->gdcreg[6] & 1)) /*Text mode*/ 6.10 { 6.11 svga->video_res_x /= (svga->seqregs[1] & 1) ? 8 : 9;
7.1 --- a/src/x86_ops_stack.h Tue Jul 09 19:30:53 2013 +0100 7.2 +++ b/src/x86_ops_stack.h Mon Jul 15 18:23:26 2013 +0100 7.3 @@ -304,7 +304,7 @@ 7.4 int count = (fetchdat >> 16) & 0xff; pc++; 7.5 uint32_t tempEBP = EBP, tempESP = ESP, frame_ptr; 7.6 7.7 - PUSH_W(BP); 7.8 + PUSH_W(BP); if (abrt) return 0; 7.9 frame_ptr = ESP; 7.10 7.11 if (count > 0) 7.12 @@ -337,7 +337,7 @@ 7.13 int count = (fetchdat >> 16) & 0xff; pc++; 7.14 uint32_t tempEBP = EBP, tempESP = ESP, frame_ptr; 7.15 7.16 - PUSH_L(EBP); 7.17 + PUSH_L(EBP); if (abrt) return 0; 7.18 frame_ptr = ESP; 7.19 7.20 if (count > 0)
