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)