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
