A dynamic recompiler block's validity is now separate from its starting code address, should fix most of the known recompiler fatals;

The CD-ROM buffer is now dynamically malloc'd;
Did a lot of bugfixing in cdrom.c and scsi_disk.c, Debian 8's modprobe aha1542 and the NT 3.10.404.1 Trantor 310b driver now work;
Fixed the IDE IRQ/MIRQ mess and ATAPI DMA transfer length;
Fixed the operation of mmutranslate() a bit;
Commented out several instances of excess logging;
Applied the mainline PCem commit prefetch commit;
Readded missing Sound Blaster DSP MIDI behavior and gave it the correct MPU struct;
All non-IBM 486 machines now correctly have the VLB flag set.
This commit is contained in:
OBattler
2017-10-16 06:19:18 +02:00
parent 89a98e34fd
commit ed865610e9
23 changed files with 456 additions and 402 deletions

View File

@@ -1,4 +1,5 @@
#include <inttypes.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
@@ -252,11 +253,11 @@ uint32_t rep_count_w = 0;
} \
if (name == 0) \
{ \
/*pclog("EMU8K READ %04X-%02X(%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice, emu8k->cur_voice,ret);*/ \
/*emu8k_log("EMU8K READ %04X-%02X(%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice, emu8k->cur_voice,ret);*/ \
} \
else \
{ \
pclog("EMU8K READ %s(%d) (%d): %04X\n",name, (addr&0x2), emu8k->cur_voice, ret); \
emu8k_log("EMU8K READ %s(%d) (%d): %04X\n",name, (addr&0x2), emu8k->cur_voice, ret); \
}\
}
# define WRITE16(addr, var, val) WRITE16_SWITCH(addr, var, val) \
@@ -276,11 +277,11 @@ uint32_t rep_count_w = 0;
} \
if (name == 0) \
{ \
/*pclog("EMU8K WRITE %04X-%02X(%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice,emu8k->cur_voice, val);*/ \
/*emu8k_log("EMU8K WRITE %04X-%02X(%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice,emu8k->cur_voice, val);*/ \
} \
else \
{ \
pclog("EMU8K WRITE %s(%d) (%d): %04X\n",name, (addr&0x2), emu8k->cur_voice,val); \
emu8k_log("EMU8K WRITE %s(%d) (%d): %04X\n",name, (addr&0x2), emu8k->cur_voice,val); \
}\
}
@@ -290,6 +291,24 @@ uint32_t rep_count_w = 0;
#endif //EMU8K_DEBUG_REGISTERS
#ifdef ENABLE_EMU8K_LOG
int emu8k_do_log = ENABLE_EMU8K_LOG;
#endif
void emu8k_log(const char *format, ...)
{
#ifdef ENABLE_EMU8K_LOG
if (emu8k_do_log)
{
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
fflush(stdout);
}
#endif
}
static inline int16_t EMU8K_READ(emu8k_t *emu8k, uint32_t addr)
{
const register emu8k_mem_pointers_t addrmem = {{addr}};
@@ -360,7 +379,7 @@ uint16_t emu8k_inw(uint16_t addr, void *p)
#ifdef EMU8K_DEBUG_REGISTERS
if (addr == 0xE22)
{
pclog("EMU8K READ POINTER: %d\n",
emu8k_log("EMU8K READ POINTER: %d\n",
((0x80 | ((random_helper + 1) & 0x1F)) << 8) | (emu8k->cur_reg << 5) | emu8k->cur_voice);
}
else if ((addr&0xF00) == 0x600)
@@ -368,7 +387,7 @@ uint16_t emu8k_inw(uint16_t addr, void *p)
/* These are automatically reported by READ16 */
if (rep_count_r>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_r);
emu8k_log("EMU8K ...... for %d times\n", rep_count_r);
rep_count_r=0;
}
last_read=0;
@@ -378,7 +397,7 @@ uint16_t emu8k_inw(uint16_t addr, void *p)
/* These are automatically reported by READ16 */
if (rep_count_r>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_r);
emu8k_log("EMU8K ...... for %d times\n", rep_count_r);
rep_count_r=0;
}
last_read=0;
@@ -390,13 +409,13 @@ uint16_t emu8k_inw(uint16_t addr, void *p)
{
if (rep_count_r>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_r);
emu8k_log("EMU8K ...... for %d times\n", rep_count_r);
rep_count_r=0;
}
last_read=tmpz;
pclog("EMU8K READ RAM I/O or configuration or clock \n");
emu8k_log("EMU8K READ RAM I/O or configuration or clock \n");
}
//pclog("EMU8K READ %04X-%02X(%d/%d)\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice, emu8k->cur_reg, emu8k->cur_voice);
//emu8k_log("EMU8K READ %04X-%02X(%d/%d)\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice, emu8k->cur_reg, emu8k->cur_voice);
}
else if ((addr&0xF00) == 0xA00 && (emu8k->cur_reg == 2 || emu8k->cur_reg == 3))
{
@@ -405,13 +424,13 @@ uint16_t emu8k_inw(uint16_t addr, void *p)
{
if (rep_count_r>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_r);
emu8k_log("EMU8K ...... for %d times\n", rep_count_r);
rep_count_r=0;
}
last_read=tmpz;
pclog("EMU8K READ INIT \n");
emu8k_log("EMU8K READ INIT \n");
}
//pclog("EMU8K READ %04X-%02X(%d/%d)\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice, emu8k->cur_reg, emu8k->cur_voice);
//emu8k_log("EMU8K READ %04X-%02X(%d/%d)\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice, emu8k->cur_reg, emu8k->cur_voice);
}
else
{
@@ -463,15 +482,15 @@ uint16_t emu8k_inw(uint16_t addr, void *p)
}
if (rep_count_r>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_r);
emu8k_log("EMU8K ...... for %d times\n", rep_count_r);
}
if (name == 0)
{
pclog("EMU8K READ %04X-%02X(%d/%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice, emu8k->cur_reg, emu8k->cur_voice,val);
emu8k_log("EMU8K READ %04X-%02X(%d/%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice, emu8k->cur_reg, emu8k->cur_voice,val);
}
else
{
pclog("EMU8K READ %s (%d): %04X\n",name,emu8k->cur_voice, val);
emu8k_log("EMU8K READ %s (%d): %04X\n",name,emu8k->cur_voice, val);
}
rep_count_r=0;
@@ -716,7 +735,7 @@ uint16_t emu8k_inw(uint16_t addr, void *p)
random_helper = (random_helper + 1) & 0x1F;
return ((0x80 | random_helper) << 8) | (emu8k->cur_reg << 5) | emu8k->cur_voice;
}
pclog("EMU8K READ : Unknown register read: %04X-%02X(%d/%d) \n", addr, (emu8k->cur_reg << 5) | emu8k->cur_voice, emu8k->cur_reg, emu8k->cur_voice);
emu8k_log("EMU8K READ : Unknown register read: %04X-%02X(%d/%d) \n", addr, (emu8k->cur_reg << 5) | emu8k->cur_voice, emu8k->cur_reg, emu8k->cur_voice);
return 0xffff;
}
@@ -731,14 +750,14 @@ void emu8k_outw(uint16_t addr, uint16_t val, void *p)
#ifdef EMU8K_DEBUG_REGISTERS
if (addr == 0xE22)
{
//pclog("EMU8K WRITE POINTER: %d\n", val);
//emu8k_log("EMU8K WRITE POINTER: %d\n", val);
}
else if ((addr&0xF00) == 0x600)
{
/* These are automatically reported by WRITE16 */
if (rep_count_w>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_w);
emu8k_log("EMU8K ...... for %d times\n", rep_count_w);
rep_count_w=0;
}
last_write=0;
@@ -748,7 +767,7 @@ void emu8k_outw(uint16_t addr, uint16_t val, void *p)
/* These are automatically reported by WRITE16 */
if (rep_count_w>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_w);
emu8k_log("EMU8K ...... for %d times\n", rep_count_w);
rep_count_w=0;
}
last_write=0;
@@ -760,13 +779,13 @@ void emu8k_outw(uint16_t addr, uint16_t val, void *p)
{
if (rep_count_w>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_w);
emu8k_log("EMU8K ...... for %d times\n", rep_count_w);
rep_count_w=0;
}
last_write=tmpz;
pclog("EMU8K WRITE RAM I/O or configuration \n");
emu8k_log("EMU8K WRITE RAM I/O or configuration \n");
}
//pclog("EMU8K WRITE %04X-%02X(%d/%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice,emu8k->cur_reg,emu8k->cur_voice, val);
//emu8k_log("EMU8K WRITE %04X-%02X(%d/%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice,emu8k->cur_reg,emu8k->cur_voice, val);
}
else if ((addr&0xF00) == 0xA00 && (emu8k->cur_reg == 2 || emu8k->cur_reg == 3))
{
@@ -775,13 +794,13 @@ void emu8k_outw(uint16_t addr, uint16_t val, void *p)
{
if (rep_count_w>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_w);
emu8k_log("EMU8K ...... for %d times\n", rep_count_w);
rep_count_w=0;
}
last_write=tmpz;
pclog("EMU8K WRITE INIT \n");
emu8k_log("EMU8K WRITE INIT \n");
}
//pclog("EMU8K WRITE %04X-%02X(%d/%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice,emu8k->cur_reg,emu8k->cur_voice, val);
//emu8k_log("EMU8K WRITE %04X-%02X(%d/%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice,emu8k->cur_reg,emu8k->cur_voice, val);
}
else if (addr != 0xE22)
{
@@ -805,15 +824,15 @@ void emu8k_outw(uint16_t addr, uint16_t val, void *p)
if (rep_count_w>1)
{
pclog("EMU8K ...... for %d times\n", rep_count_w);
emu8k_log("EMU8K ...... for %d times\n", rep_count_w);
}
if (name == 0)
{
pclog("EMU8K WRITE %04X-%02X(%d/%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice,emu8k->cur_reg,emu8k->cur_voice, val);
emu8k_log("EMU8K WRITE %04X-%02X(%d/%d): %04X\n",addr,(emu8k->cur_reg)<<5|emu8k->cur_voice,emu8k->cur_reg,emu8k->cur_voice, val);
}
else
{
pclog("EMU8K WRITE %s (%d): %04X\n",name,emu8k->cur_voice, val);
emu8k_log("EMU8K WRITE %s (%d): %04X\n",name,emu8k->cur_voice, val);
}
rep_count_w=0;
@@ -1481,7 +1500,7 @@ void emu8k_outw(uint16_t addr, uint16_t val, void *p)
emu8k->cur_reg = ((val >> 5) & 7);
return;
}
pclog("EMU8K WRITE: Unknown register write: %04X-%02X(%d/%d): %04X \n", addr, (emu8k->cur_reg)<<5|emu8k->cur_voice,
emu8k_log("EMU8K WRITE: Unknown register write: %04X-%02X(%d/%d): %04X \n", addr, (emu8k->cur_reg)<<5|emu8k->cur_voice,
emu8k->cur_reg,emu8k->cur_voice, val);
}
@@ -2072,10 +2091,10 @@ I've recopilated these sentences to get an idea of how to loop
emu_voice->cpf_curr_frac_addr = emu_voice->addr.fract_address;
//if ( emu_voice->cvcf_curr_volume != old_vol[c]) {
// pclog("EMUVOL (%d):%d\n", c, emu_voice->cvcf_curr_volume);
// emu8k_log("EMUVOL (%d):%d\n", c, emu_voice->cvcf_curr_volume);
// old_vol[c]=emu_voice->cvcf_curr_volume;
//}
//pclog("EMUFILT :%d\n", emu_voice->cvcf_curr_filt_ctoff);
//emu8k_log("EMUFILT :%d\n", emu_voice->cvcf_curr_filt_ctoff);
}