PCem

changeset 17:5fabef03e81b

Improvements to AWE32 driver compatibilty. Increased AWE32 RAM from 512kb to 4mb.
author TomW
date Sat Aug 03 21:04:33 2013 +0100
parents 18fcddb6b75c
children b23d087f2489
files src/sound_emu8k.c src/sound_emu8k.h
diffstat 2 files changed, 54 insertions(+), 18 deletions(-) [+]
line diff
     1.1 --- a/src/sound_emu8k.c	Sat Aug 03 20:40:56 2013 +0100
     1.2 +++ b/src/sound_emu8k.c	Sat Aug 03 21:04:33 2013 +0100
     1.3 @@ -45,9 +45,9 @@
     1.4          addr &= 0xffffff;
     1.5          if (addr < 0x80000)
     1.6                  return emu8k->rom[addr];
     1.7 -        if (addr < 0x200000 || addr >= 0x240000)
     1.8 +        if (addr < 0x200000 || addr >= 0x400000)
     1.9                  return 0;
    1.10 -        return emu8k->ram[addr & 0x3ffff];
    1.11 +        return emu8k->ram[addr & 0x1fffff];
    1.12  }
    1.13  
    1.14  static inline int16_t EMU8K_READ_INTERP(emu8k_t *emu8k, uint32_t addr)
    1.15 @@ -60,15 +60,18 @@
    1.16  static inline void EMU8K_WRITE(emu8k_t *emu8k, uint32_t addr, uint16_t val)
    1.17  {
    1.18          addr &= 0xffffff;
    1.19 -        if (addr >= 0x200000 && addr <= 0x240000)
    1.20 -                emu8k->ram[addr & 0x3ffff] = val;
    1.21 +        if (addr >= 0x200000 && addr < 0x400000)
    1.22 +                emu8k->ram[addr & 0x1fffff] = val;
    1.23  }
    1.24 +static int ff = 0;
    1.25 +static int voice_count = 0;
    1.26  
    1.27  uint16_t emu8k_inw(uint32_t addr, void *p)
    1.28  {
    1.29          emu8k_t *emu8k = (emu8k_t *)p;
    1.30          uint16_t ret;
    1.31  /*        pclog("emu8k_inw %04X  reg=%i voice=%i\n", addr, emu8k->cur_reg, emu8k->cur_voice);*/
    1.32 +
    1.33          addr -= 0x220;
    1.34          switch (addr & 0xc02)
    1.35          {
    1.36 @@ -134,16 +137,17 @@
    1.37                                  {
    1.38                                          uint16_t val = emu8k->smld_buffer;
    1.39                                          emu8k->smld_buffer = EMU8K_READ(emu8k, emu8k->smalr);
    1.40 +/*                                        pclog("emu8k_SMLR in %04X (%04X) %08X\n", val, emu8k->smld_buffer, emu8k->smalr);*/
    1.41                                          emu8k->smalr++;
    1.42                                          return val;
    1.43                                  }
    1.44 -
    1.45 +                                /*The EMU8000 PGM describes the return values of these registers as 'a VLSI error'*/
    1.46                                  case 29: /*Configuration Word 1*/
    1.47 -                                return emu8k->hwcf1;
    1.48 +                                return (emu8k->hwcf1 & 0xfe) | (emu8k->hwcf3 & 0x01);
    1.49                                  case 30: /*Configuration Word 2*/
    1.50 -                                return emu8k->hwcf2 | 3;
    1.51 +                                return ((emu8k->hwcf2 >> 4) & 0x0e) | (emu8k->hwcf1 & 0x01) | ((emu8k->hwcf3 & 0x02) ? 0x10 : 0) | ((emu8k->hwcf3 & 0x04) ? 0x40 : 0) | ((emu8k->hwcf3 & 0x08) ? 0x20 : 0) | ((emu8k->hwcf3 & 0x10) ? 0x80 : 0);
    1.52                                  case 31: /*Configuration Word 3*/
    1.53 -                                return emu8k->hwcf3;
    1.54 +                                return emu8k->hwcf2 & 0x1f;
    1.55                          }
    1.56                          break;
    1.57  
    1.58 @@ -173,10 +177,12 @@
    1.59                          switch (emu8k->cur_voice)
    1.60                          {
    1.61                                  case 20:
    1.62 -                                READ16(addr, emu8k->smalr);
    1.63 +                                READ16(addr, emu8k->smalr | ff);
    1.64 +                                ff ^= 0x80000000;
    1.65                                  return ret;
    1.66                                  case 21:
    1.67 -                                READ16(addr, emu8k->smarr);
    1.68 +                                READ16(addr, emu8k->smarr | ff);
    1.69 +                                ff ^= 0x80000000;
    1.70                                  return ret;
    1.71                                  case 22:
    1.72                                  READ16(addr, emu8k->smalw);
    1.73 @@ -189,6 +195,7 @@
    1.74                                  {
    1.75                                          uint16_t val = emu8k->smrd_buffer;
    1.76                                          emu8k->smrd_buffer = EMU8K_READ(emu8k, emu8k->smarr);
    1.77 +/*                                        pclog("emu8k_SMRR in %04X (%04X) %08X\n", val, emu8k->smrd_buffer, emu8k->smarr);*/
    1.78                                          emu8k->smarr++;
    1.79                                          return val;
    1.80                                  }
    1.81 @@ -232,12 +239,14 @@
    1.82                          return 0xffff;
    1.83                          
    1.84                          case 7: /*ID?*/
    1.85 -                        return 0xc;
    1.86 +                        return 0x1c | ((emu8k->id & 0x0002) ? 0xff02 : 0);
    1.87                  }
    1.88                  break;
    1.89                  case 0xc02: /*Status - I think!*/
    1.90 -                emu8k->c02_read ^= 0x1000;
    1.91 -                return emu8k->c02_read;
    1.92 +                voice_count = (voice_count + 1) & 0x1f;
    1.93 +/*                emu8k->c02_read ^= 0x1000;
    1.94 +                pclog("Read status %04X\n", 0x803f | (voice_count << 8));*/
    1.95 +                return 0x803f | (voice_count << 8);
    1.96          }
    1.97  /*        fatal("Bad EMU8K inw from %08X\n", addr);*/
    1.98          return 0xffff;
    1.99 @@ -248,6 +257,7 @@
   1.100          emu8k_t *emu8k = (emu8k_t *)p;
   1.101  
   1.102  /*        pclog("emu8k_outw : addr=%08X reg=%i voice=%i  val=%04X\n", addr, emu8k->cur_reg, emu8k->cur_voice, val);*/
   1.103 +//emu8k_outw : addr=00000A22 reg=3 voice=21  val=0265
   1.104          addr -= 0x220;
   1.105          switch (addr & 0xc02)
   1.106          {
   1.107 @@ -316,6 +326,9 @@
   1.108                                  
   1.109                                  case 26:
   1.110                                  EMU8K_WRITE(emu8k, emu8k->smalw, val);
   1.111 +/*                                pclog("emu8k_SMLW %04X %08X\n", val, emu8k->smalw);*/
   1.112 +/*                                if (val = 0xffff && emu8k->smalw == 0x200000)
   1.113 +                                        output = 3;*/
   1.114                                  emu8k->smalw++;
   1.115                                  break;
   1.116  
   1.117 @@ -399,6 +412,7 @@
   1.118  
   1.119                                  case 26:
   1.120                                  EMU8K_WRITE(emu8k, emu8k->smarw, val);
   1.121 +/*                                pclog("emu8k_SMRW %04X %08X\n", val, emu8k->smarw);*/
   1.122                                  emu8k->smarw++;
   1.123                                  break;
   1.124                          }
   1.125 @@ -456,6 +470,10 @@
   1.126                          emu8k->voice[emu8k->cur_voice].fm2frq2 = val;
   1.127                          emu8k->voice[emu8k->cur_voice].lfo2_fmmod = (val >> 8);
   1.128                          return;
   1.129 +
   1.130 +                        case 7: /*ID?*/
   1.131 +                        emu8k->id = val;
   1.132 +                        return;
   1.133                  }
   1.134                  break;
   1.135                  
   1.136 @@ -466,6 +484,21 @@
   1.137          }
   1.138  }
   1.139  
   1.140 +uint8_t emu8k_inb(uint32_t addr, void *p)
   1.141 +{
   1.142 +        if (addr & 1)
   1.143 +                return emu8k_inw(addr & ~1, p) >> 1;
   1.144 +        return emu8k_inw(addr, p) & 0xff;
   1.145 +}
   1.146 +
   1.147 +void emu8k_outb(uint32_t addr, uint8_t val, void *p)
   1.148 +{
   1.149 +        if (addr & 1)
   1.150 +                emu8k_outw(addr & ~1, val << 8, p);
   1.151 +        else
   1.152 +                emu8k_outw(addr, val, p);
   1.153 +}
   1.154 +
   1.155  void emu8k_poll(void *p)
   1.156  {
   1.157          emu8k_t *emu8k = (emu8k_t *)p;
   1.158 @@ -610,15 +643,15 @@
   1.159          if (!f)
   1.160                  fatal("ROMS/AWE32.RAW not found\n");
   1.161                  
   1.162 -        emu8k->ram = malloc(512 * 1024);
   1.163 +        emu8k->ram = malloc(4096 * 1024);
   1.164          emu8k->rom = malloc(1024 * 1024);        
   1.165          
   1.166          fread(emu8k->rom, 1024 * 1024, 1, f);
   1.167          fclose(f);
   1.168          
   1.169 -        io_sethandler(0x0620, 0x0004, NULL, emu8k_inw, NULL, NULL, emu8k_outw, NULL, emu8k);
   1.170 -        io_sethandler(0x0a20, 0x0004, NULL, emu8k_inw, NULL, NULL, emu8k_outw, NULL, emu8k);
   1.171 -        io_sethandler(0x0e20, 0x0004, NULL, emu8k_inw, NULL, NULL, emu8k_outw, NULL, emu8k);
   1.172 +        io_sethandler(0x0620, 0x0004, emu8k_inb, emu8k_inw, NULL, emu8k_outb, emu8k_outw, NULL, emu8k);
   1.173 +        io_sethandler(0x0a20, 0x0004, emu8k_inb, emu8k_inw, NULL, emu8k_outb, emu8k_outw, NULL, emu8k);
   1.174 +        io_sethandler(0x0e20, 0x0004, emu8k_inb, emu8k_inw, NULL, emu8k_outb, emu8k_outw, NULL, emu8k);
   1.175  
   1.176          timer_add(emu8k_poll, &emu8k->timer_count, TIMER_ALWAYS_ENABLED, emu8k);
   1.177                          
   1.178 @@ -663,6 +696,7 @@
   1.179          }
   1.180          
   1.181          emu8k->hwcf1 = 0x59;
   1.182 -        emu8k->hwcf2 = 0x03;
   1.183 +        emu8k->hwcf2 = 0x20;
   1.184 +        emu8k->hwcf3 = 0x04;
   1.185  }
   1.186  
     2.1 --- a/src/sound_emu8k.h	Sat Aug 03 20:40:56 2013 +0100
     2.2 +++ b/src/sound_emu8k.h	Sat Aug 03 21:04:33 2013 +0100
     2.3 @@ -67,6 +67,8 @@
     2.4          uint16_t wc;
     2.5          
     2.6          uint16_t c02_read;
     2.7 +
     2.8 +	uint16_t id;
     2.9          
    2.10          int16_t *ram, *rom;
    2.11