PCem

changeset 22:16c3167038d7

Altered device memory mapping.
author TomW
date Sat Oct 19 17:06:55 2013 +0100
parents b162911b1c10
children 1b2b9acf61eb
files src/808x.c src/ali1429.c src/dma.c src/headland.c src/i430vx.c src/ibm.h src/mem.c src/mem.h src/sis496.c src/um8881f.c src/vid_ati18800.c src/vid_ati28800.c src/vid_ati68860_ramdac.c src/vid_ati_mach64.c src/vid_cga.c src/vid_cga.h src/vid_cl5429.c src/vid_ega.c src/vid_ega.h src/vid_et4000.c src/vid_et4000w32.c src/vid_hercules.c src/vid_mda.c src/vid_olivetti_m24.c src/vid_oti067.c src/vid_paradise.c src/vid_pc1512.c src/vid_pc1640.c src/vid_pc200.c src/vid_s3.c src/vid_s3_virge.c src/vid_sdac_ramdac.c src/vid_stg_ramdac.c src/vid_svga.c src/vid_svga.h src/vid_svga_render.c src/vid_tandy.c src/vid_tkd8001_ramdac.c src/vid_tvga.c src/vid_unk_ramdac.c src/vid_vga.c src/vid_voodoo.c src/video.c
diffstat 43 files changed, 662 insertions(+), 381 deletions(-) [+]
line diff
     1.1 --- a/src/808x.c	Sun Oct 13 16:33:43 2013 +0100
     1.2 +++ b/src/808x.c	Sat Oct 19 17:06:55 2013 +0100
     1.3 @@ -487,8 +487,6 @@
     1.4                  if (!c) znptable16[c]|=Z_FLAG;
     1.5                  if (c&0x8000) znptable16[c]|=N_FLAG;
     1.6        }
     1.7 -//        isram[0xF]=1;
     1.8 -//        printf("isram 0 = %i\n",isram[0]);
     1.9        
    1.10  //      makemod1table();
    1.11  }
    1.12 @@ -661,6 +659,7 @@
    1.13          loadcs(0xFFFF);
    1.14          rammask=0xFFFFFFFF;
    1.15          flags=2;
    1.16 +        makeznptable();
    1.17          initmmucache();
    1.18          resetreadlookup();
    1.19          makemod1table();
     2.1 --- a/src/ali1429.c	Sun Oct 13 16:33:43 2013 +0100
     2.2 +++ b/src/ali1429.c	Sat Oct 19 17:06:55 2013 +0100
     2.3 @@ -12,44 +12,43 @@
     2.4  void ali1429_write(uint16_t port, uint8_t val, void *priv)
     2.5  {
     2.6  //        return;
     2.7 -        if (!(port&1)) ali1429_index=val;
     2.8 +        if (!(port & 1)) 
     2.9 +                ali1429_index = val;
    2.10          else
    2.11          {
    2.12 -                ali1429_regs[ali1429_index]=val;
    2.13 +                ali1429_regs[ali1429_index] = val;
    2.14  //                pclog("ALI1429 write %02X %02X %04X:%04X %i\n",ali1429_index,val,CS,pc,ins);
    2.15                  switch (ali1429_index)
    2.16                  {
    2.17                          case 0x13:
    2.18 -/*                                if (val == 1)
    2.19 -                                { 
    2.20 -                                        times = 1;
    2.21 -                                        ins = 0;
    2.22 -                                        output = 3;
    2.23 -                                }*/
    2.24 -//                                pclog("write 13 %02X %i\n",val,shadowbios);
    2.25 -                                if (!(val&0xC0)) 
    2.26 -                                {
    2.27 -                                       shadowbios=0;
    2.28 -                                        if (!shadowbios_write)
    2.29 -                                           mem_sethandler(0xf0000, 0x10000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   NULL,          NULL,           NULL,           NULL);
    2.30 -                                        else
    2.31 -                                           mem_sethandler(0xf0000, 0x10000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml, NULL);
    2.32 -                                        flushmmucache();
    2.33 -                                }                                        
    2.34 -                                break;
    2.35 +                        if (!(val & 0xc0)) 
    2.36 +                        {
    2.37 +                                shadowbios = 0;
    2.38 +                                if (!shadowbios_write)
    2.39 +                                        mem_bios_set_state(0xf0000, 0x10000, 0, 0);
    2.40 +                                else
    2.41 +                                        mem_bios_set_state(0xf0000, 0x10000, 0, 1);
    2.42 +                                flushmmucache();
    2.43 +                        }                                        
    2.44 +                        break;
    2.45                          case 0x14:
    2.46 -                        shadowbios=val&1;//((val&3)==1);
    2.47 -                        shadowbios_write=val&2;
    2.48 +                        shadowbios = val & 1;
    2.49 +                        shadowbios_write = val & 2;
    2.50                          switch (val & 3)
    2.51                          {
    2.52 -                                case 0: mem_sethandler(0xf0000, 0x10000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   NULL,          NULL,           NULL,              NULL); break;
    2.53 -                                case 1: mem_sethandler(0xf0000, 0x10000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    NULL,          NULL,           NULL,              NULL); break;
    2.54 -                                case 2: mem_sethandler(0xf0000, 0x10000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,    NULL); break;
    2.55 -                                case 3: mem_sethandler(0xf0000, 0x10000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml,    NULL); break;
    2.56 +                                case 0: 
    2.57 +                                mem_bios_set_state(0xf0000, 0x10000, 0, 0);
    2.58 +                                break;
    2.59 +                                case 1: 
    2.60 +                                mem_bios_set_state(0xf0000, 0x10000, 1, 0);
    2.61 +                                break;
    2.62 +                                case 2:
    2.63 +                                mem_bios_set_state(0xf0000, 0x10000, 0, 1);
    2.64 +                                break;
    2.65 +                                case 3:
    2.66 +                                mem_bios_set_state(0xf0000, 0x10000, 1, 1);
    2.67 +                                break;
    2.68                          }                                                                                                
    2.69 -                        
    2.70 -//                        if (val==0x43) shadowbios=1;
    2.71 -//                        pclog("Shadow bios %i\n",shadowbios);
    2.72                          flushmmucache();
    2.73                          break;
    2.74                  }
    2.75 @@ -58,16 +57,17 @@
    2.76  
    2.77  uint8_t ali1429_read(uint16_t port, void *priv)
    2.78  {
    2.79 -        if (!(port&1)) return ali1429_index;
    2.80 +        if (!(port & 1)) 
    2.81 +                return ali1429_index;
    2.82          if ((ali1429_index >= 0xc0 || ali1429_index == 0x20) && cpu_iscyrix)
    2.83 -           return 0xff; /*Don't conflict with Cyrix config registers*/
    2.84 +                return 0xff; /*Don't conflict with Cyrix config registers*/
    2.85          return ali1429_regs[ali1429_index];
    2.86  }
    2.87  
    2.88  
    2.89  void ali1429_reset()
    2.90  {
    2.91 -        memset(ali1429_regs,0xFF,256);
    2.92 +        memset(ali1429_regs, 0xff, 256);
    2.93  }
    2.94  
    2.95  void ali1429_init()
     3.1 --- a/src/dma.c	Sun Oct 13 16:33:43 2013 +0100
     3.2 +++ b/src/dma.c	Sat Oct 19 17:06:55 2013 +0100
     3.3 @@ -3,6 +3,7 @@
     3.4  #include "dma.h"
     3.5  #include "fdc.h"
     3.6  #include "io.h"
     3.7 +#include "mem.h"
     3.8  #include "video.h"
     3.9  
    3.10  extern int ins;
    3.11 @@ -256,39 +257,12 @@
    3.12  
    3.13  uint8_t _dma_read(uint32_t addr)
    3.14  {
    3.15 -        switch (addr&0xFFFF8000)
    3.16 -        {
    3.17 -/*                case 0xA0000: case 0xA8000:
    3.18 -                return video_read_a000(addr, NULL);
    3.19 -                case 0xB0000:
    3.20 -                return video_read_b000(addr, NULL);
    3.21 -                case 0xB8000:
    3.22 -                return video_read_b800(addr, NULL);*/
    3.23 -        }
    3.24 -        if (isram[addr>>16]) return ram[addr];
    3.25 -        return 0xff;
    3.26 +        return mem_readb_phys(addr);
    3.27  }
    3.28  
    3.29  void _dma_write(uint32_t addr, uint8_t val)
    3.30  {
    3.31 -        pclog("_dma_write %08X %02X\n", addr, val);
    3.32 -        switch (addr&0xFFFF8000)
    3.33 -        {
    3.34 -/*                case 0xA0000: case 0xA8000:
    3.35 -                video_write_a000(addr,val, NULL);
    3.36 -                return;
    3.37 -                case 0xB0000:
    3.38 -                video_write_b000(addr,val, NULL);
    3.39 -                return;
    3.40 -                case 0xB8000:
    3.41 -                video_write_b800(addr,val, NULL);
    3.42 -                return;
    3.43 -                case 0xC0000: case 0xC8000: case 0xD0000: case 0xD8000:
    3.44 -                case 0xE0000: case 0xE8000: case 0xF0000: case 0xF8000:
    3.45 -                return;*/
    3.46 -        }
    3.47 -        if (isram[addr >> 16]) 
    3.48 -                ram[addr] = val;
    3.49 +        mem_writeb_phys(addr, val);
    3.50  }
    3.51  /*void writedma2(uint8_t val)
    3.52  {
     4.1 --- a/src/headland.c	Sun Oct 13 16:33:43 2013 +0100
     4.2 +++ b/src/headland.c	Sat Oct 19 17:06:55 2013 +0100
     4.3 @@ -20,12 +20,13 @@
     4.4                          shadowbios = val & 0x10;
     4.5                          shadowbios_write = !(val & 0x10);
     4.6                          if (shadowbios)
     4.7 -                           mem_sethandler(0xf0000, 0x10000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    NULL,          NULL,           NULL          , NULL);
     4.8 +                                mem_bios_set_state(0xf0000, 0x10000, 1, 0);
     4.9                          else
    4.10 -                           mem_sethandler(0xf0000, 0x10000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml, NULL);
    4.11 +                                mem_bios_set_state(0xf0000, 0x10000, 0, 1);
    4.12                  }
    4.13          }
    4.14 -        else          headland_index = val;
    4.15 +        else
    4.16 +                headland_index = val;
    4.17  }
    4.18  
    4.19  uint8_t headland_read(uint16_t addr, void *priv)
    4.20 @@ -33,7 +34,7 @@
    4.21          if (addr & 1) 
    4.22          {
    4.23                  if ((headland_index >= 0xc0 || headland_index == 0x20) && cpu_iscyrix)
    4.24 -                   return 0xff; /*Don't conflict with Cyrix config registers*/
    4.25 +                        return 0xff; /*Don't conflict with Cyrix config registers*/
    4.26                  return headland_regs[headland_index];
    4.27          }
    4.28          return headland_index;
     5.1 --- a/src/i430vx.c	Sun Oct 13 16:33:43 2013 +0100
     5.2 +++ b/src/i430vx.c	Sat Oct 19 17:06:55 2013 +0100
     5.3 @@ -13,10 +13,10 @@
     5.4  {
     5.5          switch (state & 3)
     5.6          {
     5.7 -                case 0x0: mem_sethandler(addr, size, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   NULL,          NULL,           NULL          , NULL); break; /*DRAM disabled, accesses directed to PCI bus*/
     5.8 -                case 0x1: mem_sethandler(addr, size, mem_read_ram,    mem_read_ramw,    mem_read_raml,    NULL,          NULL,           NULL          , NULL); break; /*Read only, DRAM write protected, non-cacheable*/
     5.9 -                case 0x2: mem_sethandler(addr, size, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml, NULL); break; /*Write only*/
    5.10 -                case 0x3: mem_sethandler(addr, size, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml, NULL); break; /*Read/write, non-cacheable*/
    5.11 +                case 0x0: mem_bios_set_state(addr, size, 0, 0); break; /*DRAM disabled, accesses directed to PCI bus*/
    5.12 +                case 0x1: mem_bios_set_state(addr, size, 1, 0); break; /*Read only, DRAM write protected, non-cacheable*/
    5.13 +                case 0x2: mem_bios_set_state(addr, size, 0, 1); break; /*Write only*/
    5.14 +                case 0x3: mem_bios_set_state(addr, size, 1, 1); break; /*Read/write, non-cacheable*/
    5.15                  /*Below are redundant*/
    5.16  //                case 0x5: mem_sethandler(addr, size, mem_read_ram,    mem_read_ramw,    mem_read_raml,    NULL,          NULL,           NULL          ); break; /*Read only, DRAM write protected, cacheable*/
    5.17  //                case 0x7: mem_sethandler(addr, size, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml); break; /*Read/write, non-cacheable*/                
     6.1 --- a/src/ibm.h	Sun Oct 13 16:33:43 2013 +0100
     6.2 +++ b/src/ibm.h	Sat Oct 19 17:06:55 2013 +0100
     6.3 @@ -6,8 +6,6 @@
     6.4  /*Memory*/
     6.5  uint8_t *ram,*vram;
     6.6  
     6.7 -unsigned char isram[0x10000];
     6.8 -
     6.9  uint32_t rammask;
    6.10  
    6.11  int readlookup[256],readlookupp[256];
     7.1 --- a/src/mem.c	Sun Oct 13 16:33:43 2013 +0100
     7.2 +++ b/src/mem.c	Sat Oct 19 17:06:55 2013 +0100
     7.3 @@ -15,21 +15,25 @@
     7.4  #include "x86.h"
     7.5  #include "cpu.h"
     7.6  
     7.7 -static uint8_t  (*_mem_read_b[0x40000])(uint32_t addr, void *priv);
     7.8 -static uint16_t (*_mem_read_w[0x40000])(uint32_t addr, void *priv);
     7.9 -static uint32_t (*_mem_read_l[0x40000])(uint32_t addr, void *priv);
    7.10 -static void    (*_mem_write_b[0x40000])(uint32_t addr, uint8_t  val, void *priv);
    7.11 -static void    (*_mem_write_w[0x40000])(uint32_t addr, uint16_t val, void *priv);
    7.12 -static void    (*_mem_write_l[0x40000])(uint32_t addr, uint32_t val, void *priv);
    7.13 -static void        *_mem_priv[0x40000];
    7.14 +static uint8_t       (*_mem_read_b[0x40000])(uint32_t addr, void *priv);
    7.15 +static uint16_t      (*_mem_read_w[0x40000])(uint32_t addr, void *priv);
    7.16 +static uint32_t      (*_mem_read_l[0x40000])(uint32_t addr, void *priv);
    7.17 +static void         (*_mem_write_b[0x40000])(uint32_t addr, uint8_t  val, void *priv);
    7.18 +static void         (*_mem_write_w[0x40000])(uint32_t addr, uint16_t val, void *priv);
    7.19 +static void         (*_mem_write_l[0x40000])(uint32_t addr, uint32_t val, void *priv);
    7.20 +static void             *_mem_priv[0x40000];
    7.21 +static mem_mapping_t *_mem_mapping[0x40000];
    7.22 +
    7.23 +static mem_mapping_t base_mapping;
    7.24 +static mem_mapping_t ram_low_mapping;
    7.25 +static mem_mapping_t ram_high_mapping;
    7.26 +static mem_mapping_t bios_mapping[8];
    7.27 +static mem_mapping_t vrom_mapping;
    7.28 +static mem_mapping_t romext_mapping;
    7.29  
    7.30  int shadowbios,shadowbios_write;
    7.31  
    7.32 -uint32_t oldpc;
    7.33 -extern uint8_t opcode2;
    7.34 -unsigned char isram[0x10000];
    7.35 -extern int ins;
    7.36 -extern int timetolive;
    7.37 +static unsigned char isram[0x10000];
    7.38  
    7.39  int mem_size;
    7.40  int cache=4;
    7.41 @@ -1252,6 +1256,20 @@
    7.42  //        pclog("Bad write %08X %08X\n", addr2, val);
    7.43  }
    7.44  
    7.45 +uint8_t mem_readb_phys(uint32_t addr)
    7.46 +{
    7.47 +        if (_mem_read_b[addr >> 14]) 
    7.48 +                return _mem_read_b[addr >> 14](addr, _mem_priv[addr >> 14]);
    7.49 +                
    7.50 +        return 0xff;
    7.51 +}
    7.52 +
    7.53 +void mem_writeb_phys(uint32_t addr, uint8_t val)
    7.54 +{
    7.55 +        if (_mem_write_b[addr >> 14]) 
    7.56 +                _mem_write_b[addr >> 14](addr, val, _mem_priv[addr >> 14]);
    7.57 +}
    7.58 +
    7.59  uint8_t mem_read_ram(uint32_t addr, void *priv)
    7.60  {
    7.61  //        if (addr >= 0xe0000 && addr < 0x100000) pclog("Read RAMb %08X\n", addr);
    7.62 @@ -1338,62 +1356,6 @@
    7.63          return *(uint32_t *)&romext[addr & 0x7fff];
    7.64  }
    7.65  
    7.66 -void mem_init()
    7.67 -{
    7.68 -        int c;
    7.69 -        ram=malloc(mem_size*1024*1024);
    7.70 -        rom=malloc(0x20000);
    7.71 -        vram=malloc(0x800000);
    7.72 -        vrom=malloc(0x8000);
    7.73 -        readlookup2=malloc(1024*1024*4);
    7.74 -        writelookup2=malloc(1024*1024*4);
    7.75 -        cachelookup2=malloc(1024*1024);
    7.76 -        biosmask=65535;
    7.77 -        makeznptable();
    7.78 -        memset(ram,0,mem_size*1024*1024);
    7.79 -        for (c = 0; c < 0x10000; c++) isram[c] = 0;
    7.80 -        for (c=0;c<(mem_size*16);c++)
    7.81 -        {
    7.82 -                isram[c]=1;
    7.83 -                if (c >= 0xa && c<=0xF) isram[c]=0;
    7.84 -        }
    7.85 -        for (c = 0; c < 0x40000; c++)
    7.86 -            _mem_read_b[c] = _mem_read_w[c] = _mem_read_l[c] = _mem_write_b[c] = _mem_write_w[c] = _mem_write_l[c] = _mem_priv[c] = NULL;
    7.87 -
    7.88 -        mem_sethandler(0x00000, 0xa0000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
    7.89 -        if (mem_size > 1)
    7.90 -           mem_sethandler(0x100000, (mem_size - 1) * 1024 * 1024, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
    7.91 -           
    7.92 -        mem_sethandler(0xc0000, 0x08000, mem_read_vrom,   mem_read_vromw,   mem_read_vroml,   NULL, NULL, NULL,   NULL);
    7.93 -        mem_sethandler(0xc8000, 0x08000, mem_read_romext, mem_read_romextw, mem_read_romextl, NULL, NULL, NULL,   NULL);
    7.94 -        mem_sethandler(0xe0000, 0x20000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
    7.95 -//        pclog("Mem resize %i %i\n",mem_size,c);
    7.96 -}
    7.97 -
    7.98 -void mem_resize()
    7.99 -{
   7.100 -        int c;
   7.101 -        free(ram);
   7.102 -        ram=malloc(mem_size*1024*1024);
   7.103 -        memset(ram,0,mem_size*1024*1024);
   7.104 -        for (c = 0; c < 0x10000; c++) isram[c] = 0;
   7.105 -        for (c=0;c<(mem_size*16);c++)
   7.106 -        {
   7.107 -                isram[c]=1;
   7.108 -                if (c >= 0xa && c<=0xF) isram[c]=0;
   7.109 -        }
   7.110 -        for (c = 0; c < 0x40000; c++)
   7.111 -            _mem_read_b[c] = _mem_read_w[c] = _mem_read_l[c] = _mem_write_b[c] = _mem_write_w[c] = _mem_write_l[c] = _mem_priv[c] = NULL;
   7.112 -
   7.113 -        mem_sethandler(0x00000, 0xa0000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.114 -        if (mem_size > 1)
   7.115 -           mem_sethandler(0x100000, (mem_size - 1) * 1024 * 1024, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.116 -
   7.117 -        mem_sethandler(0xc0000, 0x8000, mem_read_vrom,   mem_read_vromw,   mem_read_vroml,   NULL, NULL, NULL,   NULL);
   7.118 -        mem_sethandler(0xc8000, 0x8000, mem_read_romext, mem_read_romextw, mem_read_romextl, NULL, NULL, NULL,   NULL);        
   7.119 -        mem_sethandler(0xe0000, 0x20000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.120 -//        pclog("Mem resize %i %i\n",mem_size,c);
   7.121 -}
   7.122  
   7.123  void mem_updatecache()
   7.124  {
   7.125 @@ -1418,64 +1380,267 @@
   7.126          }
   7.127  }
   7.128  
   7.129 -void mem_sethandler(uint32_t base, uint32_t size, 
   7.130 -                    uint8_t  (*read_b)(uint32_t addr, void *priv),
   7.131 -                    uint16_t (*read_w)(uint32_t addr, void *priv),
   7.132 -                    uint32_t (*read_l)(uint32_t addr, void *priv),
   7.133 -                    void (*write_b)(uint32_t addr, uint8_t  val, void *priv),
   7.134 -                    void (*write_w)(uint32_t addr, uint16_t val, void *priv),
   7.135 -                    void (*write_l)(uint32_t addr, uint32_t val, void *priv),
   7.136 -                    void *priv)
   7.137 +static void mem_mapping_recalc(uint32_t base, uint32_t size)
   7.138  {
   7.139          uint32_t c;
   7.140 -//        printf("mem_sethandler : %05X %04X  %08X  %08X   %08X   %08X %08X\n", base, size, read_w, write_w,  mem_read_biosw, mem_read_ramw, mem_write_ramw);
   7.141 +        mem_mapping_t *mapping = base_mapping.next;
   7.142 +        
   7.143 +        if ((base + size) > 0xffff8000)
   7.144 +           size = 0xffff0000 - base;
   7.145 +        
   7.146 +        /*Clear out old mappings*/
   7.147          for (c = base; c < base + size; c += 0x4000)
   7.148          {
   7.149 -                _mem_read_b[ c >> 14] =  read_b;
   7.150 -                _mem_read_w[ c >> 14] =  read_w;
   7.151 -                _mem_read_l[ c >> 14] =  read_l;
   7.152 -                _mem_write_b[c >> 14] = write_b;
   7.153 -                _mem_write_w[c >> 14] = write_w;
   7.154 -                _mem_write_l[c >> 14] = write_l;
   7.155 -                _mem_priv[c >> 14] = priv;
   7.156 +                _mem_read_b[c >> 14] = NULL;
   7.157 +                _mem_read_w[c >> 14] = NULL;
   7.158 +                _mem_read_l[c >> 14] = NULL;
   7.159 +                _mem_write_b[c >> 14] = NULL;
   7.160 +                _mem_write_w[c >> 14] = NULL;
   7.161 +                _mem_write_l[c >> 14] = NULL;
   7.162 +                _mem_priv[c >> 14] = NULL;
   7.163 +                _mem_mapping[c >> 14] = NULL;
   7.164          }
   7.165 -        for (c = base; c < base + size; c += 0x1000)
   7.166 +//        pclog("mem_mapping_recalc %08X %08X\n", base, size);
   7.167 +        /*Walk mapping list*/
   7.168 +        while (mapping != NULL)
   7.169          {
   7.170 -                readlookup2[c >> 12]  = 0xFFFFFFFF;
   7.171 -                writelookup2[c >> 12] = 0xFFFFFFFF;
   7.172 -        }
   7.173 +//                pclog("mapping=%p next=%p base=%08X size=%08X enable=%i\n", mapping, mapping->next, mapping->base, mapping->size, mapping->enable);
   7.174 +                /*In range?*/
   7.175 +                if (mapping->enable && mapping->base < (base + size) && (mapping->base + mapping->size) >= base)
   7.176 +                {
   7.177 +                        uint32_t start = (mapping->base < base) ? mapping->base : base;
   7.178 +                        uint32_t end   = ((mapping->base + mapping->size) < (base + size)) ? (mapping->base + mapping->size) : (base + size);
   7.179 +
   7.180 +                        for (c = start; c < end; c += 0x4000)
   7.181 +                        {
   7.182 +                                if (_mem_mapping[c >> 14] == NULL)
   7.183 +                                {
   7.184 +//                                        pclog(" Add %08X\n", c);
   7.185 +                                        _mem_read_b[c >> 14] = mapping->read_b;
   7.186 +                                        _mem_read_w[c >> 14] = mapping->read_w;
   7.187 +                                        _mem_read_l[c >> 14] = mapping->read_l;
   7.188 +                                        _mem_write_b[c >> 14] = mapping->write_b;
   7.189 +                                        _mem_write_w[c >> 14] = mapping->write_w;
   7.190 +                                        _mem_write_l[c >> 14] = mapping->write_l;
   7.191 +                                        _mem_priv[c >> 14] = mapping->p;
   7.192 +                                        _mem_mapping[c >> 14] = mapping;
   7.193 +                                }
   7.194 +                        }
   7.195 +                }
   7.196 +                mapping = mapping->next;
   7.197 +        }       
   7.198  }
   7.199  
   7.200 -void mem_removehandler(uint32_t base, uint32_t size, 
   7.201 -                       uint8_t  (*read_b)(uint32_t addr, void *priv),
   7.202 -                       uint16_t (*read_w)(uint32_t addr, void *priv),
   7.203 -                       uint32_t (*read_l)(uint32_t addr, void *priv),
   7.204 -                       void (*write_b)(uint32_t addr, uint8_t  val, void *priv),
   7.205 -                       void (*write_w)(uint32_t addr, uint16_t val, void *priv),
   7.206 -                       void (*write_l)(uint32_t addr, uint32_t val, void *priv),
   7.207 -                       void *priv)
   7.208 +void mem_mapping_add(mem_mapping_t *mapping,
   7.209 +                    uint32_t base, 
   7.210 +                    uint32_t size, 
   7.211 +                    uint8_t  (*read_b)(uint32_t addr, void *p),
   7.212 +                    uint16_t (*read_w)(uint32_t addr, void *p),
   7.213 +                    uint32_t (*read_l)(uint32_t addr, void *p),
   7.214 +                    void (*write_b)(uint32_t addr, uint8_t  val, void *p),
   7.215 +                    void (*write_w)(uint32_t addr, uint16_t val, void *p),
   7.216 +                    void (*write_l)(uint32_t addr, uint32_t val, void *p),
   7.217 +                    void *p)
   7.218 +{
   7.219 +        mem_mapping_t *dest = &base_mapping;
   7.220 +
   7.221 +        /*Add mapping to the end of the list*/
   7.222 +        while (dest->next)
   7.223 +                dest = dest->next;        
   7.224 +        dest->next = mapping;
   7.225 +        
   7.226 +        if (size)
   7.227 +                mapping->enable  = 1;
   7.228 +        else
   7.229 +                mapping->enable  = 0;
   7.230 +        mapping->base    = base;
   7.231 +        mapping->size    = size;
   7.232 +        mapping->read_b  = read_b;
   7.233 +        mapping->read_w  = read_w;
   7.234 +        mapping->read_l  = read_l;
   7.235 +        mapping->write_b = write_b;
   7.236 +        mapping->write_w = write_w;
   7.237 +        mapping->write_l = write_l;
   7.238 +        mapping->p       = p;
   7.239 +        mapping->next    = NULL;
   7.240 +        
   7.241 +        mem_mapping_recalc(mapping->base, mapping->size);
   7.242 +}
   7.243 +
   7.244 +void mem_mapping_set_handler(mem_mapping_t *mapping,
   7.245 +                    uint8_t  (*read_b)(uint32_t addr, void *p),
   7.246 +                    uint16_t (*read_w)(uint32_t addr, void *p),
   7.247 +                    uint32_t (*read_l)(uint32_t addr, void *p),
   7.248 +                    void (*write_b)(uint32_t addr, uint8_t  val, void *p),
   7.249 +                    void (*write_w)(uint32_t addr, uint16_t val, void *p),
   7.250 +                    void (*write_l)(uint32_t addr, uint32_t val, void *p))
   7.251 +{
   7.252 +        mapping->read_b  = read_b;
   7.253 +        mapping->read_w  = read_w;
   7.254 +        mapping->read_l  = read_l;
   7.255 +        mapping->write_b = write_b;
   7.256 +        mapping->write_w = write_w;
   7.257 +        mapping->write_l = write_l;
   7.258 +        
   7.259 +        mem_mapping_recalc(mapping->base, mapping->size);
   7.260 +}
   7.261 +
   7.262 +void mem_mapping_set_addr(mem_mapping_t *mapping, uint32_t base, uint32_t size)
   7.263 +{
   7.264 +        /*Remove old mapping*/
   7.265 +        mapping->enable = 0;
   7.266 +        mem_mapping_recalc(mapping->base, mapping->size);
   7.267 +        
   7.268 +        /*Set new mapping*/
   7.269 +        mapping->enable = 1;
   7.270 +        mapping->base = base;
   7.271 +        mapping->size = size;
   7.272 +        
   7.273 +        mem_mapping_recalc(mapping->base, mapping->size);
   7.274 +}
   7.275 +
   7.276 +void mem_mapping_set_p(mem_mapping_t *mapping, void *p)
   7.277 +{
   7.278 +        mapping->p = p;
   7.279 +}
   7.280 +
   7.281 +void mem_mapping_disable(mem_mapping_t *mapping)
   7.282 +{
   7.283 +        mapping->enable = 0;
   7.284 +        
   7.285 +        mem_mapping_recalc(mapping->base, mapping->size);
   7.286 +}
   7.287 +
   7.288 +void mem_mapping_enable(mem_mapping_t *mapping)
   7.289 +{
   7.290 +        mapping->enable = 1;
   7.291 +        
   7.292 +        mem_mapping_recalc(mapping->base, mapping->size);
   7.293 +}
   7.294 +
   7.295 +void mem_init()
   7.296 +{
   7.297 +        int c;
   7.298 +
   7.299 +        ram = malloc(mem_size * 1024 * 1024);
   7.300 +        rom = malloc(0x20000);
   7.301 +        vram = malloc(0x800000);
   7.302 +        vrom = malloc(0x8000);
   7.303 +        readlookup2  = malloc(1024 * 1024 * 4);
   7.304 +        writelookup2 = malloc(1024 * 1024 * 4);
   7.305 +        cachelookup2 = malloc(1024 * 1024);
   7.306 +        biosmask = 0xffff;
   7.307 +
   7.308 +        memset(ram, 0, mem_size * 1024 * 1024);
   7.309 +
   7.310 +        memset(isram, 0, sizeof(isram));
   7.311 +        for (c = 0; c < (mem_size * 16); c++)
   7.312 +        {
   7.313 +                isram[c] = 1;
   7.314 +                if (c >= 0xa && c <= 0xf) 
   7.315 +                        isram[c] = 0;
   7.316 +        }
   7.317 +
   7.318 +        memset(_mem_read_b,  0, sizeof(_mem_read_b));
   7.319 +        memset(_mem_read_w,  0, sizeof(_mem_read_w));
   7.320 +        memset(_mem_read_l,  0, sizeof(_mem_read_l));
   7.321 +        memset(_mem_write_b, 0, sizeof(_mem_write_b));
   7.322 +        memset(_mem_write_w, 0, sizeof(_mem_write_w));
   7.323 +        memset(_mem_write_l, 0, sizeof(_mem_write_l));
   7.324 +
   7.325 +        memset(&base_mapping, 0, sizeof(base_mapping));
   7.326 +
   7.327 +        mem_mapping_add(&ram_low_mapping, 0x00000, 0xa0000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.328 +        if (mem_size > 1)
   7.329 +                mem_mapping_add(&ram_low_mapping, 0x100000, (mem_size - 1) * 1024 * 1024, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.330 +
   7.331 +        mem_mapping_add(&bios_mapping[0], 0xe0000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.332 +        mem_mapping_add(&bios_mapping[1], 0xe4000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.333 +        mem_mapping_add(&bios_mapping[2], 0xe8000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.334 +        mem_mapping_add(&bios_mapping[3], 0xec000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.335 +        mem_mapping_add(&bios_mapping[4], 0xf0000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.336 +        mem_mapping_add(&bios_mapping[5], 0xf4000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.337 +        mem_mapping_add(&bios_mapping[6], 0xf8000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.338 +        mem_mapping_add(&bios_mapping[7], 0xfc000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.339 +
   7.340 +        mem_mapping_add(&vrom_mapping,    0xc0000, 0x08000, mem_read_vrom,   mem_read_vromw,   mem_read_vroml,   NULL, NULL, NULL,   NULL);
   7.341 +        mem_mapping_add(&romext_mapping,  0xc8000, 0x08000, mem_read_romext, mem_read_romextw, mem_read_romextl, NULL, NULL, NULL,   NULL);
   7.342 +//        pclog("Mem resize %i %i\n",mem_size,c);
   7.343 +}
   7.344 +
   7.345 +void mem_resize()
   7.346 +{
   7.347 +        int c;
   7.348 +        
   7.349 +        free(ram);
   7.350 +        ram = malloc(mem_size * 1024 * 1024);
   7.351 +        memset(ram, 0, mem_size * 1024 * 1024);
   7.352 +        
   7.353 +        memset(isram, 0, sizeof(isram));
   7.354 +        for (c = 0; c < (mem_size * 16); c++)
   7.355 +        {
   7.356 +                isram[c] = 1;
   7.357 +                if (c >= 0xa && c <= 0xf) 
   7.358 +                        isram[c] = 0;
   7.359 +        }
   7.360 +
   7.361 +        memset(_mem_read_b,  0, sizeof(_mem_read_b));
   7.362 +        memset(_mem_read_w,  0, sizeof(_mem_read_w));
   7.363 +        memset(_mem_read_l,  0, sizeof(_mem_read_l));
   7.364 +        memset(_mem_write_b, 0, sizeof(_mem_write_b));
   7.365 +        memset(_mem_write_w, 0, sizeof(_mem_write_w));
   7.366 +        memset(_mem_write_l, 0, sizeof(_mem_write_l));
   7.367 +
   7.368 +        memset(&base_mapping, 0, sizeof(base_mapping));
   7.369 +
   7.370 +        mem_mapping_add(&ram_low_mapping, 0x00000, 0xa0000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.371 +        if (mem_size > 1)
   7.372 +                mem_mapping_add(&ram_low_mapping, 0x100000, (mem_size - 1) * 1024 * 1024, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.373 +           
   7.374 +        mem_mapping_add(&bios_mapping[0], 0xe0000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.375 +        mem_mapping_add(&bios_mapping[1], 0xe4000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.376 +        mem_mapping_add(&bios_mapping[2], 0xe8000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.377 +        mem_mapping_add(&bios_mapping[3], 0xec000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.378 +        mem_mapping_add(&bios_mapping[4], 0xf0000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.379 +        mem_mapping_add(&bios_mapping[5], 0xf4000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.380 +        mem_mapping_add(&bios_mapping[6], 0xf8000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.381 +        mem_mapping_add(&bios_mapping[7], 0xfc000, 0x04000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml,   NULL);
   7.382 +
   7.383 +        mem_mapping_add(&vrom_mapping,    0xc0000, 0x08000, mem_read_vrom,   mem_read_vromw,   mem_read_vroml,   NULL, NULL, NULL,   NULL);
   7.384 +        mem_mapping_add(&romext_mapping,  0xc8000, 0x08000, mem_read_romext, mem_read_romextw, mem_read_romextl, NULL, NULL, NULL,   NULL);
   7.385 +
   7.386 +//        pclog("Mem resize %i %i\n",mem_size,c);
   7.387 +}
   7.388 +
   7.389 +void mem_bios_set_state(uint32_t base, uint32_t size, int read_ram, int write_ram)
   7.390  {
   7.391          uint32_t c;
   7.392 -        if ((base + size) > 0xffff8000)
   7.393 -           size = 0xffff0000 - base;
   7.394 -        for (c = base; c < base + size; c += 0x4000)
   7.395 +        int state = (read_ram ? 1 : 0) | (write_ram ? 2: 0);
   7.396 +        
   7.397 +        if (base < 0xe0000 || base > 0xfffff)
   7.398 +                return;
   7.399 +        if ((base + size) > 0x100000)
   7.400 +                size = 0x100000 - base;
   7.401 +        
   7.402 +        for (c = base; c < (base + size); c+= 0x4000)
   7.403          {
   7.404 -                if (_mem_priv[c >> 14] == priv)
   7.405 +//                pclog("mem_bios_set_state: c=%08X base=%08X size=%08X bios=%i\n", c, base, size, (c - 0xe0000) >> 14);
   7.406 +                switch (state)
   7.407                  {
   7.408 -                        if ( _mem_read_b[c >> 14]  == read_b)  _mem_read_b[c >> 14] = NULL;
   7.409 -                        if ( _mem_read_w[c >> 14]  == read_w)  _mem_read_w[c >> 14] = NULL;
   7.410 -                        if ( _mem_read_l[c >> 14]  == read_l)  _mem_read_l[c >> 14] = NULL;
   7.411 -                        if (_mem_write_b[c >> 14] == write_b) _mem_write_b[c >> 14] = NULL;
   7.412 -                        if (_mem_write_w[c >> 14] == write_w) _mem_write_w[c >> 14] = NULL;
   7.413 -                        if (_mem_write_l[c >> 14] == write_l) _mem_write_l[c >> 14] = NULL;
   7.414 -                        _mem_priv[c >> 14] = NULL;
   7.415 +                        case 0:
   7.416 +                        mem_mapping_set_handler(&bios_mapping[(c - 0xe0000) >> 14], mem_read_bios, mem_read_biosw, mem_read_biosl, NULL, NULL, NULL);
   7.417 +                        break;
   7.418 +                        case 1:
   7.419 +                        mem_mapping_set_handler(&bios_mapping[(c - 0xe0000) >> 14], mem_read_ram,  mem_read_ramw,  mem_read_raml,  NULL, NULL, NULL);
   7.420 +                        break;
   7.421 +                        case 2:
   7.422 +                        mem_mapping_set_handler(&bios_mapping[(c - 0xe0000) >> 14], mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_ram, mem_write_ramw, mem_write_raml);
   7.423 +                        break;
   7.424 +                        case 3:
   7.425 +                        mem_mapping_set_handler(&bios_mapping[(c - 0xe0000) >> 14], mem_read_ram,  mem_read_ramw,  mem_read_raml,  mem_write_ram, mem_write_ramw, mem_write_raml);
   7.426 +                        break;
   7.427                  }
   7.428          }
   7.429 -        for (c = base; c < base + size; c += 0x1000)
   7.430 -        {
   7.431 -                readlookup2[c >> 12]  = 0xFFFFFFFF;
   7.432 -                writelookup2[c >> 12] = 0xFFFFFFFF;
   7.433 -        }
   7.434  }
   7.435  
   7.436  int mem_a20_key = 0, mem_a20_alt = 0;
     8.1 --- a/src/mem.h	Sun Oct 13 16:33:43 2013 +0100
     8.2 +++ b/src/mem.h	Sat Oct 19 17:06:55 2013 +0100
     8.3 @@ -1,3 +1,22 @@
     8.4 +typedef struct mem_mapping_t
     8.5 +{
     8.6 +        struct mem_mapping_t *prev, *next;
     8.7 +
     8.8 +        int enable;
     8.9 +                
    8.10 +        uint32_t base;
    8.11 +        uint32_t size;
    8.12 +
    8.13 +        uint8_t  (*read_b)(uint32_t addr, void *priv);
    8.14 +        uint16_t (*read_w)(uint32_t addr, void *priv);
    8.15 +        uint32_t (*read_l)(uint32_t addr, void *priv);
    8.16 +        void (*write_b)(uint32_t addr, uint8_t  val, void *priv);
    8.17 +        void (*write_w)(uint32_t addr, uint16_t val, void *priv);
    8.18 +        void (*write_l)(uint32_t addr, uint32_t val, void *priv);
    8.19 +        
    8.20 +        void *p;
    8.21 +} mem_mapping_t;
    8.22 +
    8.23  extern uint8_t *ram,*rom,*vram,*vrom;
    8.24  extern uint8_t romext[32768];
    8.25  extern int readlnum,writelnum;
    8.26 @@ -6,27 +25,37 @@
    8.27  extern int cache;
    8.28  extern int memwaitstate;
    8.29  
    8.30 -void mem_sethandler(uint32_t base, uint32_t size, 
    8.31 -                    uint8_t  (*read_b)(uint32_t addr, void *priv),
    8.32 -                    uint16_t (*read_w)(uint32_t addr, void *priv),
    8.33 -                    uint32_t (*read_l)(uint32_t addr, void *priv),
    8.34 -                    void (*write_b)(uint32_t addr, uint8_t  val, void *priv),
    8.35 -                    void (*write_w)(uint32_t addr, uint16_t val, void *priv),
    8.36 -                    void (*write_l)(uint32_t addr, uint32_t val, void *priv),
    8.37 -                    void *priv);
    8.38 +void mem_mapping_add(mem_mapping_t *mapping,
    8.39 +                    uint32_t base, 
    8.40 +                    uint32_t size, 
    8.41 +                    uint8_t  (*read_b)(uint32_t addr, void *p),
    8.42 +                    uint16_t (*read_w)(uint32_t addr, void *p),
    8.43 +                    uint32_t (*read_l)(uint32_t addr, void *p),
    8.44 +                    void (*write_b)(uint32_t addr, uint8_t  val, void *p),
    8.45 +                    void (*write_w)(uint32_t addr, uint16_t val, void *p),
    8.46 +                    void (*write_l)(uint32_t addr, uint32_t val, void *p),
    8.47 +                    void *p);
    8.48 +void mem_mapping_set_handler(mem_mapping_t *mapping,
    8.49 +                    uint8_t  (*read_b)(uint32_t addr, void *p),
    8.50 +                    uint16_t (*read_w)(uint32_t addr, void *p),
    8.51 +                    uint32_t (*read_l)(uint32_t addr, void *p),
    8.52 +                    void (*write_b)(uint32_t addr, uint8_t  val, void *p),
    8.53 +                    void (*write_w)(uint32_t addr, uint16_t val, void *p),
    8.54 +                    void (*write_l)(uint32_t addr, uint32_t val, void *p));
    8.55 +void mem_mapping_set_p(mem_mapping_t *mapping, void *p);
    8.56 +void mem_mapping_set_addr(mem_mapping_t *mapping, uint32_t base, uint32_t size);
    8.57 +void mem_mapping_disable(mem_mapping_t *mapping);
    8.58 +void mem_mapping_enable(mem_mapping_t *mapping);
    8.59  
    8.60 -void mem_removehandler(uint32_t base, uint32_t size, 
    8.61 -                       uint8_t  (*read_b)(uint32_t addr, void *priv),
    8.62 -                       uint16_t (*read_w)(uint32_t addr, void *priv),
    8.63 -                       uint32_t (*read_l)(uint32_t addr, void *priv),
    8.64 -                       void (*write_b)(uint32_t addr, uint8_t  val, void *priv),
    8.65 -                       void (*write_w)(uint32_t addr, uint16_t val, void *priv),
    8.66 -                       void (*write_l)(uint32_t addr, uint32_t val, void *priv),
    8.67 -                       void *priv);
    8.68 +void mem_bios_set_state(uint32_t base, uint32_t size, int read_ram, int write_ram);
    8.69 +
    8.70  extern int mem_a20_alt;
    8.71  extern int mem_a20_key;
    8.72  void mem_a20_recalc();
    8.73  
    8.74 +uint8_t mem_readb_phys(uint32_t addr);
    8.75 +void mem_writeb_phys(uint32_t addr, uint8_t val);
    8.76 +
    8.77  uint8_t  mem_read_ram(uint32_t addr, void *priv);
    8.78  uint16_t mem_read_ramw(uint32_t addr, void *priv);
    8.79  uint32_t mem_read_raml(uint32_t addr, void *priv);
     9.1 --- a/src/sis496.c	Sun Oct 13 16:33:43 2013 +0100
     9.2 +++ b/src/sis496.c	Sat Oct 19 17:06:55 2013 +0100
     9.3 @@ -17,42 +17,42 @@
     9.4          if (sis496->pci_conf[0x44] & 0x10)
     9.5          {
     9.6                  if (sis496->pci_conf[0x45] & 0x01)
     9.7 -                        mem_sethandler(0xe0000, 0x8000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    NULL,          NULL,           NULL,           NULL);
     9.8 +                        mem_bios_set_state(0xe0000, 0x08000, 1, 0);
     9.9                  else
    9.10 -                        mem_sethandler(0xe0000, 0x8000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml, NULL);
    9.11 +                        mem_bios_set_state(0xe0000, 0x08000, 1, 1);
    9.12          }
    9.13          else
    9.14 -                mem_sethandler(0xe0000, 0x8000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml, NULL);        
    9.15 +                mem_bios_set_state(0xe0000, 0x08000, 0, 1);
    9.16  
    9.17          if (sis496->pci_conf[0x44] & 0x20)
    9.18          {
    9.19                  if (sis496->pci_conf[0x45] & 0x01)
    9.20 -                        mem_sethandler(0xe8000, 0x8000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    NULL,          NULL,           NULL,           NULL);
    9.21 +                        mem_bios_set_state(0xe8000, 0x08000, 1, 0);
    9.22                  else
    9.23 -                        mem_sethandler(0xe8000, 0x8000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml, NULL);
    9.24 +                        mem_bios_set_state(0xe8000, 0x08000, 1, 1);
    9.25          }
    9.26          else
    9.27 -                mem_sethandler(0xe8000, 0x8000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml, NULL);        
    9.28 +                mem_bios_set_state(0xe8000, 0x08000, 0, 1);
    9.29                  
    9.30          if (sis496->pci_conf[0x44] & 0x40)
    9.31          {
    9.32                  if (sis496->pci_conf[0x45] & 0x01)
    9.33 -                        mem_sethandler(0xf0000, 0x8000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    NULL,          NULL,           NULL,           NULL);
    9.34 +                        mem_bios_set_state(0xf0000, 0x08000, 1, 0);
    9.35                  else
    9.36 -                        mem_sethandler(0xf0000, 0x8000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml, NULL);
    9.37 +                        mem_bios_set_state(0xf0000, 0x08000, 1, 1);
    9.38          }
    9.39          else
    9.40 -                mem_sethandler(0xf0000, 0x8000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml, NULL);        
    9.41 +                mem_bios_set_state(0xf0000, 0x08000, 0, 1);
    9.42                  
    9.43          if (sis496->pci_conf[0x44] & 0x80)
    9.44          {
    9.45                  if (sis496->pci_conf[0x45] & 0x01)
    9.46 -                        mem_sethandler(0xf8000, 0x8000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    NULL,          NULL,           NULL,           NULL);
    9.47 +                        mem_bios_set_state(0xf8000, 0x08000, 1, 0);
    9.48                  else
    9.49 -                        mem_sethandler(0xf8000, 0x8000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml, NULL);
    9.50 +                        mem_bios_set_state(0xf8000, 0x08000, 1, 1);
    9.51          }
    9.52          else
    9.53 -                mem_sethandler(0xf8000, 0x8000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml, NULL);        
    9.54 +                mem_bios_set_state(0xf8000, 0x08000, 0, 1);
    9.55  
    9.56          flushmmucache();
    9.57          shadowbios = (sis496->pci_conf[0x44] & 0xf0);
    10.1 --- a/src/um8881f.c	Sun Oct 13 16:33:43 2013 +0100
    10.2 +++ b/src/um8881f.c	Sat Oct 19 17:06:55 2013 +0100
    10.3 @@ -15,9 +15,9 @@
    10.4                  if ((card_16[0x54] ^ val) & 0x01)
    10.5                  {
    10.6                          if (val & 1)
    10.7 -                           mem_sethandler(0xe0000, 0x10000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml, NULL);
    10.8 +                                mem_bios_set_state(0xe0000, 0x10000, 1, 1);
    10.9                          else
   10.10 -                           mem_sethandler(0xf0000, 0x10000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   NULL,          NULL,           NULL          , NULL);
   10.11 +                                mem_bios_set_state(0xe0000, 0x10000, 0, 0);
   10.12                  }
   10.13                  flushmmucache_nopc();
   10.14          }
   10.15 @@ -27,10 +27,10 @@
   10.16                  {
   10.17                          switch (val & 0xc0)
   10.18                          {
   10.19 -                                case 0x00: mem_sethandler(0xf0000, 0x10000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   mem_write_ram, mem_write_ramw, mem_write_raml, NULL); break;
   10.20 -                                case 0x40: mem_sethandler(0xf0000, 0x10000, mem_read_bios,   mem_read_biosw,   mem_read_biosl,   NULL,          NULL,           NULL          , NULL); break;
   10.21 -                                case 0x80: mem_sethandler(0xf0000, 0x10000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    mem_write_ram, mem_write_ramw, mem_write_raml, NULL); break;
   10.22 -                                case 0xc0: mem_sethandler(0xf0000, 0x10000, mem_read_ram,    mem_read_ramw,    mem_read_raml,    NULL,          NULL,           NULL          , NULL); break;
   10.23 +                                case 0x00: mem_bios_set_state(0xf0000, 0x10000, 0, 1); break;
   10.24 +                                case 0x40: mem_bios_set_state(0xf0000, 0x10000, 0, 0); break;
   10.25 +                                case 0x80: mem_bios_set_state(0xf0000, 0x10000, 1, 1); break;
   10.26 +                                case 0xc0: mem_bios_set_state(0xf0000, 0x10000, 1, 0); break;
   10.27                          }
   10.28                          shadowbios = val & 0x80;
   10.29                          shadowbios_write = !(val & 0x40);
   10.30 @@ -56,9 +56,7 @@
   10.31  {
   10.32          return card_18[addr];
   10.33  }
   10.34 - 
   10.35 - 
   10.36 -     
   10.37 +
   10.38  void um8881f_init()
   10.39  {
   10.40          pci_add_specific(16, um8881f_read, um8881f_write, NULL);
    11.1 --- a/src/vid_ati18800.c	Sun Oct 13 16:33:43 2013 +0100
    11.2 +++ b/src/vid_ati18800.c	Sat Oct 19 17:06:55 2013 +0100
    11.3 @@ -3,6 +3,7 @@
    11.4  #include "ibm.h"
    11.5  #include "device.h"
    11.6  #include "io.h"
    11.7 +#include "mem.h"
    11.8  #include "video.h"
    11.9  #include "vid_ati18800.h"
   11.10  #include "vid_ati_eeprom.h"
    12.1 --- a/src/vid_ati28800.c	Sun Oct 13 16:33:43 2013 +0100
    12.2 +++ b/src/vid_ati28800.c	Sat Oct 19 17:06:55 2013 +0100
    12.3 @@ -3,6 +3,7 @@
    12.4  #include "ibm.h"
    12.5  #include "device.h"
    12.6  #include "io.h"
    12.7 +#include "mem.h"
    12.8  #include "video.h"
    12.9  #include "vid_ati28800.h"
   12.10  #include "vid_ati_eeprom.h"
    13.1 --- a/src/vid_ati68860_ramdac.c	Sun Oct 13 16:33:43 2013 +0100
    13.2 +++ b/src/vid_ati68860_ramdac.c	Sat Oct 19 17:06:55 2013 +0100
    13.3 @@ -19,6 +19,7 @@
    13.4        7  If set can remove "snow" in some cases (A860_Delay_L ?) ??
    13.5  */
    13.6  #include "ibm.h"
    13.7 +#include "mem.h"
    13.8  #include "video.h"
    13.9  #include "vid_svga.h"
   13.10  #include "vid_ati68860_ramdac.h"
    14.1 --- a/src/vid_ati_mach64.c	Sun Oct 13 16:33:43 2013 +0100
    14.2 +++ b/src/vid_ati_mach64.c	Sat Oct 19 17:06:55 2013 +0100
    14.3 @@ -16,6 +16,10 @@
    14.4  
    14.5  typedef struct mach64_t
    14.6  {
    14.7 +        mem_mapping_t linear_mapping;
    14.8 +        mem_mapping_t mmio_mapping;
    14.9 +        mem_mapping_t mmio_linear_mapping;
   14.10 +
   14.11          ati68860_ramdac_t ramdac;
   14.12          ati_eeprom_t eeprom;
   14.13          ics2595_t ics2595;
   14.14 @@ -321,38 +325,43 @@
   14.15  void mach64_updatemapping(mach64_t *mach64)
   14.16  {
   14.17          svga_t *svga = &mach64->svga;
   14.18 -        mem_removehandler(0xa0000, 0x10000, mach64_read, NULL, NULL, mach64_write, NULL, NULL,  mach64);
   14.19 -        mem_removehandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,  svga);
   14.20 -        mem_removehandler(0xbc000, 0x04000, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel,  mach64);
   14.21 -        if (mach64->old_linear_base >= (mem_size << 20))
   14.22 -        {
   14.23 -                mem_removehandler(mach64->old_linear_base, (8 << 20) - 0x4000, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear,  svga);
   14.24 -                mem_removehandler(mach64->old_linear_base + ((8 << 20) - 0x4000), 0x4000, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel,  mach64);
   14.25 -        }
   14.26 +
   14.27 +        mem_mapping_disable(&mach64->mmio_mapping);
   14.28  //        pclog("Write mapping %02X\n", val);
   14.29          switch (svga->gdcreg[6] & 0xc)
   14.30          {
   14.31                  case 0x0: /*128k at A0000*/
   14.32 -                mem_sethandler(0xa0000, 0x10000, mach64_read, NULL, NULL, mach64_write, NULL, NULL,  mach64);
   14.33 -                mem_sethandler(0xbc000, 0x04000, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel,  mach64);
   14.34 +                mem_mapping_set_handler(&mach64->svga.mapping, mach64_read, NULL, NULL, mach64_write, NULL, NULL);
   14.35 +                mem_mapping_set_p(&mach64->svga.mapping, mach64);
   14.36 +                mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000);
   14.37 +                mem_mapping_enable(&mach64->mmio_mapping);
   14.38                  break;
   14.39                  case 0x4: /*64k at A0000*/
   14.40 -                mem_sethandler(0xa0000, 0x10000, mach64_read, NULL, NULL, mach64_write, NULL, NULL,  mach64);
   14.41 +                mem_mapping_set_handler(&mach64->svga.mapping, mach64_read, NULL, NULL, mach64_write, NULL, NULL);
   14.42 +                mem_mapping_set_p(&mach64->svga.mapping, mach64);
   14.43 +                mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   14.44                  break;
   14.45                  case 0x8: /*32k at B0000*/
   14.46 -                mem_sethandler(0xb0000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,  svga);
   14.47 +                mem_mapping_set_handler(&mach64->svga.mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel);
   14.48 +                mem_mapping_set_p(&mach64->svga.mapping, svga);
   14.49 +                mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000);
   14.50                  break;
   14.51                  case 0xC: /*32k at B8000*/
   14.52 -                mem_sethandler(0xb8000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,  svga);
   14.53 +                mem_mapping_set_handler(&mach64->svga.mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel);
   14.54 +                mem_mapping_set_p(&mach64->svga.mapping, svga);
   14.55 +                mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
   14.56                  break;
   14.57          }
   14.58 -        if (mach64->linear_base >= (mem_size << 20))
   14.59 +        if (mach64->linear_base)
   14.60          {
   14.61 -                mem_sethandler(mach64->linear_base, (8 << 20) - 0x4000, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear,  svga);
   14.62 -                mem_sethandler(mach64->linear_base + ((8 << 20) - 0x4000), 0x4000, mach64_ext_readb, mach64_ext_readw, mach64_ext_readl, mach64_ext_writeb, mach64_ext_writew, mach64_ext_writel,  mach64);
   14.63 -//                pclog("Mach64 LFB %08X\n", mach64->linear_base);
   14.64 +                mem_mapping_set_addr(&mach64->linear_mapping, mach64->linear_base, (8 << 20) - 0x4000);
   14.65 +                mem_mapping_set_addr(&mach64->mmio_linear_mapping, mach64->linear_base + ((8 << 20) - 0x4000), 0x4000);
   14.66          }
   14.67 -        mach64->old_linear_base = mach64->linear_base;
   14.68 +        else
   14.69 +        {
   14.70 +                mem_mapping_disable(&mach64->linear_mapping);
   14.71 +                mem_mapping_disable(&mach64->mmio_linear_mapping);
   14.72 +        }
   14.73  }
   14.74  
   14.75  #define READ8(addr, var)        switch ((addr) & 3)                                     \
   14.76 @@ -2019,6 +2028,11 @@
   14.77                     mach64_in, mach64_out,
   14.78                     mach64_hwcursor_draw); 
   14.79  
   14.80 +        mem_mapping_add(&mach64->linear_mapping,      0,       0,       svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, &mach64->svga);
   14.81 +        mem_mapping_add(&mach64->mmio_linear_mapping, 0,       0,       mach64_ext_readb, mach64_ext_readw,  mach64_ext_readl,  mach64_ext_writeb, mach64_ext_writew,  mach64_ext_writel,   mach64);
   14.82 +        mem_mapping_add(&mach64->mmio_mapping,        0xbc000, 0x04000, mach64_ext_readb, mach64_ext_readw,  mach64_ext_readl,  mach64_ext_writeb, mach64_ext_writew,  mach64_ext_writel,   mach64);
   14.83 +        mem_mapping_disable(&mach64->mmio_mapping);
   14.84 +
   14.85          io_sethandler(0x03c0, 0x0020, mach64_in, NULL, NULL, mach64_out, NULL, NULL, mach64);
   14.86          
   14.87          for (c = 0; c < 8; c++)
    15.1 --- a/src/vid_cga.c	Sun Oct 13 16:33:43 2013 +0100
    15.2 +++ b/src/vid_cga.c	Sat Oct 19 17:06:55 2013 +0100
    15.3 @@ -497,7 +497,7 @@
    15.4                  q_filt[c] = 512.0 * sin((3.14 * (cga_tint + c * 4) / 16.0) - 33.0 / 180.0);
    15.5          }
    15.6          timer_add(cga_poll, &cga->vidtime, TIMER_ALWAYS_ENABLED, cga);
    15.7 -        mem_sethandler(0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL,  cga);
    15.8 +        mem_mapping_add(&cga->mapping, 0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL,  cga);
    15.9          io_sethandler(0x03d0, 0x0010, cga_in, NULL, NULL, cga_out, NULL, NULL, cga);
   15.10          return cga;
   15.11  }
    16.1 --- a/src/vid_cga.h	Sun Oct 13 16:33:43 2013 +0100
    16.2 +++ b/src/vid_cga.h	Sat Oct 19 17:06:55 2013 +0100
    16.3 @@ -1,5 +1,7 @@
    16.4  typedef struct cga_t
    16.5  {
    16.6 +        mem_mapping_t mapping;
    16.7 +        
    16.8          int crtcreg;
    16.9          uint8_t crtc[32];
   16.10          
    17.1 --- a/src/vid_cl5429.c	Sun Oct 13 16:33:43 2013 +0100
    17.2 +++ b/src/vid_cl5429.c	Sat Oct 19 17:06:55 2013 +0100
    17.3 @@ -12,6 +12,8 @@
    17.4  
    17.5  typedef struct gd5429_t
    17.6  {
    17.7 +        mem_mapping_t mmio_mapping;
    17.8 +        
    17.9          svga_t svga;
   17.10          
   17.11          uint32_t bank[2];
   17.12 @@ -220,25 +222,25 @@
   17.13  {
   17.14          svga_t *svga = &gd5429->svga;
   17.15          
   17.16 -        mem_removehandler(0xa0000, 0x20000, gd5429_read, NULL, NULL, gd5429_write, NULL, NULL,  gd5429);
   17.17 -        mem_removehandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,  svga);
   17.18 -        mem_removehandler(0xb8000, 0x00100, gd5429_mmio_read, NULL, NULL, gd5429_mmio_write, NULL, NULL,  gd5429);
   17.19          pclog("Write mapping %02X %i\n", svga->gdcreg[6], svga->seqregs[0x17] & 0x04);
   17.20          switch (svga->gdcreg[6] & 0x0C)
   17.21          {
   17.22                  case 0x0: /*128k at A0000*/
   17.23 -                mem_sethandler(0xa0000, 0x10000, gd5429_read, NULL, NULL, gd5429_write, NULL, NULL,  gd5429);
   17.24 +                mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   17.25 +                mem_mapping_disable(&gd5429->mmio_mapping);
   17.26                  break;
   17.27                  case 0x4: /*64k at A0000*/
   17.28 -                mem_sethandler(0xa0000, 0x10000, gd5429_read, NULL, NULL, gd5429_write, NULL, NULL,  gd5429);
   17.29 +                mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   17.30                  if (svga->seqregs[0x17] & 0x04)
   17.31 -                        mem_sethandler(0xb8000, 0x00100, gd5429_mmio_read, NULL, NULL, gd5429_mmio_write, NULL, NULL,  gd5429);
   17.32 +                        mem_mapping_set_addr(&gd5429->mmio_mapping, 0xb8000, 0x00100);
   17.33                  break;
   17.34                  case 0x8: /*32k at B0000*/
   17.35 -                mem_sethandler(0xb0000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,  svga);
   17.36 +                mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000);
   17.37 +                mem_mapping_disable(&gd5429->mmio_mapping);
   17.38                  break;
   17.39                  case 0xC: /*32k at B8000*/
   17.40 -                mem_sethandler(0xb8000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,  svga);
   17.41 +                mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
   17.42 +                mem_mapping_disable(&gd5429->mmio_mapping);
   17.43                  break;
   17.44          }
   17.45  }
   17.46 @@ -539,13 +541,14 @@
   17.47                  if (gd5429->blt.mode & 0x04)
   17.48                  {
   17.49  //                        pclog("blt.mode & 0x04\n");
   17.50 -                        mem_removehandler(0xa0000, 0x10000, gd5429_read, NULL, NULL, gd5429_write, NULL, NULL,  gd5429);
   17.51 -                        mem_sethandler(0xa0000, 0x10000, NULL, NULL, NULL, NULL, gd5429_blt_write_w, gd5429_blt_write_l,  gd5429);
   17.52 +                        mem_mapping_set_handler(&svga->mapping, NULL, NULL, NULL, NULL, gd5429_blt_write_w, gd5429_blt_write_l);
   17.53 +                        mem_mapping_set_p(&svga->mapping, gd5429);
   17.54                          return;
   17.55                  }
   17.56                  else
   17.57                  {
   17.58 -                        mem_removehandler(0xa0000, 0x10000, NULL, NULL, NULL, NULL, gd5429_blt_write_w, gd5429_blt_write_l,  gd5429);
   17.59 +                        mem_mapping_set_handler(&gd5429->svga.mapping, gd5429_read, NULL, NULL, gd5429_write, NULL, NULL);
   17.60 +                        mem_mapping_set_p(&gd5429->svga.mapping, gd5429);
   17.61                          gd5429_recalc_mapping(gd5429);
   17.62                  }                
   17.63          }
   17.64 @@ -666,7 +669,8 @@
   17.65                          {
   17.66                                  if (gd5429->blt.mode & 0x04)
   17.67                                  {
   17.68 -                                        mem_removehandler(0xa0000, 0x10000, NULL, NULL, NULL, NULL, gd5429_blt_write_w, gd5429_blt_write_l,  gd5429);
   17.69 +                                        mem_mapping_set_handler(&gd5429->svga.mapping, gd5429_read, NULL, NULL, gd5429_write, NULL, NULL);
   17.70 +                                        mem_mapping_set_p(&gd5429->svga.mapping, gd5429);
   17.71                                          gd5429_recalc_mapping(gd5429);
   17.72                                  }
   17.73                                  return;
   17.74 @@ -808,6 +812,11 @@
   17.75                     gd5429_in, gd5429_out,
   17.76                     gd5429_hwcursor_draw);
   17.77  
   17.78 +        mem_mapping_set_handler(&gd5429->svga.mapping, gd5429_read, NULL, NULL, gd5429_write, NULL, NULL);
   17.79 +        mem_mapping_set_p(&gd5429->svga.mapping, gd5429);
   17.80 +
   17.81 +        mem_mapping_add(&gd5429->mmio_mapping, 0, 0, gd5429_mmio_read, NULL, NULL, gd5429_mmio_write, NULL, NULL,  gd5429);
   17.82 +
   17.83          io_sethandler(0x03c0, 0x0020, gd5429_in, NULL, NULL, gd5429_out, NULL, NULL, gd5429);
   17.84  
   17.85          svga->hwcursor.yoff = 32;
    18.1 --- a/src/vid_ega.c	Sun Oct 13 16:33:43 2013 +0100
    18.2 +++ b/src/vid_ega.c	Sat Oct 19 17:06:55 2013 +0100
    18.3 @@ -96,21 +96,20 @@
    18.4                          ega->readmode = val & 8; 
    18.5                          break;
    18.6                          case 6:
    18.7 -                        mem_removehandler(0xa0000, 0x20000, ega_read, NULL, NULL, ega_write, NULL, NULL, ega);
    18.8  //                                pclog("Write mapping %02X\n", val);
    18.9                          switch (val & 0xc)
   18.10                          {
   18.11                                  case 0x0: /*128k at A0000*/
   18.12 -                                mem_sethandler(0xa0000, 0x20000, ega_read, NULL, NULL, ega_write, NULL, NULL, ega);
   18.13 +                                mem_mapping_set_addr(&ega->mapping, 0xa0000, 0x20000);
   18.14                                  break;
   18.15                                  case 0x4: /*64k at A0000*/
   18.16 -                                mem_sethandler(0xa0000, 0x10000, ega_read, NULL, NULL, ega_write, NULL, NULL, ega);
   18.17 +                                mem_mapping_set_addr(&ega->mapping, 0xa0000, 0x10000);
   18.18                                  break;
   18.19                                  case 0x8: /*32k at B0000*/
   18.20 -                                mem_sethandler(0xb0000, 0x08000, ega_read, NULL, NULL, ega_write, NULL, NULL, ega);
   18.21 +                                mem_mapping_set_addr(&ega->mapping, 0xb0000, 0x08000);
   18.22                                  break;
   18.23                                  case 0xC: /*32k at B8000*/
   18.24 -                                mem_sethandler(0xb8000, 0x08000, ega_read, NULL, NULL, ega_write, NULL, NULL, ega);
   18.25 +                                mem_mapping_set_addr(&ega->mapping, 0xb8000, 0x08000);
   18.26                                  break;
   18.27                          }
   18.28                          break;
   18.29 @@ -814,6 +813,7 @@
   18.30  
   18.31          ega_init(ega);        
   18.32  
   18.33 +        mem_mapping_add(&ega->mapping, 0xa0000, 0x20000, ega_read, NULL, NULL, ega_write, NULL, NULL, ega);
   18.34          timer_add(ega_poll, &ega->vidtime, TIMER_ALWAYS_ENABLED, ega);
   18.35          io_sethandler(0x03a0, 0x0040, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
   18.36          return ega;
    19.1 --- a/src/vid_ega.h	Sun Oct 13 16:33:43 2013 +0100
    19.2 +++ b/src/vid_ega.h	Sat Oct 19 17:06:55 2013 +0100
    19.3 @@ -1,5 +1,7 @@
    19.4  typedef struct ega_t
    19.5  {
    19.6 +        mem_mapping_t mapping;
    19.7 +        
    19.8          uint8_t crtcreg;
    19.9          uint8_t crtc[32];
   19.10          uint8_t gdcreg[16];
    20.1 --- a/src/vid_et4000.c	Sun Oct 13 16:33:43 2013 +0100
    20.2 +++ b/src/vid_et4000.c	Sat Oct 19 17:06:55 2013 +0100
    20.3 @@ -3,6 +3,7 @@
    20.4  #include "ibm.h"
    20.5  #include "device.h"
    20.6  #include "io.h"
    20.7 +#include "mem.h"
    20.8  #include "video.h"
    20.9  #include "vid_svga.h"
   20.10  #include "vid_unk_ramdac.h"
    21.1 --- a/src/vid_et4000w32.c	Sun Oct 13 16:33:43 2013 +0100
    21.2 +++ b/src/vid_et4000w32.c	Sat Oct 19 17:06:55 2013 +0100
    21.3 @@ -7,15 +7,18 @@
    21.4  #include "ibm.h"
    21.5  #include "device.h"
    21.6  #include "io.h"
    21.7 +#include "mem.h"
    21.8  #include "pci.h"
    21.9  #include "video.h"
   21.10  #include "vid_svga.h"
   21.11  #include "vid_icd2061.h"
   21.12  #include "vid_stg_ramdac.h"
   21.13 -#include "mem.h"
   21.14  
   21.15  typedef struct et4000w32p_t
   21.16  {
   21.17 +        mem_mapping_t linear_mapping;
   21.18 +        mem_mapping_t    mmu_mapping;
   21.19 +        
   21.20          svga_t svga;
   21.21          stg_ramdac_t ramdac;
   21.22          icd2061_t icd2061;
   21.23 @@ -258,12 +261,11 @@
   21.24          svga_t *svga = &et4000->svga;
   21.25          
   21.26          pclog("recalcmapping %p\n", svga);
   21.27 -        mem_removehandler(et4000->linearbase_old, 0x200000,    svga_read_linear, svga_readw_linear, svga_readl_linear,    svga_write_linear, svga_writew_linear, svga_writel_linear, svga);
   21.28 -        mem_removehandler(               0xa0000,  0x20000,           svga_read,        svga_readw,        svga_readl,           svga_write,        svga_writew,        svga_writel, svga);
   21.29 -        mem_removehandler(               0xb0000,  0x10000, et4000w32p_mmu_read,              NULL,              NULL, et4000w32p_mmu_write,               NULL,               NULL, et4000);
   21.30          if (svga->crtc[0x36] & 0x10) /*Linear frame buffer*/
   21.31          {
   21.32 -                mem_sethandler(et4000->linearbase, 0x200000, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, svga);
   21.33 +                mem_mapping_set_addr(&et4000->linear_mapping, et4000->linearbase, 0x200000);
   21.34 +                mem_mapping_disable(&svga->mapping);
   21.35 +                mem_mapping_disable(&et4000->mmu_mapping);
   21.36          }
   21.37          else
   21.38          {
   21.39 @@ -273,30 +275,36 @@
   21.40                  switch (map)
   21.41                  {
   21.42                          case 0x0: case 0x4: case 0x8: case 0xC: /*128k at A0000*/
   21.43 -                        mem_sethandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   21.44 +                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000);
   21.45 +                        mem_mapping_disable(&et4000->mmu_mapping);
   21.46                          break;
   21.47                          case 0x1: /*64k at A0000*/
   21.48 -                        mem_sethandler(0xa0000, 0x10000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   21.49 +                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   21.50 +                        mem_mapping_disable(&et4000->mmu_mapping);
   21.51                          break;
   21.52                          case 0x2: /*32k at B0000*/
   21.53 -                        mem_sethandler(0xb0000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   21.54 +                        mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000);
   21.55 +                        mem_mapping_disable(&et4000->mmu_mapping);
   21.56                          break;
   21.57                          case 0x3: /*32k at B8000*/
   21.58 -                        mem_sethandler(0xb8000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   21.59 +                        mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
   21.60 +                        mem_mapping_disable(&et4000->mmu_mapping);
   21.61                          break;
   21.62                          case 0x5: case 0x9: case 0xD: /*64k at A0000, MMU at B8000*/
   21.63 -                        mem_sethandler(0xa0000, 0x10000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   21.64 -                        mem_sethandler(0xb8000, 0x08000, et4000w32p_mmu_read, NULL, NULL, et4000w32p_mmu_write, NULL, NULL, et4000);
   21.65 +                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   21.66 +                        mem_mapping_set_addr(&et4000->mmu_mapping, 0xb8000, 0x08000);
   21.67                          break;
   21.68                          case 0x6: case 0xA: case 0xE: /*32k at B0000, MMU at A8000*/
   21.69 -                        mem_sethandler(0xa8000, 0x08000, et4000w32p_mmu_read, NULL, NULL, et4000w32p_mmu_write, NULL, NULL, et4000);
   21.70 -                        mem_sethandler(0xb0000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   21.71 +                        mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000);
   21.72 +                        mem_mapping_set_addr(&et4000->mmu_mapping, 0xa8000, 0x08000);
   21.73                          break;
   21.74                          case 0x7: case 0xB: case 0xF: /*32k at B8000, MMU at A8000*/
   21.75 -                        mem_sethandler(0xa8000, 0x08000, et4000w32p_mmu_read, NULL, NULL, et4000w32p_mmu_write, NULL, NULL, et4000);
   21.76 -                        mem_sethandler(0xb8000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   21.77 +                        mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
   21.78 +                        mem_mapping_set_addr(&et4000->mmu_mapping, 0xa8000, 0x08000);
   21.79                          break;
   21.80                  }
   21.81 +                
   21.82 +                mem_mapping_disable(&et4000->linear_mapping);
   21.83  //                pclog("ET4K map %02X\n", map);
   21.84          }
   21.85          et4000->linearbase_old = et4000->linearbase;
   21.86 @@ -933,6 +941,9 @@
   21.87                     et4000w32p_in, et4000w32p_out,
   21.88                     et4000w32p_hwcursor_draw); 
   21.89  
   21.90 +        mem_mapping_add(&et4000->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, &et4000->svga);
   21.91 +        mem_mapping_add(&et4000->mmu_mapping,    0, 0, et4000w32p_mmu_read, NULL, NULL, et4000w32p_mmu_write, NULL, NULL, et4000);
   21.92 +
   21.93          io_sethandler(0x03c0, 0x0020, et4000w32p_in, NULL, NULL, et4000w32p_out, NULL, NULL, et4000);
   21.94  
   21.95          io_sethandler(0x210A, 0x0002, et4000w32p_in, NULL, NULL, et4000w32p_out, NULL, NULL, et4000);
    22.1 --- a/src/vid_hercules.c	Sun Oct 13 16:33:43 2013 +0100
    22.2 +++ b/src/vid_hercules.c	Sat Oct 19 17:06:55 2013 +0100
    22.3 @@ -9,6 +9,8 @@
    22.4  
    22.5  typedef struct hercules_t
    22.6  {
    22.7 +        mem_mapping_t mapping;
    22.8 +        
    22.9          uint8_t crtc[32];
   22.10          int crtcreg;
   22.11  
   22.12 @@ -59,9 +61,10 @@
   22.13                  return;
   22.14                  case 0x3bf:
   22.15                  hercules->ctrl2 = val;
   22.16 -                mem_removehandler(0xb8000, 0x08000, hercules_read, NULL, NULL, hercules_write, NULL, NULL,  hercules);
   22.17                  if (val & 2)
   22.18 -                        mem_sethandler(0xb8000, 0x08000, hercules_read, NULL, NULL, hercules_write, NULL, NULL,  hercules);
   22.19 +                        mem_mapping_set_addr(&hercules->mapping, 0xb0000, 0x10000);
   22.20 +                else
   22.21 +                        mem_mapping_set_addr(&hercules->mapping, 0xb0000, 0x08000);
   22.22                  return;
   22.23          }
   22.24  }
   22.25 @@ -308,7 +311,7 @@
   22.26          hercules->vram = malloc(0x10000);
   22.27  
   22.28          timer_add(hercules_poll, &hercules->vidtime, TIMER_ALWAYS_ENABLED, hercules);
   22.29 -        mem_sethandler(0xb0000, 0x08000, hercules_read, NULL, NULL, hercules_write, NULL, NULL,  hercules);
   22.30 +        mem_mapping_add(&hercules->mapping, 0xb0000, 0x08000, hercules_read, NULL, NULL, hercules_write, NULL, NULL,  hercules);
   22.31          io_sethandler(0x03b0, 0x0010, hercules_in, NULL, NULL, hercules_out, NULL, NULL, hercules);
   22.32  
   22.33          for (c = 0; c < 256; c++)
    23.1 --- a/src/vid_mda.c	Sun Oct 13 16:33:43 2013 +0100
    23.2 +++ b/src/vid_mda.c	Sat Oct 19 17:06:55 2013 +0100
    23.3 @@ -10,6 +10,8 @@
    23.4  
    23.5  typedef struct mda_t
    23.6  {
    23.7 +        mem_mapping_t mapping;
    23.8 +        
    23.9          uint8_t crtc[32];
   23.10          int crtcreg;
   23.11          
   23.12 @@ -266,7 +268,7 @@
   23.13          mda->vram = malloc(0x1000);
   23.14  
   23.15          timer_add(mda_poll, &mda->vidtime, TIMER_ALWAYS_ENABLED, mda);
   23.16 -        mem_sethandler(0xb0000, 0x08000, mda_read, NULL, NULL, mda_write, NULL, NULL,  mda);
   23.17 +        mem_mapping_add(&mda->mapping, 0xb0000, 0x08000, mda_read, NULL, NULL, mda_write, NULL, NULL,  mda);
   23.18          io_sethandler(0x03b0, 0x0010, mda_in, NULL, NULL, mda_out, NULL, NULL, mda);
   23.19  
   23.20          for (c = 0; c < 256; c++)
    24.1 --- a/src/vid_olivetti_m24.c	Sun Oct 13 16:33:43 2013 +0100
    24.2 +++ b/src/vid_olivetti_m24.c	Sat Oct 19 17:06:55 2013 +0100
    24.3 @@ -11,6 +11,8 @@
    24.4  
    24.5  typedef struct m24_t
    24.6  {
    24.7 +        mem_mapping_t mapping;
    24.8 +        
    24.9          uint8_t crtc[32];
   24.10          int crtcreg;
   24.11          
   24.12 @@ -457,7 +459,7 @@
   24.13          m24->vram = malloc(0x8000);
   24.14                  
   24.15          timer_add(m24_poll, &m24->vidtime, TIMER_ALWAYS_ENABLED, m24);
   24.16 -        mem_sethandler(0xb8000, 0x08000, m24_read, NULL, NULL, m24_write, NULL, NULL,  m24);
   24.17 +        mem_mapping_add(&m24->mapping, 0xb8000, 0x08000, m24_read, NULL, NULL, m24_write, NULL, NULL,  m24);
   24.18          io_sethandler(0x03d0, 0x0010, m24_in, NULL, NULL, m24_out, NULL, NULL, m24);
   24.19          return m24;
   24.20  }
    25.1 --- a/src/vid_oti067.c	Sun Oct 13 16:33:43 2013 +0100
    25.2 +++ b/src/vid_oti067.c	Sat Oct 19 17:06:55 2013 +0100
    25.3 @@ -3,6 +3,7 @@
    25.4  #include "ibm.h"
    25.5  #include "device.h"
    25.6  #include "io.h"
    25.7 +#include "mem.h"
    25.8  #include "video.h"
    25.9  #include "vid_oti067.h"
   25.10  #include "vid_svga.h"
    26.1 --- a/src/vid_paradise.c	Sun Oct 13 16:33:43 2013 +0100
    26.2 +++ b/src/vid_paradise.c	Sat Oct 19 17:06:55 2013 +0100
    26.3 @@ -65,21 +65,20 @@
    26.4                  {
    26.5                          if ((svga->gdcreg[6] & 0xc) != (val & 0xc))
    26.6                          {
    26.7 -                                mem_removehandler(0xa0000, 0x20000, paradise_read, NULL, NULL, paradise_write, NULL, NULL,  paradise);
    26.8  //                                pclog("Write mapping %02X\n", val);
    26.9                                  switch (val&0xC)
   26.10                                  {
   26.11                                          case 0x0: /*128k at A0000*/
   26.12 -                                        mem_sethandler(0xa0000, 0x20000, paradise_read, NULL, NULL, paradise_write, NULL, NULL,  paradise);
   26.13 +                                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000);
   26.14                                          break;
   26.15                                          case 0x4: /*64k at A0000*/
   26.16 -                                        mem_sethandler(0xa0000, 0x10000, paradise_read, NULL, NULL, paradise_write, NULL, NULL,  paradise);
   26.17 +                                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   26.18                                          break;
   26.19                                          case 0x8: /*32k at B0000*/
   26.20 -                                        mem_sethandler(0xb0000, 0x08000, paradise_read, NULL, NULL, paradise_write, NULL, NULL,  paradise);
   26.21 +                                        mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000);
   26.22                                          break;
   26.23                                          case 0xC: /*32k at B8000*/
   26.24 -                                        mem_sethandler(0xb8000, 0x08000, paradise_read, NULL, NULL, paradise_write, NULL, NULL,  paradise);
   26.25 +                                        mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
   26.26                                          break;
   26.27                                  }
   26.28                          }
   26.29 @@ -260,6 +259,9 @@
   26.30                     paradise_in, paradise_out,
   26.31                     NULL);
   26.32  
   26.33 +        mem_mapping_set_handler(&paradise->svga.mapping, paradise_read, NULL, NULL, paradise_write, NULL, NULL);
   26.34 +        mem_mapping_set_p(&paradise->svga.mapping, paradise);
   26.35 +        
   26.36          svga->crtc[0x31] = 'W';
   26.37          svga->crtc[0x32] = 'D';
   26.38          svga->crtc[0x33] = '9';
   26.39 @@ -287,6 +289,9 @@
   26.40                     paradise_in, paradise_out,
   26.41                     NULL);
   26.42  
   26.43 +        mem_mapping_set_handler(&paradise->svga.mapping, paradise_read, NULL, NULL, paradise_write, NULL, NULL);
   26.44 +        mem_mapping_set_p(&paradise->svga.mapping, paradise);
   26.45 +
   26.46          svga->crtc[0x31] = 'W';
   26.47          svga->crtc[0x32] = 'D';
   26.48          svga->crtc[0x33] = '9';
    27.1 --- a/src/vid_pc1512.c	Sun Oct 13 16:33:43 2013 +0100
    27.2 +++ b/src/vid_pc1512.c	Sat Oct 19 17:06:55 2013 +0100
    27.3 @@ -17,6 +17,8 @@
    27.4  
    27.5  typedef struct pc1512_t
    27.6  {
    27.7 +        mem_mapping_t mapping;
    27.8 +        
    27.9          uint8_t crtc[32];
   27.10          int crtcreg;
   27.11  
   27.12 @@ -456,7 +458,7 @@
   27.13          pc1512->cgamode = 0x12;
   27.14                  
   27.15          timer_add(pc1512_poll, &pc1512->vidtime, TIMER_ALWAYS_ENABLED, pc1512);
   27.16 -        mem_sethandler(0xb8000, 0x08000, pc1512_read, NULL, NULL, pc1512_write, NULL, NULL,  pc1512);
   27.17 +        mem_mapping_add(&pc1512->mapping, 0xb8000, 0x08000, pc1512_read, NULL, NULL, pc1512_write, NULL, NULL,  pc1512);
   27.18          io_sethandler(0x03d0, 0x0010, pc1512_in, NULL, NULL, pc1512_out, NULL, NULL, pc1512);
   27.19          return pc1512;
   27.20  }
    28.1 --- a/src/vid_pc1640.c	Sun Oct 13 16:33:43 2013 +0100
    28.2 +++ b/src/vid_pc1640.c	Sat Oct 19 17:06:55 2013 +0100
    28.3 @@ -13,6 +13,9 @@
    28.4  
    28.5  typedef struct pc1640_t
    28.6  {
    28.7 +        mem_mapping_t cga_mapping;
    28.8 +        mem_mapping_t ega_mapping;
    28.9 +
   28.10          cga_t cga;
   28.11          ega_t ega;
   28.12          
   28.13 @@ -28,25 +31,27 @@
   28.14          {
   28.15                  case 0x3db:
   28.16                  pc1640->cga_enabled = val & 0x40;
   28.17 -                mem_removehandler(0xa0000, 0x20000, ega_read, NULL, NULL, ega_write, NULL, NULL,  &pc1640->ega);
   28.18 -                mem_removehandler(0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL,  &pc1640->cga);
   28.19                  if (pc1640->cga_enabled)
   28.20 -                   mem_sethandler(0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL,  &pc1640->cga);
   28.21 +                {
   28.22 +                        mem_mapping_enable(&pc1640->cga_mapping);
   28.23 +                        mem_mapping_disable(&pc1640->ega_mapping);
   28.24 +                }
   28.25                  else
   28.26 -                {                
   28.27 +                {
   28.28 +                        mem_mapping_disable(&pc1640->cga_mapping);
   28.29                          switch (pc1640->ega.gdcreg[6] & 0xc)
   28.30                          {
   28.31                                  case 0x0: /*128k at A0000*/
   28.32 -                                mem_sethandler(0xa0000, 0x20000, ega_read, NULL, NULL, ega_write, NULL, NULL,  &pc1640->ega);
   28.33 +                                mem_mapping_set_addr(&pc1640->ega_mapping, 0xa0000, 0x20000);
   28.34                                  break;
   28.35                                  case 0x4: /*64k at A0000*/
   28.36 -                                mem_sethandler(0xa0000, 0x10000, ega_read, NULL, NULL, ega_write, NULL, NULL,  &pc1640->ega);
   28.37 +                                mem_mapping_set_addr(&pc1640->ega_mapping, 0xa0000, 0x10000);
   28.38                                  break;
   28.39                                  case 0x8: /*32k at B0000*/
   28.40 -                                mem_sethandler(0xb0000, 0x08000, ega_read, NULL, NULL, ega_write, NULL, NULL,  &pc1640->ega);
   28.41 +                                mem_mapping_set_addr(&pc1640->ega_mapping, 0xb0000, 0x08000);
   28.42                                  break;
   28.43                                  case 0xC: /*32k at B8000*/
   28.44 -                                mem_sethandler(0xb8000, 0x08000, ega_read, NULL, NULL, ega_write, NULL, NULL,  &pc1640->ega);
   28.45 +                                mem_mapping_set_addr(&pc1640->ega_mapping, 0xb8000, 0x08000);
   28.46                                  break;
   28.47                          }
   28.48                  }                
   28.49 @@ -115,7 +120,8 @@
   28.50          cga_init(&pc1640->cga);
   28.51                          
   28.52          timer_add(pc1640_poll, &pc1640->vidtime, TIMER_ALWAYS_ENABLED, pc1640);
   28.53 -        mem_sethandler(0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL,  cga);
   28.54 +        mem_mapping_add(&pc1640->cga_mapping, 0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL,  cga);
   28.55 +        mem_mapping_add(&pc1640->ega_mapping, 0,       0,       ega_read, NULL, NULL, ega_write, NULL, NULL,  ega);
   28.56          io_sethandler(0x03a0, 0x0040, pc1640_in, NULL, NULL, pc1640_out, NULL, NULL, pc1640);
   28.57          return cga;
   28.58  }
    29.1 --- a/src/vid_pc200.c	Sun Oct 13 16:33:43 2013 +0100
    29.2 +++ b/src/vid_pc200.c	Sat Oct 19 17:06:55 2013 +0100
    29.3 @@ -13,6 +13,8 @@
    29.4  
    29.5  typedef struct pc200_t
    29.6  {
    29.7 +        mem_mapping_t mapping;
    29.8 +        
    29.9          cga_t cga;
   29.10  
   29.11          uint8_t reg_3dd, reg_3de, reg_3df;
   29.12 @@ -109,7 +111,7 @@
   29.13          cga_init(&pc200->cga);
   29.14                          
   29.15          timer_add(cga_poll, &cga->vidtime, TIMER_ALWAYS_ENABLED, cga);
   29.16 -        mem_sethandler(0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL,  cga);
   29.17 +        mem_mapping_add(&pc200->mapping, 0xb8000, 0x08000, cga_read, NULL, NULL, cga_write, NULL, NULL,  cga);
   29.18          io_sethandler(0x03d0, 0x0010, pc200_in, NULL, NULL, pc200_out, NULL, NULL, pc200);
   29.19          return cga;
   29.20  }
    30.1 --- a/src/vid_s3.c	Sun Oct 13 16:33:43 2013 +0100
    30.2 +++ b/src/vid_s3.c	Sat Oct 19 17:06:55 2013 +0100
    30.3 @@ -13,6 +13,9 @@
    30.4  
    30.5  typedef struct s3_t
    30.6  {
    30.7 +        mem_mapping_t linear_mapping;
    30.8 +        mem_mapping_t mmio_mapping;
    30.9 +        
   30.10          svga_t svga;
   30.11          sdac_ramdac_t ramdac;
   30.12  
   30.13 @@ -239,7 +242,7 @@
   30.14          s3_t *s3 = (s3_t *)svga->p;
   30.15          svga->hdisp = svga->hdisp_old;
   30.16  
   30.17 -        pclog("%i %i\n", svga->hdisp, svga->hdisp_time);
   30.18 +//        pclog("%i %i\n", svga->hdisp, svga->hdisp_time);
   30.19  //        pclog("recalctimings\n");
   30.20          svga->ma_latch |= (s3->ma_ext << 16);
   30.21  //        pclog("SVGA_MA %08X\n", svga_ma);
   30.22 @@ -287,41 +290,38 @@
   30.23          }
   30.24  
   30.25         // if (svga->bpp == 32) svga->hdisp *= 3;
   30.26 -        pclog("svga->hdisp %i %02X %i\n", svga->hdisp, svga->crtc[0x5d], svga->hdisp_time);
   30.27 +//        pclog("svga->hdisp %i %02X %i\n", svga->hdisp, svga->crtc[0x5d], svga->hdisp_time);
   30.28  }
   30.29  
   30.30  void s3_updatemapping(s3_t *s3)
   30.31  {
   30.32          svga_t *svga = &s3->svga;
   30.33          
   30.34 -        mem_removehandler(s3->linear_base, s3->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, svga);
   30.35 -        
   30.36  //        video_write_a000_w = video_write_a000_l = NULL;
   30.37  
   30.38 -        mem_removehandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   30.39  
   30.40 -        mem_removehandler(0xa0000, 0x10000, s3_accel_read, NULL, NULL, s3_accel_write, s3_accel_write_w, s3_accel_write_l, s3);
   30.41 -
   30.42 -//        pclog("Update mapping - bank %02X ", gdcreg[6] & 0xc);        
   30.43 +//        pclog("Update mapping - bank %02X ", svga->gdcreg[6] & 0xc);
   30.44          switch (svga->gdcreg[6] & 0xc) /*Banked framebuffer*/
   30.45          {
   30.46                  case 0x0: /*128k at A0000*/
   30.47 -                mem_sethandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   30.48 +                mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000);
   30.49                  break;
   30.50                  case 0x4: /*64k at A0000*/
   30.51 -                mem_sethandler(0xa0000, 0x10000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   30.52 +                mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   30.53                  break;
   30.54                  case 0x8: /*32k at B0000*/
   30.55 -                mem_sethandler(0xb0000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   30.56 +                mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000);
   30.57                  break;
   30.58                  case 0xC: /*32k at B8000*/
   30.59 -                mem_sethandler(0xb8000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   30.60 +                mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
   30.61                  break;
   30.62          }
   30.63          
   30.64 -//        pclog("Linear framebuffer %02X ", crtc[0x58] & 0x10);
   30.65 +//        pclog("Linear framebuffer %02X ", svga->crtc[0x58] & 0x10);
   30.66          if (svga->crtc[0x58] & 0x10) /*Linear framebuffer*/
   30.67          {
   30.68 +                mem_mapping_disable(&svga->mapping);
   30.69 +                
   30.70                  s3->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24);
   30.71                  switch (svga->crtc[0x58] & 3)
   30.72                  {
   30.73 @@ -340,16 +340,24 @@
   30.74                  }
   30.75                  s3->linear_base &= ~(s3->linear_size - 1);
   30.76  //                pclog("%08X %08X  %02X %02X %02X\n", linear_base, linear_size, crtc[0x58], crtc[0x59], crtc[0x5a]);
   30.77 -//                pclog("Linear framebuffer at %08X size %08X\n", linear_base, linear_size);
   30.78 +//                pclog("Linear framebuffer at %08X size %08X\n", s3->linear_base, s3->linear_size);
   30.79                  if (s3->linear_base == 0xa0000)
   30.80 -                   mem_sethandler(0xa0000, 0x10000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   30.81 +                {
   30.82 +                        mem_mapping_disable(&s3->linear_mapping);
   30.83 +                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   30.84 +//                        mem_mapping_set_addr(&s3->linear_mapping, 0xa0000, 0x10000);
   30.85 +                }
   30.86                  else
   30.87 -                   mem_sethandler(s3->linear_base, s3->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, svga);
   30.88 +                        mem_mapping_set_addr(&s3->linear_mapping, s3->linear_base, s3->linear_size);
   30.89          }
   30.90 +        else
   30.91 +                mem_mapping_disable(&s3->linear_mapping);
   30.92          
   30.93 -//        pclog("Memory mapped IO %02X\n", crtc[0x53] & 0x10);
   30.94 +//        pclog("Memory mapped IO %02X\n", svga->crtc[0x53] & 0x10);
   30.95          if (svga->crtc[0x53] & 0x10) /*Memory mapped IO*/
   30.96 -                mem_sethandler(0xa0000, 0x10000, s3_accel_read, NULL, NULL, s3_accel_write, s3_accel_write_w, s3_accel_write_l, s3);
   30.97 +                mem_mapping_enable(&s3->mmio_mapping);
   30.98 +        else
   30.99 +                mem_mapping_disable(&s3->mmio_mapping);
  30.100  }
  30.101  
  30.102  
  30.103 @@ -1533,6 +1541,10 @@
  30.104          svga_t *svga = &s3->svga;
  30.105          memset(s3, 0, sizeof(s3_t));
  30.106          
  30.107 +        mem_mapping_add(&s3->linear_mapping, 0,       0,       svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, &s3->svga);
  30.108 +        mem_mapping_add(&s3->mmio_mapping,   0xa0000, 0x10000, s3_accel_read, NULL, NULL, s3_accel_write, s3_accel_write_w, s3_accel_write_l, s3);
  30.109 +        mem_mapping_disable(&s3->mmio_mapping);
  30.110 +
  30.111          svga_init(&s3->svga, s3, 1 << 22, /*4mb - 864 supports 8mb but buggy VESA driver reports 0mb*/
  30.112                     s3_recalctimings,
  30.113                     s3_in, s3_out,
    31.1 --- a/src/vid_s3_virge.c	Sun Oct 13 16:33:43 2013 +0100
    31.2 +++ b/src/vid_s3_virge.c	Sat Oct 19 17:06:55 2013 +0100
    31.3 @@ -15,6 +15,9 @@
    31.4  
    31.5  typedef struct virge_t
    31.6  {
    31.7 +        mem_mapping_t linear_mapping;
    31.8 +        mem_mapping_t   mmio_mapping;
    31.9 +        
   31.10          svga_t svga;
   31.11          
   31.12          uint8_t bank;
   31.13 @@ -263,26 +266,20 @@
   31.14  {
   31.15          svga_t *svga = &virge->svga;
   31.16          
   31.17 -        mem_removehandler(virge->linear_base, virge->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, svga);
   31.18 -        
   31.19 -//        video_write_a000_w = video_write_a000_l = NULL;
   31.20 -
   31.21 -        mem_removehandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   31.22 -        mem_removehandler(0xa0000, 0x20000, s3_virge_mmio_read, s3_virge_mmio_read_w, s3_virge_mmio_read_l, s3_virge_mmio_write, s3_virge_mmio_write_w, s3_virge_mmio_write_l, virge);
   31.23          pclog("Update mapping - bank %02X ", svga->gdcreg[6] & 0xc);        
   31.24          switch (svga->gdcreg[6] & 0xc) /*Banked framebuffer*/
   31.25          {
   31.26                  case 0x0: /*128k at A0000*/
   31.27 -                mem_sethandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   31.28 +                mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000);
   31.29                  break;
   31.30                  case 0x4: /*64k at A0000*/
   31.31 -                mem_sethandler(0xa0000, 0x10000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   31.32 +                mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   31.33                  break;
   31.34                  case 0x8: /*32k at B0000*/
   31.35 -                mem_sethandler(0xb0000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   31.36 +                mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000);
   31.37                  break;
   31.38                  case 0xC: /*32k at B8000*/
   31.39 -                mem_sethandler(0xb8000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   31.40 +                mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
   31.41                  break;
   31.42          }
   31.43          
   31.44 @@ -309,20 +306,26 @@
   31.45  //                pclog("%08X %08X  %02X %02X %02X\n", linear_base, linear_size, crtc[0x58], crtc[0x59], crtc[0x5a]);
   31.46                  pclog("Linear framebuffer at %08X size %08X\n", virge->linear_base, virge->linear_size);
   31.47                  if (virge->linear_base == 0xa0000)
   31.48 -                   mem_sethandler(0xa0000, 0x10000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   31.49 +                {
   31.50 +                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   31.51 +                        mem_mapping_disable(&virge->linear_mapping);
   31.52 +                }
   31.53                  else
   31.54 -                   mem_sethandler(virge->linear_base, virge->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, svga);
   31.55 +                        mem_mapping_set_addr(&svga->mapping, virge->linear_base, virge->linear_size);
   31.56          }
   31.57 +        else
   31.58 +                mem_mapping_disable(&virge->linear_mapping);
   31.59          
   31.60          pclog("Memory mapped IO %02X\n", svga->crtc[0x53] & 0x18);
   31.61          if ((svga->crtc[0x53] & 0x18) == 0x10) /*Memory mapped IO*/
   31.62          {
   31.63                  if (svga->crtc[0x53] & 0x20)
   31.64 -                   mem_sethandler(0xb8000, 0x8000, s3_virge_mmio_read, s3_virge_mmio_read_w, s3_virge_mmio_read_l, s3_virge_mmio_write, s3_virge_mmio_write_w, s3_virge_mmio_write_l, virge);
   31.65 +                        mem_mapping_set_addr(&virge->mmio_mapping, 0xb8000, 0x8000);
   31.66                  else
   31.67 -                   mem_sethandler(0xa8000, 0x8000, s3_virge_mmio_read, s3_virge_mmio_read_w, s3_virge_mmio_read_l, s3_virge_mmio_write, s3_virge_mmio_write_w, s3_virge_mmio_write_l, virge);
   31.68 +                        mem_mapping_set_addr(&virge->mmio_mapping, 0xa8000, 0x8000);
   31.69          }
   31.70 -
   31.71 +        else
   31.72 +                mem_mapping_disable(&virge->mmio_mapping);
   31.73  }
   31.74  
   31.75  
   31.76 @@ -451,6 +454,9 @@
   31.77                     s3_virge_in, s3_virge_out,
   31.78                     s3_virge_hwcursor_draw);
   31.79  
   31.80 +        mem_mapping_add(&virge->mmio_mapping,   0, 0, s3_virge_mmio_read, s3_virge_mmio_read_w, s3_virge_mmio_read_l, s3_virge_mmio_write, s3_virge_mmio_write_w, s3_virge_mmio_write_l, virge);
   31.81 +        mem_mapping_add(&virge->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, &virge->svga);
   31.82 +
   31.83          io_sethandler(0x03c0, 0x0020, s3_virge_in, NULL, NULL, s3_virge_out, NULL, NULL, virge);
   31.84  
   31.85          virge->pci_regs[4] = 3;
    32.1 --- a/src/vid_sdac_ramdac.c	Sun Oct 13 16:33:43 2013 +0100
    32.2 +++ b/src/vid_sdac_ramdac.c	Sat Oct 19 17:06:55 2013 +0100
    32.3 @@ -1,6 +1,7 @@
    32.4  /*87C716 'SDAC' true colour RAMDAC emulation*/
    32.5  /*Misidentifies as AT&T 21C504*/
    32.6  #include "ibm.h"
    32.7 +#include "mem.h"
    32.8  #include "video.h"
    32.9  #include "vid_svga.h"
   32.10  #include "vid_sdac_ramdac.h"
    33.1 --- a/src/vid_stg_ramdac.c	Sun Oct 13 16:33:43 2013 +0100
    33.2 +++ b/src/vid_stg_ramdac.c	Sat Oct 19 17:06:55 2013 +0100
    33.3 @@ -1,5 +1,6 @@
    33.4  /*STG1702 true colour RAMDAC emulation*/
    33.5  #include "ibm.h"
    33.6 +#include "mem.h"
    33.7  #include "video.h"
    33.8  #include "vid_svga.h"
    33.9  #include "vid_stg_ramdac.h"
    34.1 --- a/src/vid_svga.c	Sun Oct 13 16:33:43 2013 +0100
    34.2 +++ b/src/vid_svga.c	Sat Oct 19 17:06:55 2013 +0100
    34.3 @@ -139,21 +139,20 @@
    34.4                                  pclog("svga_out recalcmapping %p\n", svga);
    34.5                          if ((svga->gdcreg[6] & 0xc) != (val & 0xc))
    34.6                          {
    34.7 -                                mem_removehandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, p);
    34.8                                  pclog("Write mapping %02X\n", val);
    34.9                                  switch (val&0xC)
   34.10                                  {
   34.11                                          case 0x0: /*128k at A0000*/
   34.12 -                                        mem_sethandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, p);
   34.13 +                                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000);
   34.14                                          break;
   34.15                                          case 0x4: /*64k at A0000*/
   34.16 -                                        mem_sethandler(0xa0000, 0x10000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, p);
   34.17 +                                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   34.18                                          break;
   34.19                                          case 0x8: /*32k at B0000*/
   34.20 -                                        mem_sethandler(0xb0000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, p);
   34.21 +                                        mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000);
   34.22                                          break;
   34.23                                          case 0xC: /*32k at B8000*/
   34.24 -                                        mem_sethandler(0xb8000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, p);
   34.25 +                                        mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
   34.26                                          break;
   34.27                                  }
   34.28                          }
   34.29 @@ -641,7 +640,9 @@
   34.30          svga->video_out = video_out;
   34.31          svga->hwcursor_draw = hwcursor_draw;
   34.32  //        _svga_recalctimings(svga);
   34.33 -        
   34.34 +
   34.35 +        mem_mapping_add(&svga->mapping, 0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel, svga);
   34.36 +
   34.37          timer_add(svga_poll, &svga->vidtime, TIMER_ALWAYS_ENABLED, svga);
   34.38          vramp = svga->vram;
   34.39          return 0;
   34.40 @@ -1161,7 +1162,7 @@
   34.41          cycles -= video_timing_w;
   34.42          cycles_lost += video_timing_w;
   34.43  
   34.44 -        if (svga_output) pclog("Writew %05X ", addr);
   34.45 +        if (svga_output) pclog("svga_writew: %05X ", addr);
   34.46          addr = (addr & 0xffff) + svga->write_bank;
   34.47          addr &= 0x7FFFFF;        
   34.48          if (addr >= svga->vram_limit)
   34.49 @@ -1189,7 +1190,7 @@
   34.50          cycles -= video_timing_l;
   34.51          cycles_lost += video_timing_l;
   34.52  
   34.53 -        if (svga_output) pclog("Writel %05X ", addr);
   34.54 +        if (svga_output) pclog("svga_writel: %05X ", addr);
   34.55          addr = (addr & 0xffff) + svga->write_bank;
   34.56          addr &= 0x7FFFFF;
   34.57          if (addr >= svga->vram_limit)
    35.1 --- a/src/vid_svga.h	Sun Oct 13 16:33:43 2013 +0100
    35.2 +++ b/src/vid_svga.h	Sat Oct 19 17:06:55 2013 +0100
    35.3 @@ -1,5 +1,7 @@
    35.4  typedef struct svga_t
    35.5  {
    35.6 +        mem_mapping_t mapping;
    35.7 +        
    35.8          uint8_t crtcreg;
    35.9          uint8_t crtc[128];
   35.10          uint8_t gdcreg[16];
    36.1 --- a/src/vid_svga_render.c	Sun Oct 13 16:33:43 2013 +0100
    36.2 +++ b/src/vid_svga_render.c	Sat Oct 19 17:06:55 2013 +0100
    36.3 @@ -1,4 +1,5 @@
    36.4  #include "ibm.h"
    36.5 +#include "mem.h"
    36.6  #include "video.h"
    36.7  #include "vid_svga.h"
    36.8  #include "vid_svga_render.h"
    37.1 --- a/src/vid_tandy.c	Sun Oct 13 16:33:43 2013 +0100
    37.2 +++ b/src/vid_tandy.c	Sat Oct 19 17:06:55 2013 +0100
    37.3 @@ -12,6 +12,8 @@
    37.4  
    37.5  typedef struct tandy_t
    37.6  {
    37.7 +        mem_mapping_t mapping;
    37.8 +        
    37.9          uint8_t crtc[32];
   37.10          int crtcreg;
   37.11          
   37.12 @@ -665,7 +667,7 @@
   37.13                  q_filt[c] = 512.0 * sin((3.14 * (tandy_tint + c * 4) / 16.0) - 33.0 / 180.0);
   37.14          }
   37.15          timer_add(tandy_poll, &tandy->vidtime, TIMER_ALWAYS_ENABLED, tandy);
   37.16 -        mem_sethandler(0xb8000, 0x08000, tandy_read, NULL, NULL, tandy_write, NULL, NULL,  tandy);
   37.17 +        mem_mapping_add(&tandy->mapping, 0xb8000, 0x08000, tandy_read, NULL, NULL, tandy_write, NULL, NULL,  tandy);
   37.18          io_sethandler(0x03d0, 0x0010, tandy_in, NULL, NULL, tandy_out, NULL, NULL, tandy);
   37.19          io_sethandler(0x00a0, 0x0001, tandy_in, NULL, NULL, tandy_out, NULL, NULL, tandy);
   37.20          return tandy;
    38.1 --- a/src/vid_tkd8001_ramdac.c	Sun Oct 13 16:33:43 2013 +0100
    38.2 +++ b/src/vid_tkd8001_ramdac.c	Sat Oct 19 17:06:55 2013 +0100
    38.3 @@ -1,5 +1,6 @@
    38.4  /*Trident TKD8001 RAMDAC emulation*/
    38.5  #include "ibm.h"
    38.6 +#include "mem.h"
    38.7  #include "video.h"
    38.8  #include "vid_svga.h"
    38.9  #include "vid_tkd8001_ramdac.h"
    39.1 --- a/src/vid_tvga.c	Sun Oct 13 16:33:43 2013 +0100
    39.2 +++ b/src/vid_tvga.c	Sat Oct 19 17:06:55 2013 +0100
    39.3 @@ -12,6 +12,9 @@
    39.4  
    39.5  typedef struct tvga_t
    39.6  {
    39.7 +        mem_mapping_t linear_mapping;
    39.8 +        mem_mapping_t accel_mapping;
    39.9 +
   39.10          svga_t svga;
   39.11          tkd8001_ramdac_t ramdac;
   39.12  
   39.13 @@ -314,37 +317,37 @@
   39.14  {
   39.15          svga_t *svga = &tvga->svga;
   39.16          
   39.17 -	pclog("tvga_recalcmapping : %02X %02X\n", svga->crtc[0x21], svga->gdcreg[6]);
   39.18 -        mem_removehandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,    svga);
   39.19 -	mem_removehandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear,    svga);
   39.20 -	mem_removehandler(0xbc000, 0x4000, tvga_accel_read, NULL, NULL, tvga_accel_write, NULL, NULL,    tvga);
   39.21 +//	pclog("tvga_recalcmapping : %02X %02X\n", svga->crtc[0x21], svga->gdcreg[6]);
   39.22  
   39.23  	if (svga->crtc[0x21] & 0x20)
   39.24  	{
   39.25 +                mem_mapping_disable(&svga->mapping);
   39.26  		tvga->linear_base = ((svga->crtc[0x21] & 0xf) | ((svga->crtc[0x21] >> 2) & 0x30)) << 20;
   39.27  		tvga->linear_size = (svga->crtc[0x21] & 0x10) ? 0x200000 : 0x100000;
   39.28 -		mem_sethandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear,    svga);
   39.29 -		pclog("Trident linear framebuffer at %08X - size %06X\n", tvga->linear_base, tvga->linear_size);
   39.30 -		mem_sethandler(0xbc000, 0x4000, tvga_accel_read, tvga_accel_read_w, tvga_accel_read_l, tvga_accel_write, tvga_accel_write_w, tvga_accel_write_l,    tvga);
   39.31 +                mem_mapping_set_addr(&tvga->linear_mapping, tvga->linear_base, tvga->linear_size);
   39.32 +//		pclog("Trident linear framebuffer at %08X - size %06X\n", tvga->linear_base, tvga->linear_size);
   39.33 +                mem_mapping_enable(&tvga->accel_mapping);
   39.34  	}
   39.35  	else
   39.36  	{
   39.37  //                                pclog("Write mapping %02X\n", val);
   39.38 +                mem_mapping_disable(&tvga->linear_mapping);
   39.39 +                mem_mapping_disable(&tvga->accel_mapping);
   39.40                  switch (svga->gdcreg[6] & 0xC)
   39.41                  {
   39.42                          case 0x0: /*128k at A0000*/
   39.43 -                        mem_sethandler(0xa0000, 0x20000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,    svga);
   39.44 +                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000);
   39.45                          break;
   39.46                          case 0x4: /*64k at A0000*/
   39.47 -                        mem_sethandler(0xa0000, 0x10000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,    svga);
   39.48 -                        mem_sethandler(0xbc000, 0x4000, tvga_accel_read, NULL, NULL, tvga_accel_write, NULL, NULL,    tvga);
   39.49 +                        mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000);
   39.50 +                        mem_mapping_enable(&tvga->accel_mapping);
   39.51                          break;
   39.52                          case 0x8: /*32k at B0000*/
   39.53 -                        mem_sethandler(0xb0000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,    svga);
   39.54 +                        mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000);
   39.55                          break;
   39.56                          case 0xC: /*32k at B8000*/
   39.57 -                	mem_sethandler(0xb8000, 0x08000, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel,    svga);
   39.58 -                	break;
   39.59 +                        mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
   39.60 +                        break;
   39.61  		}
   39.62          }
   39.63  }
   39.64 @@ -385,6 +388,11 @@
   39.65                     tvga_in, tvga_out,
   39.66                     NULL);
   39.67  
   39.68 +        mem_mapping_add(&tvga->linear_mapping, 0,       0,      svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, &tvga->svga);
   39.69 +        mem_mapping_add(&tvga->accel_mapping,  0xbc000, 0x4000, tvga_accel_read,  tvga_accel_read_w, tvga_accel_read_l, tvga_accel_write,  tvga_accel_write_w, tvga_accel_write_l,  tvga);
   39.70 +        mem_mapping_disable(&tvga->linear_mapping);
   39.71 +        mem_mapping_disable(&tvga->accel_mapping);
   39.72 +        
   39.73          io_sethandler(0x03c0, 0x0020, tvga_in, NULL, NULL, tvga_out, NULL, NULL, tvga);
   39.74  
   39.75          return tvga;
   39.76 @@ -399,6 +407,10 @@
   39.77                     tvga_in, tvga_out,
   39.78                     tvga_hwcursor_draw);
   39.79  
   39.80 +        mem_mapping_add(&tvga->linear_mapping, 0,       0,      svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, &tvga->svga);
   39.81 +        mem_mapping_add(&tvga->accel_mapping,  0xbc000, 0x4000, tvga_accel_read,  tvga_accel_read_w, tvga_accel_read_l, tvga_accel_write,  tvga_accel_write_w, tvga_accel_write_l,  tvga);
   39.82 +        mem_mapping_disable(&tvga->accel_mapping);
   39.83 +
   39.84          io_sethandler(0x03c0, 0x0020, tvga_in, NULL, NULL, tvga_out, NULL, NULL, tvga);
   39.85  
   39.86          return tvga;
   39.87 @@ -549,15 +561,15 @@
   39.88  			}
   39.89  		}
   39.90  	}
   39.91 -	for (y = 0; y < 8; y++)
   39.92 +/*	for (y = 0; y < 8; y++)
   39.93  	{
   39.94  		if (count == -1) pclog("Pattern %i : %02X %02X %02X %02X %02X %02X %02X %02X\n", y, tvga->accel.tvga_pattern[y][0], tvga->accel.tvga_pattern[y][1], tvga->accel.tvga_pattern[y][2], tvga->accel.tvga_pattern[y][3], tvga->accel.tvga_pattern[y][4], tvga->accel.tvga_pattern[y][5], tvga->accel.tvga_pattern[y][6], tvga->accel.tvga_pattern[y][7]);
   39.95 -	}
   39.96 -	if (count == -1) pclog("Command %i %i\n", tvga->accel.command, TGUI_BITBLT);
   39.97 -	switch (tvga->accel.command)
   39.98 +	}*/
   39.99 +//	if (count == -1) pclog("Command %i %i %p\n", tvga->accel.command, TGUI_BITBLT, tvga);
  39.100 +        switch (tvga->accel.command)
  39.101  	{
  39.102  		case TGUI_BITBLT:
  39.103 -		if (count == -1) pclog("BITBLT src %i,%i dst %i,%i size %i,%i flags %04X\n", tvga->accel.src_x, tvga->accel.src_y, tvga->accel.dst_x, tvga->accel.dst_y, tvga->accel.size_x, tvga->accel.size_y, tvga->accel.flags);
  39.104 +//		if (count == -1) pclog("BITBLT src %i,%i dst %i,%i size %i,%i flags %04X\n", tvga->accel.src_x, tvga->accel.src_y, tvga->accel.dst_x, tvga->accel.dst_y, tvga->accel.size_x, tvga->accel.size_y, tvga->accel.flags);
  39.105  		if (count == -1)
  39.106  		{
  39.107  			tvga->accel.src = tvga->accel.src_old = tvga->accel.src_x + (tvga->accel.src_y * tvga->accel.pitch);
  39.108 @@ -571,17 +583,16 @@
  39.109  			case TGUI_SRCCPU:
  39.110  			if (count == -1)
  39.111  			{
  39.112 -//				pclog("Blit start\n");
  39.113 +//				pclog("Blit start  TGUI_SRCCPU\n");
  39.114  				if (svga->crtc[0x21] & 0x20)
  39.115 -				{
  39.116 -					mem_removehandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear,    NULL);
  39.117 -					mem_sethandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, tvga_accel_write_fb_b, tvga_accel_write_fb_w, tvga_accel_write_fb_l,    NULL);
  39.118 -				}
  39.119 +                                        mem_mapping_set_handler(&tvga->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, tvga_accel_write_fb_b, tvga_accel_write_fb_w, tvga_accel_write_fb_l);
  39.120 +
  39.121  				if (tvga->accel.use_src)
  39.122                                          return;
  39.123  			}
  39.124  			else
  39.125  			     count >>= 3;
  39.126 +//			pclog("TGUI_SRCCPU\n");
  39.127  			while (count)
  39.128  			{
  39.129  				if (tvga->accel.bpp == 0)
  39.130 @@ -628,8 +639,7 @@
  39.131  						if (svga->crtc[0x21] & 0x20)
  39.132  						{
  39.133  //							pclog("Blit end\n");
  39.134 -							mem_removehandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, tvga_accel_write_fb_b, tvga_accel_write_fb_w, tvga_accel_write_fb_l,    NULL);
  39.135 -							mem_sethandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear,    NULL);
  39.136 +                                                        mem_mapping_set_handler(&tvga->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear);
  39.137  						}
  39.138  						return;
  39.139  					}
  39.140 @@ -643,12 +653,11 @@
  39.141  			case TGUI_SRCMONO | TGUI_SRCCPU:
  39.142  			if (count == -1)
  39.143  			{
  39.144 -//				pclog("Blit start\n");
  39.145 +//				pclog("Blit start  TGUI_SRCMONO | TGUI_SRCCPU\n");
  39.146  				if (svga->crtc[0x21] & 0x20)
  39.147 -				{
  39.148 -					mem_removehandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear,    NULL);
  39.149 -					mem_sethandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, tvga_accel_write_fb_b, tvga_accel_write_fb_w, tvga_accel_write_fb_l,    NULL);
  39.150 -				}
  39.151 +                                        mem_mapping_set_handler(&tvga->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, tvga_accel_write_fb_b, tvga_accel_write_fb_w, tvga_accel_write_fb_l);
  39.152 +
  39.153 +//                                pclog(" %i\n", tvga->accel.command);
  39.154  				if (tvga->accel.use_src)
  39.155                                          return;
  39.156  			}
  39.157 @@ -691,8 +700,7 @@
  39.158  						if (svga->crtc[0x21] & 0x20)
  39.159  						{
  39.160  //							pclog("Blit end\n");
  39.161 -							mem_removehandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, tvga_accel_write_fb_b, tvga_accel_write_fb_w, tvga_accel_write_fb_l,    NULL);
  39.162 -							mem_sethandler(tvga->linear_base, tvga->linear_size, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear,    NULL);
  39.163 +                                                        mem_mapping_set_handler(&tvga->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear);
  39.164  						}
  39.165  						return;
  39.166  					}
  39.167 @@ -748,7 +756,7 @@
  39.168  void tvga_accel_write(uint32_t addr, uint8_t val, void *p)
  39.169  {
  39.170          tvga_t *tvga = (tvga_t *)p;
  39.171 -	pclog("tvga_accel_write : %08X %02X  %04X(%08X):%08X %02X\n", addr, val, CS,cs,pc, opcode);
  39.172 +//	pclog("tvga_accel_write : %08X %02X  %04X(%08X):%08X %02X\n", addr, val, CS,cs,pc, opcode);
  39.173  	if ((addr & ~0xff) != 0xbff00)
  39.174  		return;
  39.175  	switch (addr & 0xff)
  39.176 @@ -875,7 +883,7 @@
  39.177  void tvga_accel_write_w(uint32_t addr, uint16_t val, void *p)
  39.178  {
  39.179          tvga_t *tvga = (tvga_t *)p;
  39.180 -	pclog("tvga_accel_write_w %08X %04X\n", addr, val);
  39.181 +//	pclog("tvga_accel_write_w %08X %04X\n", addr, val);
  39.182  	tvga_accel_write(addr, val, tvga);
  39.183  	tvga_accel_write(addr + 1, val >> 8, tvga);
  39.184  }
  39.185 @@ -883,7 +891,7 @@
  39.186  void tvga_accel_write_l(uint32_t addr, uint32_t val, void *p)
  39.187  {
  39.188          tvga_t *tvga = (tvga_t *)p;
  39.189 -	pclog("tvga_accel_write_l %08X %08X\n", addr, val);
  39.190 +//	pclog("tvga_accel_write_l %08X %08X\n", addr, val);
  39.191  	tvga_accel_write(addr, val, tvga);
  39.192  	tvga_accel_write(addr + 1, val >> 8, tvga);
  39.193  	tvga_accel_write(addr + 2, val >> 16, tvga);
  39.194 @@ -989,34 +997,37 @@
  39.195  uint16_t tvga_accel_read_w(uint32_t addr, void *p)
  39.196  {
  39.197          tvga_t *tvga = (tvga_t *)p;
  39.198 -	pclog("tvga_accel_read_w %08X\n", addr);
  39.199 +//	pclog("tvga_accel_read_w %08X\n", addr);
  39.200  	return tvga_accel_read(addr, tvga) | (tvga_accel_read(addr + 1, tvga) << 8);
  39.201  }
  39.202  
  39.203  uint32_t tvga_accel_read_l(uint32_t addr, void *p)
  39.204  {
  39.205          tvga_t *tvga = (tvga_t *)p;
  39.206 -	pclog("tvga_accel_read_l %08X\n", addr);
  39.207 +//	pclog("tvga_accel_read_l %08X\n", addr);
  39.208  	return tvga_accel_read_w(addr, tvga) | (tvga_accel_read_w(addr + 2, tvga) << 16);
  39.209  }
  39.210  
  39.211  void tvga_accel_write_fb_b(uint32_t addr, uint8_t val, void *p)
  39.212  {
  39.213 -        tvga_t *tvga = (tvga_t *)p;
  39.214 +        svga_t *svga = (svga_t *)p;
  39.215 +        tvga_t *tvga = (tvga_t *)svga->p;
  39.216  //	pclog("tvga_accel_write_fb_b %08X %02X\n", addr, val);
  39.217  	tvga_accel_command(8, val << 24, tvga);
  39.218  }
  39.219  
  39.220  void tvga_accel_write_fb_w(uint32_t addr, uint16_t val, void *p)
  39.221  {
  39.222 -        tvga_t *tvga = (tvga_t *)p;
  39.223 +        svga_t *svga = (svga_t *)p;
  39.224 +        tvga_t *tvga = (tvga_t *)svga->p;
  39.225  //	pclog("tvga_accel_write_fb_w %08X %04X\n", addr, val);
  39.226  	tvga_accel_command(16, (((val & 0xff00) >> 8) | ((val & 0x00ff) << 8)) << 16, tvga);
  39.227  }
  39.228  
  39.229  void tvga_accel_write_fb_l(uint32_t addr, uint32_t val, void *p)
  39.230  {
  39.231 -        tvga_t *tvga = (tvga_t *)p;
  39.232 +        svga_t *svga = (svga_t *)p;
  39.233 +        tvga_t *tvga = (tvga_t *)svga->p;
  39.234  //	pclog("tvga_accel_write_fb_l %08X %08X\n", addr, val);
  39.235  	tvga_accel_command(32, ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24), tvga);
  39.236  }
    40.1 --- a/src/vid_unk_ramdac.c	Sun Oct 13 16:33:43 2013 +0100
    40.2 +++ b/src/vid_unk_ramdac.c	Sat Oct 19 17:06:55 2013 +0100
    40.3 @@ -2,6 +2,7 @@
    40.4    It is possibly a Sierra 1502x
    40.5    It's addressed by the TLIVESA1 driver for ET4000*/
    40.6  #include "ibm.h"
    40.7 +#include "mem.h"
    40.8  #include "video.h"
    40.9  #include "vid_svga.h"
   40.10  #include "vid_unk_ramdac.h"
    41.1 --- a/src/vid_vga.c	Sun Oct 13 16:33:43 2013 +0100
    41.2 +++ b/src/vid_vga.c	Sat Oct 19 17:06:55 2013 +0100
    41.3 @@ -3,6 +3,7 @@
    41.4  #include "ibm.h"
    41.5  #include "device.h"
    41.6  #include "io.h"
    41.7 +#include "mem.h"
    41.8  #include "video.h"
    41.9  #include "vid_svga.h"
   41.10  #include "vid_vga.h"
    42.1 --- a/src/vid_voodoo.c	Sun Oct 13 16:33:43 2013 +0100
    42.2 +++ b/src/vid_voodoo.c	Sat Oct 19 17:06:55 2013 +0100
    42.3 @@ -8,6 +8,10 @@
    42.4  
    42.5  static struct voodoo
    42.6  {
    42.7 +        mem_mapping_t mmio_mapping;
    42.8 +        mem_mapping_t   fb_mapping;
    42.9 +        mem_mapping_t  tex_mapping;
   42.10 +        
   42.11          int pci_enable;
   42.12  
   42.13          uint32_t color0, color1;
   42.14 @@ -669,18 +673,20 @@
   42.15  
   42.16  static void voodoo_recalcmapping()
   42.17  {
   42.18 -        mem_removehandler(0x00000000, 0xffffffff, NULL, NULL, voodoo_readl, NULL, NULL, voodoo_writel, NULL);
   42.19 -        mem_removehandler(0x00000000, 0xffffffff, NULL, voodoo_fb_readw, voodoo_fb_readl, NULL, voodoo_fb_writew, voodoo_fb_writel, NULL);
   42.20 -        mem_removehandler(0x00000000, 0xffffffff, NULL, NULL, NULL, NULL, voodoo_tex_writew, voodoo_tex_writel, NULL);
   42.21          if (voodoo.pci_enable)
   42.22          {
   42.23                  pclog("voodoo_recalcmapping : memBaseAddr %08X\n", voodoo.memBaseAddr);
   42.24 -                mem_sethandler(voodoo.memBaseAddr,              0x003fffff, NULL, NULL, voodoo_readl, NULL, NULL, voodoo_writel, NULL);
   42.25 -                mem_sethandler(voodoo.memBaseAddr + 0x00400000, 0x003fffff, NULL, voodoo_fb_readw, voodoo_fb_readl, NULL, voodoo_fb_writew, voodoo_fb_writel, NULL);
   42.26 -                mem_sethandler(voodoo.memBaseAddr + 0x00800000, 0x007fffff, NULL, NULL, NULL, NULL, voodoo_tex_writew, voodoo_tex_writel, NULL);
   42.27 +                mem_mapping_set_addr(&voodoo.mmio_mapping, voodoo.memBaseAddr,              0x00400000);
   42.28 +                mem_mapping_set_addr(&voodoo.fb_mapping,   voodoo.memBaseAddr + 0x00400000, 0x00400000);
   42.29 +                mem_mapping_set_addr(&voodoo.tex_mapping,  voodoo.memBaseAddr + 0x00800000, 0x00800000);
   42.30          }
   42.31          else
   42.32 +        {
   42.33                  pclog("voodoo_recalcmapping : disabled\n");
   42.34 +                mem_mapping_disable(&voodoo.mmio_mapping);
   42.35 +                mem_mapping_disable(&voodoo.fb_mapping);
   42.36 +                mem_mapping_disable(&voodoo.tex_mapping);
   42.37 +        }
   42.38  }
   42.39  
   42.40  uint8_t voodoo_pci_read(int func, int addr, void *priv)
   42.41 @@ -727,6 +733,11 @@
   42.42          return;
   42.43          voodoo_make_dither();
   42.44          pci_add(voodoo_pci_read, voodoo_pci_write, NULL);
   42.45 +
   42.46 +        mem_mapping_add(&voodoo.mmio_mapping, 0, 0, NULL, NULL,            voodoo_readl,    NULL,       NULL,              voodoo_writel,     NULL);
   42.47 +        mem_mapping_add(&voodoo.fb_mapping,   0, 0, NULL, voodoo_fb_readw, voodoo_fb_readl, NULL,       voodoo_fb_writew,  voodoo_fb_writel,  NULL);
   42.48 +        mem_mapping_add(&voodoo.tex_mapping,  0, 0, NULL, NULL,            NULL,            NULL,       voodoo_tex_writew, voodoo_tex_writel, NULL);
   42.49 +
   42.50          voodoo.fb_mem = malloc(2 * 1024 * 1024);
   42.51          voodoo.tex_mem = malloc(2 * 1024 * 1024);        
   42.52  }
    43.1 --- a/src/video.c	Sun Oct 13 16:33:43 2013 +0100
    43.2 +++ b/src/video.c	Sat Oct 19 17:06:55 2013 +0100
    43.3 @@ -3,6 +3,7 @@
    43.4  #include <math.h>
    43.5  #include "ibm.h"
    43.6  #include "device.h"
    43.7 +#include "mem.h"
    43.8  #include "video.h"
    43.9  #include "vid_svga.h"
   43.10  #include "io.h"