return;
cfg->col0h = 0x00; cfg->col0l = 0x5a;
cfg->col1h = 0x0f; cfg->col1l = 0xff;
- cfg->a1200 = (currprefs.chipset_mask & CSMASK_AGA) ? 1 : 0;
cfg->aga = (currprefs.chipset_mask & CSMASK_AGA) ? 1 : 0;
cfg->cd32 = currprefs.cs_cd32cd ? 1 : 0;
cfg->screenmode = currprefs.ntscmode;
do_put_mem_long(&cfg->max_chip, currprefs.chipmem_size);
do_put_mem_long(&cfg->mon_size, 0x800000);
cfg->ide = currprefs.cs_ide ? 1 : 0;
+ cfg->a1200 = currprefs.cs_ide == 1 ? 1 : 0; /* type of IDE interface, not Amiga model */
}
int hrtmon_load(void)
static void INT2(void)
{
- INTREQ(0x8000 | 0x0008);
+ INTREQ_f(0x8000 | 0x0008);
}
static int cdrom_command_cnt_out, cdrom_command_size_out;
{
int i;
char tmp[MAX_DPATH];
- char *hdcontrollers[] = { "uae", "ide0", "ide1" };
+ char *hdcontrollers[] = { "uae", "ide0", "ide1", "ide2", "ide3" };
for (i = 0; i < p->mountitems; i++) {
struct uaedev_config_info *uci = &p->mountconfig[i];
cfgfile_write (f, "gfx_filter_scanlines=%d\n", p->gfx_filter_scanlines);
cfgfile_write (f, "gfx_filter_scanlinelevel=%d\n", p->gfx_filter_scanlinelevel);
cfgfile_write (f, "gfx_filter_scanlineratio=%d\n", p->gfx_filter_scanlineratio);
+ cfgfile_write (f, "gfx_luminance=%d\n", p->gfx_luminance);
+ cfgfile_write (f, "gfx_contrast=%d\n", p->gfx_contrast);
+ cfgfile_write (f, "gfx_gamma=%d\n", p->gfx_gamma);
#endif
cfgfile_write (f, "immediate_blits=%s\n", p->immediate_blits ? "true" : "false");
|| cfgfile_intval (option, value, "gfx_filter_scanlines", &p->gfx_filter_scanlines, 1)
|| cfgfile_intval (option, value, "gfx_filter_scanlinelevel", &p->gfx_filter_scanlinelevel, 1)
|| cfgfile_intval (option, value, "gfx_filter_scanlineratio", &p->gfx_filter_scanlineratio, 1)
+ || cfgfile_intval (option, value, "gfx_luminance", &p->gfx_luminance, 1)
+ || cfgfile_intval (option, value, "gfx_contrast", &p->gfx_contrast, 1)
+ || cfgfile_intval (option, value, "gfx_gamma", &p->gfx_gamma, 1)
#endif
|| cfgfile_intval (option, value, "floppy0sound", &p->dfxclick[0], 1)
|| cfgfile_intval (option, value, "floppy1sound", &p->dfxclick[1], 1)
if (tmpp != 0) {
*tmpp++ = 0;
hdc = tmpp;
- if(!strcmp(hdc, "ide0"))
- hdcv = 1;
- if(!strcmp(hdc, "ide1"))
- hdcv = 2;
+ if(strlen(hdc) >= 4 && !memcmp(hdc, "ide", 3)) {
+ hdcv = hdc[3] - '0' + 1;
+ if (hdcv < 1 || hdcv > 4)
+ hdcv = 0;
+ }
if (secs > 0 || heads > 0 || reserved > 0)
hdcv = 0;
}
#endif
}
+extern struct color_entry colors_for_drawing;
+
void notice_new_xcolors (void)
{
int i;
docols(¤t_colors);
-/* docols(&colors_for_drawing);*/
+ docols(&colors_for_drawing);
for (i = 0; i < (MAXVPOS + 1) * 2; i++) {
docols(color_tables[0] + i);
docols(color_tables[1] + i);
doint ();
}
-static void INTREQ_f(uae_u32 data)
+void INTREQ_f(uae_u32 data)
{
INTREQ_0 (data);
serial_check_irq ();
pos += 16;
pos %= drv->tracklen;
}
- INTREQ (0x8000 | 0x1000);
+ INTREQ_f (0x8000 | 0x1000);
done = 1;
} else if (dskdmaen == 3) { /* TURBO write */
put_word (dskpt, 0);
dskpt += 2;
}
- INTREQ (0x8000 | 0x1000);
+ INTREQ_f (0x8000 | 0x1000);
done = 1;
}
char *enforcer_buf_ptr = enforcer_buf;
uaecptr bestpc,pospc,nextpc,temppc;
- if (enforcer_hit) return; /* our function itself generated a hit ;), avoid endless loop */
+ if (enforcer_hit)
+ return; /* our function itself generated a hit ;), avoid endless loop */
+ if (regs.vbr < 0x100 && addr >= 0x0c && addr < 0x78)
+ return;
+
enforcer_hit = 1;
- if (!(sysbase = get_long(4))) return;
- if (!(this_task = get_long(sysbase + 276))) return;
+ if (!(sysbase = get_long(4)))
+ goto end;
+ if (!(this_task = get_long(sysbase + 276)))
+ goto end;
task_name = get_long(this_task + 10); /* ln_Name */
native_task_name = amiga2native(task_name,100);
console_out(enforcer_buf);
write_log(enforcer_buf);
sleep_millis (5);
+ flashscreen = 30;
+end:
enforcer_hit = 0;
- flashscreen = 30;
}
uae_u32 REGPARAM2 chipmem_lget2 (uaecptr addr)
int data_multi;
uae_u8 multiple_mode;
uae_u8 status;
+ int irq_delay;
+ int num;
};
-static struct ide_hdf idedrive[2];
+static struct ide_hdf idedrive[4];
static int gayle_id_cnt;
static uae_u8 gayle_irq, gayle_intena;
static uae_u8 ide_select, ide_nsector, ide_sector, ide_lcyl, ide_hcyl, ide_devcon, ide_error, ide_feat;
-static int ide_drv;
+static uae_u8 ide_nsector2, ide_sector2, ide_lcyl2, ide_hcyl2, ide_feat2;
+static int ide_drv, ide2, ide_splitter;
+
+static struct ide_hdf *ide;
STATIC_INLINE pw(int offset, uae_u16 w)
{
- idedrive[ide_drv].secbuf[offset * 2 + 0] = (uae_u8)w;
- idedrive[ide_drv].secbuf[offset * 2 + 1] = w >> 8;
+ ide->secbuf[offset * 2 + 0] = (uae_u8)w;
+ ide->secbuf[offset * 2 + 1] = w >> 8;
}
static void ps(int offset, char *s, int max)
{
char c = ' ';
if (i < len)
c = s[i];
- idedrive[ide_drv].secbuf[offset ^ 1] = c;
+ ide->secbuf[offset ^ 1] = c;
offset++;
}
}
static void ide_interrupt(void)
{
+ ide->status |= IDE_STATUS_BSY;
+ ide->irq_delay = 2;
+}
+static void ide_interrupt_do(struct ide_hdf *ide)
+{
+ ide->status &= ~IDE_STATUS_BSY;
if (gayle_intena & GAYLE_IRQ_IDE) {
gayle_irq |= GAYLE_IRQ_IDE;
- INTREQ (0x8000 | 0x0008);
+ INTREQ_f (0x8000 | 0x0008);
}
}
+
static void ide_fail(void)
{
ide_error |= IDE_ERR_ABRT;
- if (ide_drv == 1 && idedrive[1].size == 0)
- idedrive[0].status |= IDE_STATUS_ERR;
- idedrive[ide_drv].status |= IDE_STATUS_ERR;
+ if (ide_drv == 1 && idedrive[ide2 + 1].size == 0)
+ idedrive[ide2].status |= IDE_STATUS_ERR;
+ ide->status |= IDE_STATUS_ERR;
ide_interrupt();
}
static void ide_data_ready(int blocks)
{
- struct ide_hdf *ide = &idedrive[ide_drv];
-
memset(ide->secbuf, 0, 512 * 256);
ide->data_offset = 0;
ide->status |= IDE_STATUS_DRQ;
static void ide_recalibrate(void)
{
- write_log("IDE%d recalibrate\n", ide_drv);
+ write_log("IDE%d recalibrate\n", ide->num);
ide_sector = 0;
ide_lcyl = ide_hcyl = 0;
ide_interrupt();
}
static void ide_identify_drive(void)
{
- struct ide_hdf *ide = &idedrive[ide_drv];
int totalsecs;
int v;
uae_u8 *buf = ide->secbuf;
ide_fail();
return;
}
+ if (IDE_LOG > 0)
+ write_log("IDE%d identify drive\n", ide->num);
ide_data_ready(1);
pw(0, (1 << 10) | (1 << 6) | (1 << 2) | (1 << 3));
pw(1, ide->cyls_def);
}
static void ide_initialize_drive_parameters(void)
{
- struct ide_hdf *ide = &idedrive[ide_drv];
-
if (ide->size) {
ide->secspertrack = ide_nsector == 0 ? 256 : ide_nsector;
ide->heads = (ide_select & 15) + 1;
}
} else {
ide_error |= IDE_ERR_ABRT;
- idedrive[ide_drv].status |= IDE_STATUS_ERR;
+ ide->status |= IDE_STATUS_ERR;
}
write_log("IDE%d initialize drive parameters, CYL=%d,SPT=%d,HEAD=%d\n",
- ide_drv, ide->cyls, ide->secspertrack, ide->heads);
+ ide->num, ide->cyls, ide->secspertrack, ide->heads);
ide_interrupt();
}
static void ide_set_multiple_mode(void)
{
- write_log("IDE%d drive multiple mode = %d\n", ide_drv, ide_nsector);
- idedrive[ide_drv].multiple_mode = ide_nsector;
+ write_log("IDE%d drive multiple mode = %d\n", ide->num, ide_nsector);
+ ide->multiple_mode = ide_nsector;
ide_interrupt();
}
static void ide_set_features(void)
{
- write_log("IDE%d set features %02.2X (%02.2X)\n", ide_drv, ide_feat, ide_nsector);
+ write_log("IDE%d set features %02.2X (%02.2X)\n", ide->num, ide_feat, ide_nsector);
ide_fail();
}
static void ide_read_sectors(int multi)
{
int cyl, head, sec, nsec, lba;
- struct ide_hdf *ide = &idedrive[ide_drv];
if (multi && ide->multiple_mode == 0) {
ide_fail();
}
gui_hd_led (1);
nsec = ide_nsector == 0 ? 256 : ide_nsector;
- ide_data_ready(nsec);
get_lbachs(ide, &lba, &cyl, &head, &sec);
if (IDE_LOG > 0)
- write_log("IDE read offset=%d, sectors=%d\n", lba, nsec);
+ write_log("IDE%d read offset=%d, sectors=%d (%d)\n", ide->num, lba, nsec, ide->multiple_mode);
if (multi && ide->multiple_mode > nsec)
nsec = ide->multiple_mode;
if (lba * 512 >= ide->size) {
}
if (nsec * 512 > ide->size - lba * 512)
nsec = (ide->size - lba * 512) / 512;
+ ide_data_ready(nsec);
hdf_read (&ide->hfd, ide->secbuf, lba * 512, nsec * 512);
put_lbachs(ide, lba, cyl, head, sec, nsec);
ide->data_multi = multi ? ide->multiple_mode : 1;
static void ide_write_sectors(int multi)
{
int cyl, head, sec, nsec, lba;
- struct ide_hdf *ide = &idedrive[ide_drv];
if (multi && ide->multiple_mode == 0) {
ide_fail();
return;
}
- gui_hd_led (1);
+ gui_hd_led (2);
nsec = ide_nsector == 0 ? 256 : ide_nsector;
get_lbachs(ide, &lba, &cyl, &head, &sec);
if (lba * 512 >= ide->size) {
ide_fail();
return;
}
+ if (IDE_LOG > 0)
+ write_log("IDE%d write offset=%d, sectors=%d (%d)\n", ide->num, lba, nsec, ide->multiple_mode);
if (nsec * 512 > ide->size - lba * 512)
nsec = (ide->size - lba * 512) / 512;
ide_data_ready(nsec);
static void ide_do_command(uae_u8 cmd)
{
if (IDE_LOG > 1)
- write_log("**** IDE command %02.2X\n", cmd);
- idedrive[ide_drv].status &= ~(IDE_STATUS_DRDY | IDE_STATUS_DRQ | IDE_STATUS_ERR);
+ write_log("**** IDE%d command %02.2X\n", ide->num, cmd);
+ ide->status &= ~(IDE_STATUS_DRDY | IDE_STATUS_DRQ | IDE_STATUS_ERR);
ide_error = 0;
if (cmd == 0x10) { /* recalibrate */
}
}
-static uae_u8 ide_get_data(void)
+static uae_u16 ide_get_data(void)
{
- struct ide_hdf *ide = &idedrive[ide_drv];
- uae_u8 v;
-
- v = ide->secbuf[ide->data_offset];
- ide->data_offset++;
- ide->data_size--;
+ int irq = 0;
+ uae_u16 v;
+
+ if (ide->data_size == 0) {
+ if (IDE_LOG > 0)
+ write_log("IDE%d DATA read without DRQ!?\n", ide->num);
+ if (ide->size == 0)
+ return 0xffff;
+ return 0;
+ }
+ v = ide->secbuf[ide->data_offset + 1] | (ide->secbuf[ide->data_offset + 0] << 8);
+ ide->data_offset+=2;
+ ide->data_size-=2;
if (((ide->data_offset % 512) == 0) && ((ide->data_offset / 512) % ide->data_multi) == 0)
- ide_interrupt();
- if (ide->data_size == 0)
+ irq = 1;
+ if (ide->data_size == 0) {
+ irq = 1;
ide->status &= ~IDE_STATUS_DRQ;
+ }
+ if (irq)
+ ide_interrupt();
return v;
}
-static void ide_put_data(uae_u8 v)
+static void ide_put_data(uae_u16 v)
{
- struct ide_hdf *ide = &idedrive[ide_drv];
- if (ide->data_size == 0)
+ int irq = 0;
+
+ if (ide->data_size == 0) {
+ if (IDE_LOG > 0)
+ write_log("IDE%d DATA write without DRQ!?\n", ide->num);
return;
- ide->secbuf[ide->data_offset] = v;
- ide->data_offset++;
- ide->data_size--;
- if (((ide->data_offset % 512) == 0) && ((ide->data_offset / 512) % ide->data_multi) == 0)
- ide_interrupt();
+ }
+ ide->secbuf[ide->data_offset + 1] = v & 0xff;
+ ide->secbuf[ide->data_offset + 0] = v >> 8;
+ ide->data_offset+=2;
+ ide->data_size-=2;
+ if (((ide->data_offset % 512) == 0) && ((ide->data_offset / 512) % ide->data_multi) == 0) {
+ if (IDE_LOG > 0)
+ write_log("IDE%d write interrupt, %d total bytes transferred so far\n", ide->num, ide->data_offset);
+ irq = 1;
+ }
if (ide->data_size == 0) {
int lba, cyl, head, sec, nsec;
ide->status &= ~IDE_STATUS_DRQ;
nsec = ide->data_offset / 512;
get_lbachs(ide, &lba, &cyl, &head, &sec);
if (IDE_LOG > 0)
- write_log("block=%d, %d bytes written\n", lba, ide->data_offset);
+ write_log("IDE%d write finished, %d bytes (%d) written\n", ide->num, ide->data_offset, ide->data_offset / 512);
hdf_write(&ide->hfd, ide->secbuf, lba * 512, ide->data_offset);
put_lbachs(ide, lba, cyl, head, sec, nsec);
+ irq = 1;
+ }
+ if (irq)
+ ide_interrupt();
+}
+
+static int get_ide_reg(uaecptr addr)
+{
+ uaecptr a = addr;
+ addr &= 0xffff;
+ if (addr >= 0x3020 && addr <= 0x3021 && currprefs.cs_ide == 2)
+ return -1;
+ addr &= ~0x2020;
+ addr >>= 2;
+ ide2 = 0;
+ if (addr & 0x400) {
+ if (ide_splitter ) {
+ ide2 = 2;
+ addr &= ~0x400;
+ }
}
+ ide = &idedrive[ide_drv + ide2];
+ return addr;
}
static uae_u32 ide_read (uaecptr addr)
{
+ int ide_reg;
uae_u8 v = 0;
+
addr &= 0xffff;
if (IDE_LOG > 1 && addr != 0x2000 && addr != 0x2001 && addr != 0x2020 && addr != 0x2021 && addr != GAYLE_IRQ_1200)
write_log ("IDE_READ %08.8X PC=%X\n", addr, M68K_GETPC);
return 0;
return 0xff;
}
- if (addr >= 0x3020) {
- if (addr == GAYLE_IRQ_4000) {
- if (currprefs.cs_ide == 2) {
- uae_u8 v = gayle_irq;
- gayle_irq = 0;
- return v;
- }
- return 0;
- } else if (addr == GAYLE_IRQ_1200) {
+ if (addr >= GAYLE_IRQ_4000 && addr <= GAYLE_IRQ_4000 + 1 && currprefs.cs_ide == 2) {
+ uae_u8 v = gayle_irq;
+ gayle_irq = 0;
+ return v;
+ }
+ if (addr >= 0x4000) {
+ if (addr == GAYLE_IRQ_1200) {
if (currprefs.cs_ide == 1)
return gayle_irq;
return 0;
}
return 0;
}
- if (currprefs.cs_ide == 2 && (addr & 0x2020) == 0x2020)
- addr &= ~0x20;
- addr &= ~0x2000;
- addr >>= 2;
+ ide_reg = get_ide_reg(addr);
/* Emulated "ide hack". Prevents long KS boot delay if no drives installed */
- if (idedrive[0].size == 0)
+ if (idedrive[0].size == 0 && idedrive[2].size == 0)
return 0xff;
- switch (addr)
+ switch (ide_reg)
{
case IDE_DRVADDR:
v = 0;
break;
case IDE_DATA:
- v = ide_get_data();
break;
case IDE_ERROR:
v = ide_error;
break;
case IDE_NSECTOR:
- v = ide_nsector;
+ if (ide_devcon & 0x80)
+ v = ide_nsector2;
+ else
+ v = ide_nsector;
break;
case IDE_SECTOR:
- v = ide_sector;
+ if (ide_devcon & 0x80)
+ v = ide_sector2;
+ else
+ v = ide_sector;
break;
case IDE_LCYL:
- v = ide_lcyl;
+ if (ide_devcon & 0x80)
+ v = ide_lcyl2;
+ else
+ v = ide_lcyl;
break;
case IDE_HCYL:
- v = ide_hcyl;
+ if (ide_devcon & 0x80)
+ v = ide_hcyl2;
+ else
+ v = ide_hcyl;
break;
case IDE_SELECT:
v = ide_select;
break;
- case IDE_DEVCON:
+ case IDE_DEVCON:
+ v = ide_devcon;
+ break;
case IDE_STATUS:
- if (idedrive[ide_drv].size == 0) {
+ if (ide->size == 0) {
v = 0;
if (ide_error)
v |= IDE_STATUS_ERR;
} else {
- v = idedrive[ide_drv].status;
+ v = ide->status;
v |= IDE_STATUS_DRDY;
}
break;
}
- if (IDE_LOG > 2 && addr > 0)
- write_log("IDE register %d->%02.2X\n", addr, (uae_u32)v & 0xff);
+ if (IDE_LOG > 2 && ide_reg > 0)
+ write_log("IDE%d register %d->%02.2X\n", ide->num, ide_reg, (uae_u32)v & 0xff);
return v;
}
static void ide_write (uaecptr addr, uae_u32 val)
{
+ int ide_reg;
+
addr &= 0xffff;
- if (IDE_LOG > 1)
+ ide_devcon &= ~0x80;
+ if (IDE_LOG > 1 && addr != 0x2000 && addr != 0x2001 && addr != 0x2020 && addr != 0x2021 && addr != GAYLE_IRQ_1200)
write_log ("IDE_WRITE %08.8X=%02.2X PC=%X\n", addr, (uae_u32)val & 0xff, M68K_GETPC);
if (currprefs.cs_ide <= 0)
return;
return;
}
}
- if (addr >= 0x3020)
+ if (addr >= 0x4000)
return;
- if (currprefs.cs_ide == 2 && (addr & 0x2020) == 0x2020)
- addr &= ~0x20;
- addr &= ~0x2000;
- addr >>= 2;
- if (IDE_LOG > 2 && addr > 0)
- write_log("IDE register %d=%02.2X\n", addr, (uae_u32)val & 0xff);
- switch (addr)
+ ide_reg = get_ide_reg(addr);
+ if (IDE_LOG > 2 && ide_reg > 0)
+ write_log("IDE%d register %d=%02.2X\n", ide->num, ide_reg, (uae_u32)val & 0xff);
+ switch (ide_reg)
{
case IDE_DRVADDR:
break;
ide_devcon = val;
break;
case IDE_DATA:
- ide_put_data((uae_u8)val);
break;
case IDE_ERROR:
+ ide_feat2 = ide_feat;
ide_feat = val;
break;
case IDE_NSECTOR:
+ ide_nsector2 = ide_nsector;
ide_nsector = val;
break;
case IDE_SECTOR:
+ ide_sector2 = ide_sector;
ide_sector = val;
break;
case IDE_LCYL:
+ ide_lcyl2 = ide_lcyl;
ide_lcyl = val;
break;
case IDE_HCYL:
+ ide_hcyl2 = ide_hcyl;
ide_hcyl = val;
break;
case IDE_SELECT:
dummy_lgeti, dummy_wgeti, ABFLAG_IO
};
-uae_u32 REGPARAM2 gayle_lget (uaecptr addr)
+static uae_u32 REGPARAM2 gayle_lget (uaecptr addr)
{
- uae_u32 v = gayle_wget (addr) << 16;
+ uae_u32 v;
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
+ v = gayle_wget (addr) << 16;
v |= gayle_wget (addr + 2);
return v;
}
-uae_u32 REGPARAM2 gayle_wget (uaecptr addr)
+static uae_u32 REGPARAM2 gayle_wget (uaecptr addr)
{
- uae_u16 v = gayle_bget (addr) << 8;
+ int ide_reg;
+ uae_u16 v;
+
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
+ ide_reg = get_ide_reg(addr);
+ if (ide_reg == IDE_DATA)
+ return ide_get_data();
+ v = gayle_bget (addr) << 8;
v |= gayle_bget (addr + 1);
return v;
}
-uae_u32 REGPARAM2 gayle_bget (uaecptr addr)
+static uae_u32 REGPARAM2 gayle_bget (uaecptr addr)
{
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
return gayle_read (addr);
}
-void REGPARAM2 gayle_lput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 gayle_lput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
gayle_wput (addr, value >> 16);
gayle_wput (addr + 2, value & 0xffff);
}
-void REGPARAM2 gayle_wput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 gayle_wput (uaecptr addr, uae_u32 value)
{
+ int ide_reg;
+
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
+ ide_reg = get_ide_reg(addr);
+ if (ide_reg == IDE_DATA) {
+ ide_put_data(value);
+ return;
+ }
gayle_bput (addr, value >> 8);
gayle_bput (addr + 1, value & 0xff);
}
-void REGPARAM2 gayle_bput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 gayle_bput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
gayle_write (addr, value);
}
-void gayle2_write(uaecptr addr, uae_u32 v)
+static void gayle2_write(uaecptr addr, uae_u32 v)
{
gayle_id_cnt = 0;
}
-uae_u32 gayle2_read(uaecptr addr)
+static uae_u32 gayle2_read(uaecptr addr)
{
uae_u8 v = 0;
addr &= 0xffff;
dummy_lgeti, dummy_wgeti, ABFLAG_IO
};
-uae_u32 REGPARAM2 gayle2_lget (uaecptr addr)
+static uae_u32 REGPARAM2 gayle2_lget (uaecptr addr)
{
- uae_u32 v = gayle2_wget (addr) << 16;
+ uae_u32 v;
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
+ v = gayle2_wget (addr) << 16;
v |= gayle2_wget (addr + 2);
return v;
}
-uae_u32 REGPARAM2 gayle2_wget (uaecptr addr)
+static uae_u32 REGPARAM2 gayle2_wget (uaecptr addr)
{
- uae_u16 v = gayle2_bget (addr) << 8;
+ uae_u16 v;
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
+ v = gayle2_bget (addr) << 8;
v |= gayle2_bget (addr + 1);
return v;
}
-uae_u32 REGPARAM2 gayle2_bget (uaecptr addr)
+static uae_u32 REGPARAM2 gayle2_bget (uaecptr addr)
{
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
return gayle2_read (addr);
}
-void REGPARAM2 gayle2_lput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 gayle2_lput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
gayle2_wput (addr, value >> 16);
gayle2_wput (addr + 2, value & 0xffff);
}
-void REGPARAM2 gayle2_wput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 gayle2_wput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
gayle2_bput (addr, value >> 8);
gayle2_bput (addr + 1, value & 0xff);
}
-void REGPARAM2 gayle2_bput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 gayle2_bput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
gayle2_write (addr, value);
}
static void REGPARAM3 mbres_wput (uaecptr, uae_u32) REGPARAM;
static void REGPARAM3 mbres_bput (uaecptr, uae_u32) REGPARAM;
-uae_u32 REGPARAM2 mbres_lget (uaecptr addr)
+static uae_u32 REGPARAM2 mbres_lget (uaecptr addr)
{
- uae_u32 v = mbres_wget (addr) << 16;
+ uae_u32 v;
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
+ v = mbres_wget (addr) << 16;
v |= mbres_wget (addr + 2);
return v;
}
-uae_u32 REGPARAM2 mbres_wget (uaecptr addr)
+static uae_u32 REGPARAM2 mbres_wget (uaecptr addr)
{
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
return mbres_read (addr, 2);
}
-uae_u32 REGPARAM2 mbres_bget (uaecptr addr)
+static uae_u32 REGPARAM2 mbres_bget (uaecptr addr)
{
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
return mbres_read (addr, 1);
}
-void REGPARAM2 mbres_lput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 mbres_lput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
mbres_wput (addr, value >> 16);
mbres_wput (addr + 2, value & 0xffff);
}
-void REGPARAM2 mbres_wput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 mbres_wput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
mbres_write (addr, value, 2);
}
-void REGPARAM2 mbres_bput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 mbres_bput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
mbres_write (addr, value, 1);
}
void mbdmac_hsync(void)
{
+ int i;
+
+ for (i = 0; i < 4; i++) {
+ struct ide_hdf *ide = &idedrive[i];
+ if (ide->irq_delay > 0) {
+ ide->irq_delay--;
+ if (ide->irq_delay == 0)
+ ide_interrupt_do(ide);
+ }
+ }
+
if (wdcmd_active == 0)
return;
wdcmd_active--;
static void REGPARAM3 mbdmac_wput (uaecptr, uae_u32) REGPARAM;
static void REGPARAM3 mbdmac_bput (uaecptr, uae_u32) REGPARAM;
-uae_u32 REGPARAM2 mbdmac_lget (uaecptr addr)
+static uae_u32 REGPARAM2 mbdmac_lget (uaecptr addr)
{
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
return (mbdmac_wget (addr) << 16) | mbdmac_wget (addr + 2);
}
-uae_u32 REGPARAM2 mbdmac_wget (uaecptr addr)
+static uae_u32 REGPARAM2 mbdmac_wget (uaecptr addr)
{
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
return (mbdmac_bget (addr) << 8) | mbdmac_bget(addr + 1);;
}
-uae_u32 REGPARAM2 mbdmac_bget (uaecptr addr)
+static uae_u32 REGPARAM2 mbdmac_bget (uaecptr addr)
{
+#ifdef JIT
+ special_mem |= S_READ;
+#endif
return mbdmac_read (addr);
}
-void REGPARAM2 mbdmac_lput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 mbdmac_lput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
mbdmac_wput (addr, value >> 16);
mbdmac_wput (addr + 2, value & 0xffff);
}
-void REGPARAM2 mbdmac_wput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 mbdmac_wput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
mbdmac_bput (addr, value);
mbdmac_bput (addr, value + 1);
}
-void REGPARAM2 mbdmac_bput (uaecptr addr, uae_u32 value)
+static void REGPARAM2 mbdmac_bput (uaecptr addr, uae_u32 value)
{
+#ifdef JIT
+ special_mem |= S_WRITE;
+#endif
mbdmac_write (addr, value);
}
{
int i;
- for (i = 0; i < 2; i++) {
+ for (i = 0; i < 4; i++) {
struct ide_hdf *ide = &idedrive[i];
if (ide->hfd.handle_valid)
hdf_close(&ide->hfd);
{
struct ide_hdf *ide;
- if (ch >= 2)
+ if (ch >= 4)
return -1;
ide = &idedrive[ch];
ide->hfd.readonly = readonly;
ide->hfd.blocksize = blocksize;
+ ide->size = 0;
if (!hdf_open(&ide->hfd, path))
return -1;
ide->path = my_strdup(path);
ide->heads_def = ide->heads;
ide->size = ide->hfd.size;
write_log("CHS=%d,%d,%d\n", ide->cyls, ide->heads, ide->secspertrack);
-
ide->status = 0;
ide->data_offset = 0;
ide->data_size = 0;
static void initide(void)
{
+ int i;
+
if (savestate_state == STATE_RESTORE)
return;
ide_error = 1;
ide_select = 0;
ide_lcyl = ide_hcyl = ide_devcon = ide_feat = 0;
ide_drv = 0;
-
+ ide_splitter = 0;
+ if (idedrive[2].size) {
+ ide_splitter = 1;
+ write_log("IDE splitter enabled\n");
+ }
+ for (i = 0; i < 4; i++)
+ idedrive[i].num = i;
gayle_irq = gayle_intena = 0;
if (currprefs.cs_ide == 2)
gayle_intena = 0xff;
if (currprefs.cs_ide <= 0)
return NULL;
+ if (ide->size == 0)
+ return NULL;
dstbak = dst = malloc (1000);
save_u32(num);
save_u64(ide->size);
+ save_string(ide->path);
save_u32(ide->hfd.blocksize);
save_u32(ide->hfd.readonly);
save_u8(ide->multiple_mode);
save_u32(ide->cyls);
save_u32(ide->heads);
save_u32(ide->secspertrack);
- save_string(ide->path);
+ save_u8(ide_select);
+ save_u8(ide_nsector);
+ save_u8(ide_nsector2);
+ save_u8(ide_sector);
+ save_u8(ide_sector2);
+ save_u8(ide_lcyl);
+ save_u8(ide_lcyl2);
+ save_u8(ide_hcyl);
+ save_u8(ide_hcyl2);
+ save_u8(ide_feat);
+ save_u8(ide_feat2);
+ save_u8(ide_error);
+ save_u8(ide_devcon);
*len = dst - dstbak;
return dstbak;
}
num = restore_u32();
ide = &idedrive[num];
size = restore_u64();
+ path = restore_string();
blocksize = restore_u32();
readonly = restore_u32();
ide->multiple_mode = restore_u8();
ide->cyls = restore_u32();
ide->heads = restore_u32();
ide->secspertrack = restore_u32();
- path = restore_string();
+ ide_select = restore_u8();
+ ide_nsector = restore_u8();
+ ide_sector = restore_u8();
+ ide_lcyl = restore_u8();
+ ide_hcyl = restore_u8();
+ ide_feat = restore_u8();
+ ide_nsector2 = restore_u8();
+ ide_sector2 = restore_u8();
+ ide_lcyl2 = restore_u8();
+ ide_hcyl2 = restore_u8();
+ ide_feat2 = restore_u8();
+ ide_error = restore_u8();
+ ide_devcon = restore_u8();
gayle_add_ide_unit (num, path, blocksize, readonly);
xfree(path);
return src;
#include "sysconfig.h"
#include "sysdeps.h"
+#include "options.h"
#include "custom.h"
#include "xwin.h"
+#include <math.h>
+
#define RED 0
#define GRN 1
#define BLU 2
return (alpha & ((1 << bits) - 1)) << shift;
}
-static int greyscale(int v)
-{
-#if 0
- double l;
- double lum = currprefs.gfx_luminance / 5.0;
- double con = currprefs.gfx_contrast / 10.0;
-
- l = v;
- l = l + lum / (256 / 100);
- l = (l - con) / (256 - 2 * con) * 256;
- if (l < 0)
- l = 0;
- if (l > 255)
- l = 255;
- return (int)l;
-#else
- return v;
-#endif
-}
-
#if 0
static void colormodify (int *r, int *g, int *b)
{
}
#endif
+
+static float video_gamma(float value, float gamma, float bri, float con)
+{
+ double factor;
+ float ret;
+
+ value += bri;
+ value *= con;
+
+ if (value <= 0.0f)
+ return 0.0f;
+
+ factor = pow(255.0f, 1.0f - gamma);
+ ret = (float)(factor * pow(value, gamma));
+
+ if (ret < 0.0f)
+ ret = 0.0f;
+
+ return ret;
+}
+
+static int pal_scanlineshade = 667;
+
+static uae_u32 gamma[256 * 3];
+
+static void video_calc_gammatable(void)
+{
+ int i;
+ float bri, con, gam, scn, v;
+ uae_u32 vi;
+ uae_u32 gamma_fac[256 * 3];
+
+ bri = ((float)(currprefs.gfx_luminance))
+ * (128.0f / 1000.0f);
+ con = ((float)(currprefs.gfx_contrast + 1000)) / 1000.0f;
+ gam = ((float)(currprefs.gfx_gamma + 1000 )) / 1000.0f;
+ scn = ((float)(pal_scanlineshade)) / 1000.0f;
+
+ for (i = 0; i < (256 * 3); i++) {
+ v = video_gamma((float)(i - 256), gam, bri, con);
+
+ vi = (uae_u32)v;
+ if (vi > 255)
+ vi = 255;
+
+ if (currprefs.gfx_luminance == 0 && currprefs.gfx_contrast == 0 && currprefs.gfx_gamma == 0)
+ vi = i & 0xff;
+
+ gamma[i] = vi;
+
+ vi = (uae_u32)(v * scn);
+ if (vi > 255)
+ vi = 255;
+ gamma_fac[i] = vi;
+ }
+}
+
+
void alloc_colors64k (int rw, int gw, int bw, int rs, int gs, int bs, int aw, int as, int alpha, int byte_swap)
{
int bpp = rw + gw + bw + aw;
- int i;
+ int i, j;
+ video_calc_gammatable();
+ j = 256;
for (i = 0; i < 4096; i++) {
int r = ((i >> 8) << 4) | (i >> 8);
int g = (((i >> 4) & 0xf) << 4) | ((i >> 4) & 0x0f);
int b = ((i & 0xf) << 4) | (i & 0x0f);
- r = greyscale (r);
- g = greyscale (g);
- b = greyscale (b);
+ r = gamma[r + j];
+ g = gamma[g + j];
+ b = gamma[b + j];
xcolors[i] = doMask(r, rw, rs) | doMask(g, gw, gs) | doMask(b, bw, bs) | doAlpha (alpha, aw, as);
if (byte_swap) {
if (bpp <= 16)
#ifdef AGA
/* create AGA color tables */
for(i = 0; i < 256; i++) {
- xredcolors[i] = greyscale (doColor (i, rw, rs)) | doAlpha (alpha, aw, as);
- xgreencolors[i] = greyscale (doColor (i, gw, gs)) | doAlpha (alpha, aw, as);
- xbluecolors[i] = greyscale (doColor (i, bw, bs)) | doAlpha (alpha, aw, as);
+ j = i + 256;
+ xredcolors[i] = doColor (gamma[j], rw, rs) | doAlpha (alpha, aw, as);
+ xgreencolors[i] = doColor (gamma[j], gw, gs) | doAlpha (alpha, aw, as);
+ xbluecolors[i] = doColor (gamma[j], bw, bs) | doAlpha (alpha, aw, as);
if (byte_swap) {
if (bpp <= 16) {
xredcolors [i] = bswap_16 (xredcolors[i]);
for (i = 0; i < MAX_FILESYSTEM_UNITS; i++) {
hfpd = &hardfpd[i];
- if (hfpd->base && get_word(hfpd->base + 32) > 0) {
+ if (hfpd->base && valid_address(hfpd->base, 36) && get_word(hfpd->base + 32) > 0) {
for (j = 0; j < MAX_ASYNC_REQUESTS; j++) {
uaecptr request;
if ((request = hfpd->d_request[i]))
extern void INTREQ (uae_u16);
extern void INTREQ_0 (uae_u16);
+extern void INTREQ_f (uae_u32);
extern uae_u16 INTREQR (void);
/* maximums for statically allocated tables */
/* 68040/060 */
case 0x806: urp = *regp; break;
case 0x807: srp = *regp; break;
+ /* 68060 only */
case 0x808:
{
uae_u32 opcr = regs.pcr;
if (regs.s == 0) regs.usp = m68k_areg(®s, 7);
if (regs.s && regs.m) regs.msp = m68k_areg(®s, 7);
if (regs.s && regs.m == 0) regs.isp = m68k_areg(®s, 7);
- j = 0;
+ j = 2;
+ f_out(f, " USP %08.8X ISP %08.8X", regs.usp, regs.isp);
for (i = 0; m2cregn[i] >= 0; i++) {
if (!movec_illg(m2cregn[i])) {
if (j > 0 && (j % 4) == 0)
if(sound_flushes2 == 1) {
oldpos = 0;
intcount = 1;
- INTREQ(0x8000 | 0x2000);
+ INTREQ_f (0x8000 | 0x2000);
hr = IDirectSoundBuffer_Play(lpDSB2, 0, 0, DSBPLAY_LOOPING);
if(hr == DSERR_BUFFERLOST) {
IDirectSoundBuffer_Restore(lpDSB2);
if (force == 1) {
if (oldpos != pos) {
intcount = 1;
- INTREQ(0x8000 | 0x2000);
+ INTREQ_f (0x8000 | 0x2000);
return; //to generate amiga ints every amigablksize
} else {
return;
oldpos -= ahisndbufsize;
if (oldpos != pos) {
intcount = 1;
- INTREQ(0x8000 | 0x2000);
+ INTREQ_f (0x8000 | 0x2000);
}
}
Sleep(10);
CloseHandle (sd->evtt);
}
- if (sd->hCom)
+ if (sd->hCom != INVALID_HANDLE_VALUE)
CloseHandle(sd->hCom);
if (sd->evtr)
CloseHandle(sd->evtr);
#define IDC_DBG_MEMDOWNFAST 1758
#define IDC_DBG_MEMTOPC 1759
#define IDC_DBG_MEMUPFAST 1760
+#define IDC_DISPLAYADJUSTRESET 1761
#define ID__FLOPPYDRIVES 40004
#define ID_FLOPPYDRIVES_DF0 40005
#define ID_ST_CONFIGURATION 40010
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 253
#define _APS_NEXT_COMMAND_VALUE 40026
-#define _APS_NEXT_CONTROL_VALUE 1761
+#define _APS_NEXT_CONTROL_VALUE 1762
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
#define IDC_DBG_MEMDOWNFAST 1758
#define IDC_DBG_MEMTOPC 1759
#define IDC_DBG_MEMUPFAST 1760
+#define IDC_DA_RESET 1761
#define ID__FLOPPYDRIVES 40004
#define ID_FLOPPYDRIVES_DF0 40005
#define ID_ST_CONFIGURATION 40010
CONTROL "Normal",IDC_LM_NORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,231,89,44,10
CONTROL "Double",IDC_LM_DOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,231,105,45,10
CONTROL "Scanlines",IDC_LM_SCANLINES,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,231,121,46,10
- COMBOBOX IDC_DA_MODE,35,217,58,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
- CONTROL "",IDC_DA_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | NOT WS_VISIBLE | WS_TABSTOP,99,213,101,20
+ COMBOBOX IDC_DA_MODE,20,211,58,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ CONTROL "",IDC_DA_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,84,207,101,20
LTEXT "FPS adj.:",IDC_REFRESH2TEXT,16,182,32,8
CONTROL "",IDC_FRAMERATE2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,47,177,127,20
EDITTEXT IDC_RATE2TEXT,178,181,26,12,ES_CENTER | ES_READONLY
RTEXT "Native mode:",IDC_STATIC,19,85,59,15,SS_CENTERIMAGE
RTEXT "Windowed:",IDC_WINDOWEDTEXT,15,51,40,8
RTEXT "RTG mode:",IDC_STATIC,19,101,59,15,SS_CENTERIMAGE
+ PUSHBUTTON "Reset to defaults",IDC_DA_RESET,212,211,73,14
END
IDD_MEMORY DIALOGEX 0, 0, 300, 175
--- /dev/null
+
+#include "sysconfig.h"
+#include "sysdeps.h"
+
+#include "filter.h"
+
+uae_u32 gamma_red[256 * 3];
+uae_u32 gamma_grn[256 * 3];
+uae_u32 gamma_blu[256 * 3];
+
+uae_u32 gamma_red_fac[256 * 3];
+uae_u32 gamma_grn_fac[256 * 3];
+uae_u32 gamma_blu_fac[256 * 3];
+
+uae_u32 color_red[256];
+uae_u32 color_grn[256];
+uae_u32 color_blu[256];
+
+static float video_gamma(float value, float gamma, float bri, float con)
+{
+ double factor;
+ float ret;
+
+ value += bri;
+ value *= con;
+
+ if (value <= 0.0f)
+ return 0.0f;
+
+ factor = pow(255.0f, 1.0f - gamma);
+ ret = (float)(factor * pow(value, gamma));
+
+ if (ret < 0.0f)
+ ret = 0.0f;
+
+ return ret;
+}
+
+static int color_brightness = 1000;
+static int color_contrast = 1000;
+static int color_gamma = 1000;
+static int pal_scanlineshade = 667;
+
+static void video_calc_gammatable(void)
+{
+ int i;
+ float bri, con, gam, scn, v;
+ uae_u32 vi;
+
+ bri = ((float)(color_brightness - 1000))
+ * (128.0f / 1000.0f);
+ con = ((float)(color_contrast )) / 1000.0f;
+ gam = ((float)(color_gamma )) / 1000.0f;
+ scn = ((float)(pal_scanlineshade)) / 1000.0f;
+
+ for (i = 0; i < (256 * 3); i++) {
+ v = video_gamma((float)(i - 256), gam, bri, con);
+
+ vi = (uae_u32)v;
+ if (vi > 255)
+ vi = 255;
+ gamma_red[i] = color_red[vi];
+ gamma_grn[i] = color_grn[vi];
+ gamma_blu[i] = color_blu[vi];
+
+ vi = (uae_u32)(v * scn);
+ if (vi > 255)
+ vi = 255;
+ gamma_red_fac[i] = color_red[vi];
+ gamma_grn_fac[i] = color_grn[vi];
+ gamma_blu_fac[i] = color_blu[vi];
+ }
+}
\ No newline at end of file
gettimeofday (&tv, NULL);
if (tv.tv_sec > lastchartime) {
ovrun = 1;
- INTREQ (0x8000 | 0x0800);
+ INTREQ_f (0x8000 | 0x0800);
while (readser (&recdata));
write_log ("SERIAL: overrun\n");
}
writeser (serdatshift);
#endif
data_in_serdat = 0;
- INTREQ (0x8000 | 0x0001);
+ INTREQ_f (0x8000 | 0x0001);
#if SERIALDEBUG > 2
write_log ("SERIAL: send %04.4X (%c)\n", serdatshift, dochar (serdatshift));
#endif
#define EXPVS 1.3
int sound_debug = 0;
+int sound_mode_skip = 0;
static int obtainedfreq;
static int have_sound;
const static GUID KSDATAFORMAT_SUBTYPE_PCM = {0x00000001,0x0000,0x0010,
{0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71}};
+#define KSAUDIO_SPEAKER_QUAD_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \
+ SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)
+
+struct dsaudiomodes {
+ int ch;
+ DWORD ksmode;
+};
+static struct dsaudiomodes supportedmodes[16];
+
+static void fillsupportedmodes(int freq)
+{
+ DWORD speakerconfig;
+ DSBUFFERDESC sound_buffer;
+ WAVEFORMATEXTENSIBLE wavfmt;
+ LPDIRECTSOUNDBUFFER pdsb;
+ HRESULT hr;
+ int ch, round, mode, i, skip;
+ DWORD rn[4];
+
+ mode = 2;
+ supportedmodes[0].ch = 1;
+ supportedmodes[0].ksmode = 0;
+ supportedmodes[1].ch = 2;
+ supportedmodes[1].ksmode = 0;
+ if (FAILED(IDirectSound8_GetSpeakerConfig(lpDS, &speakerconfig)))
+ speakerconfig = DSSPEAKER_STEREO;
+
+ memset (&wavfmt, 0, sizeof (WAVEFORMATEXTENSIBLE));
+ wavfmt.Format.nSamplesPerSec = freq;
+ wavfmt.Format.wBitsPerSample = 16;
+ wavfmt.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ wavfmt.Format.cbSize = sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX);
+ wavfmt.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+ wavfmt.Samples.wValidBitsPerSample = 16;
+ for (ch = 4; ch <= 6; ch+= 2) {
+ wavfmt.Format.nChannels = ch;
+ wavfmt.Format.nBlockAlign = wavfmt.Format.wBitsPerSample / 8 * wavfmt.Format.nChannels;
+ wavfmt.Format.nAvgBytesPerSec = wavfmt.Format.nBlockAlign * wavfmt.Format.nSamplesPerSec;
+ if (ch == 6) {
+ rn[0] = KSAUDIO_SPEAKER_5POINT1;
+ rn[1] = KSAUDIO_SPEAKER_5POINT1_SURROUND;
+ rn[2] = 0;
+ } else {
+ rn[0] = KSAUDIO_SPEAKER_QUAD;
+ rn[1] = KSAUDIO_SPEAKER_QUAD_SURROUND;
+ rn[2] = KSAUDIO_SPEAKER_SURROUND;
+ rn[3] = 0;
+ }
+ skip = sound_mode_skip;
+ for (round = 0; rn[round]; round++) {
+ if (skip > 0 && rn[round + 1] != 0) {
+ skip--;
+ continue;
+ }
+ wavfmt.dwChannelMask = rn[round];
+ memset (&sound_buffer, 0, sizeof (sound_buffer));
+ sound_buffer.dwSize = sizeof (sound_buffer);
+ sound_buffer.dwBufferBytes = dsoundbuf;
+ sound_buffer.lpwfxFormat = &wavfmt.Format;
+ sound_buffer.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
+ sound_buffer.dwFlags |= DSBCAPS_CTRLVOLUME;
+ sound_buffer.guid3DAlgorithm = GUID_NULL;
+ hr = IDirectSound_CreateSoundBuffer(lpDS, &sound_buffer, &pdsb, NULL);
+ if (SUCCEEDED(hr)) {
+ IDirectSound_Release(pdsb);
+ supportedmodes[mode].ksmode = rn[round];
+ supportedmodes[mode].ch = ch;
+ mode++;
+ }
+ }
+ }
+ write_log("SOUND: %08.8X ", speakerconfig);
+ for (i = 0; i < mode; i++)
+ write_log("%d:%08.8X ", supportedmodes[i].ch, supportedmodes[i].ksmode);
+ write_log("\n");
+}
static int open_audio_ds (int size)
{
}
}
- round = 0;
- for (;;) {
- char *extname = NULL;
- int extend = round > 0 && ch > 2;
+ fillsupportedmodes(freq);
+ for (round = 0; supportedmodes[round].ch; round++) {
+ DWORD ksmode = 0;
+
+ pdsb = NULL;
memset (&wavfmt, 0, sizeof (WAVEFORMATEXTENSIBLE));
- wavfmt.Format.nChannels = ch;
- wavfmt.Format.wFormatTag = extend ? WAVE_FORMAT_EXTENSIBLE : WAVE_FORMAT_PCM;
+ wavfmt.Format.nChannels = ch;
wavfmt.Format.nSamplesPerSec = freq;
wavfmt.Format.wBitsPerSample = 16;
- if (extend) {
- DWORD ksmode;
- if (ch == 6) {
- ksmode = KSAUDIO_SPEAKER_5POINT1;
- extname = "5.1";
- } else {
- ksmode = round == 1 ? KSAUDIO_SPEAKER_QUAD : (round == 2 ? KSAUDIO_SPEAKER_SURROUND : SPEAKER_ALL);
- extname = round == 1 ? "QUAD" : (round == 2 ? "SUR" : "ALL");
- }
+ if (supportedmodes[round].ch != ch)
+ continue;
+
+ if (ch <= 2) {
+ wavfmt.Format.wFormatTag = WAVE_FORMAT_PCM;
+ } else {
+ wavfmt.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ ksmode = supportedmodes[round].ksmode;
wavfmt.Format.cbSize = sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX);
wavfmt.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
wavfmt.Samples.wValidBitsPerSample = 16;
wavfmt.Format.nBlockAlign = wavfmt.Format.wBitsPerSample / 8 * wavfmt.Format.nChannels;
wavfmt.Format.nAvgBytesPerSec = wavfmt.Format.nBlockAlign * wavfmt.Format.nSamplesPerSec;
- write_log ("SOUND: %d:%s '%s'/%d/%d bits/%d Hz/buffer %d/dist %d\n",
- round, extend ? extname : "PCM",
- sound_devices[currprefs.win32_soundcard],
- wavfmt.Format.nChannels, 16, freq, max_sndbufsize, snd_configsize);
+ write_log ("SOUND: %08.8X,CH=%d,FREQ=%d '%s' buffer %d, dist %d\n",
+ ksmode, ch, freq, sound_devices[currprefs.win32_soundcard], max_sndbufsize, snd_configsize);
memset (&sound_buffer, 0, sizeof (sound_buffer));
sound_buffer.dwSize = sizeof (sound_buffer);
sound_buffer.dwBufferBytes = dsoundbuf;
sound_buffer.lpwfxFormat = &wavfmt.Format;
sound_buffer.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
- sound_buffer.dwFlags |= DSBCAPS_CTRLVOLUME | DSBCAPS_LOCSOFTWARE;
+ sound_buffer.dwFlags |= DSBCAPS_CTRLVOLUME | (ch >= 4 ? DSBCAPS_LOCHARDWARE : DSBCAPS_LOCSOFTWARE);
sound_buffer.guid3DAlgorithm = GUID_NULL;
hr = IDirectSound_CreateSoundBuffer(lpDS, &sound_buffer, &pdsb, NULL);
- if (FAILED(hr)) {
- write_log ("SOUND: Secondary CreateSoundBuffer() failure: %s\n", DXError (hr));
- if (ch <= 2)
- goto error;
- if (round < 4) {
- round++;
- continue;
+ if (SUCCEEDED(hr))
+ break;
+ if (sound_buffer.dwFlags & DSBCAPS_LOCHARDWARE) {
+ HRESULT hr2 = hr;
+ sound_buffer.dwFlags &= ~DSBCAPS_LOCHARDWARE;
+ sound_buffer.dwFlags |= DSBCAPS_LOCSOFTWARE;
+ hr = IDirectSound_CreateSoundBuffer(lpDS, &sound_buffer, &pdsb, NULL);
+ if (SUCCEEDED(hr)) {
+ write_log("SOUND: Couldn't use hardware buffer (switched to software): %s\n", DXError (hr2));
+ break;
}
- goto error;
}
- break;
+ write_log ("SOUND: Secondary CreateSoundBuffer() failure: %s\n", DXError (hr));
}
+ if (pdsb == NULL)
+ goto error;
hr = IDirectSound_QueryInterface(pdsb, &IID_IDirectSoundBuffer8, (LPVOID*)&lpDSBsecondary);
if (FAILED(hr)) {
write_log ("SOUND: Secondary QueryInterface() failure: %s\n", DXError (hr));
#endif
}
-int os_winnt, os_winnt_admin, os_64bit, os_vista;
+int os_winnt, os_winnt_admin, os_64bit, os_vista, os_winxp;
static int isadminpriv (void)
{
}
if (osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT)
os_winnt = 1;
+ if (osVersion.dwMajorVersion > 5 || (osVersion.dwMajorVersion == 5 && osVersion.dwMinorVersion >= 1))
+ os_winxp = 1;
if (osVersion.dwMajorVersion >= 6)
os_vista = 1;
if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
extern void test (void);
extern int screenshotmode, b0rken_ati_overlay, postscript_print_debugging, sound_debug, log_uaeserial;
-extern int force_direct_catweasel, max_allowed_mman;
+extern int force_direct_catweasel, max_allowed_mman, sound_mode_skip;
extern DWORD_PTR cpu_affinity;
static DWORD_PTR original_affinity;
force_direct_catweasel = getval (argv[++i]);
continue;
}
- if (!strcmp (arg, "-affinity") && i + 1 < argc) {
- cpu_affinity = getval (argv[++i]);
- if (cpu_affinity == 0)
- cpu_affinity = original_affinity;
- SetThreadAffinityMask(GetCurrentThread(), cpu_affinity);
- continue;
- }
- if (!strcmp (arg, "-datapath") && i + 1 < argc) {
- strcpy(start_path_data, argv[++i]);
- start_data = 1;
- continue;
- }
- if (!strcmp (arg, "-maxmem") && i + 1 < argc) {
- max_allowed_mman = getval (argv[++i]);
- continue;
+ if (i + 1 < argc) {
+ char *np = argv[++i];
+ if (!strcmp (arg, "-affinity")) {
+ cpu_affinity = getval (np);
+ if (cpu_affinity == 0)
+ cpu_affinity = original_affinity;
+ SetThreadAffinityMask(GetCurrentThread(), cpu_affinity);
+ continue;
+ }
+ if (!strcmp (arg, "-datapath")) {
+ strcpy(start_path_data, np);
+ start_data = 1;
+ continue;
+ }
+ if (!strcmp (arg, "-maxmem")) {
+ max_allowed_mman = getval (np);
+ continue;
+ }
+ if (!strcmp (arg, "-soundmodeskip")) {
+ sound_mode_skip = getval (np);
+ continue;
+ }
}
xargv[xargc++] = my_strdup(arg);
}
#define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100)
#define GETBDD(x) ((x) % 100)
-#define WINUAEBETA 6
+#define WINUAEBETA 7
#define WINUAEPUBLICBETA 1
-#define WINUAEDATE MAKEBD(2007, 4, 9)
+#define WINUAEDATE MAKEBD(2007, 4, 12)
#define IHF_WINDOWHIDDEN 6
#define NORMAL_WINDOW_STYLE (WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU)
extern char prtname[];
extern char VersionStr[256];
extern char BetaStr[64];
-extern int os_winnt, os_winnt_admin, os_64bit, os_vista;
+extern int os_winnt, os_winnt_admin, os_64bit, os_vista, os_winxp;
extern int paraport_mask;
extern int gui_active;
extern DWORD quickstart;
D3D_getpixelformat (currentmode->current_depth,&red_bits,&green_bits,&blue_bits,&red_shift,&green_shift,&blue_shift,&alpha_bits,&alpha_shift,&alpha);
#endif
} else {
- switch( currentmode->current_depth >> 3)
+ switch(currentmode->current_depth >> 3)
{
case 1:
memcpy (xcolors, xcol8, sizeof xcolors);
- ddrval = DirectDraw_SetPaletteEntries( 0, 256, colors256 );
+ ddrval = DirectDraw_SetPaletteEntries(0, 256, colors256);
if (FAILED(ddrval))
write_log ("DX_SetPalette() failed with %s/%d\n", DXError (ddrval), ddrval);
break;
case 2:
case 3:
case 4:
- red_bits = bits_in_mask( DirectDraw_GetPixelFormatBitMask( red_mask ) );
- green_bits = bits_in_mask( DirectDraw_GetPixelFormatBitMask( green_mask ) );
- blue_bits = bits_in_mask( DirectDraw_GetPixelFormatBitMask( blue_mask ) );
- red_shift = mask_shift( DirectDraw_GetPixelFormatBitMask( red_mask ) );
- green_shift = mask_shift( DirectDraw_GetPixelFormatBitMask( green_mask ) );
- blue_shift = mask_shift( DirectDraw_GetPixelFormatBitMask( blue_mask ) );
+ red_bits = bits_in_mask(DirectDraw_GetPixelFormatBitMask(red_mask));
+ green_bits = bits_in_mask(DirectDraw_GetPixelFormatBitMask(green_mask));
+ blue_bits = bits_in_mask(DirectDraw_GetPixelFormatBitMask(blue_mask));
+ red_shift = mask_shift(DirectDraw_GetPixelFormatBitMask(red_mask));
+ green_shift = mask_shift(DirectDraw_GetPixelFormatBitMask(green_mask));
+ blue_shift = mask_shift(DirectDraw_GetPixelFormatBitMask(blue_mask));
alpha_bits = 0;
alpha_shift = 0;
break;
}
}
alloc_colors64k (red_bits, green_bits, blue_bits, red_shift,green_shift, blue_shift, alpha_bits, alpha_shift, alpha, 0);
+ notice_new_xcolors();
#ifdef GFXFILTER
S2X_configure (red_bits, green_bits, blue_bits, red_shift,green_shift, blue_shift);
#endif
if (uci->controller) {
sprintf (blocksize_str, "%d", uci->blocksize);
- strcpy (devname_str, uci->controller == 1 ? "*IDE0*" : "*IDE1*");
+ sprintf (devname_str, "*IDE%d*", uci->controller - 1);
strcpy (volname_str, "n/a");
strcpy (bootpri_str, "n/a");
} else if (type == FILESYS_HARDFILE) {
return i;
}
-#if 0
static int da_mode_selected;
static int *getp_da (void)
int *p = 0;
switch (da_mode_selected)
{
- case 3:
- p = &workprefs.gfx_hue;
- break;
- case 4:
- p = &workprefs.gfx_saturation;
- break;
case 0:
p = &workprefs.gfx_luminance;
break;
return p;
}
+static void update_da(void)
+{
+ currprefs.gfx_gamma = workprefs.gfx_gamma;
+ currprefs.gfx_luminance = workprefs.gfx_luminance;
+ currprefs.gfx_contrast = workprefs.gfx_contrast;
+ init_colors ();
+ init_custom();
+ updatedisplayarea ();
+ WIN32GFX_WindowMove ();
+}
static void handle_da (HWND hDlg)
{
int *p;
if (v == *p)
return;
*p = v;
-#if 0
- currprefs.gfx_hue = workprefs.gfx_hue;
- currprefs.gfx_saturation = workprefs.gfx_saturation;
- currprefs.gfx_gamma = workprefs.gfx_gamma;
-#endif
- currprefs.gfx_luminance = workprefs.gfx_luminance;
- currprefs.gfx_contrast = workprefs.gfx_contrast;
- init_colors ();
- updatedisplayarea ();
- WIN32GFX_WindowMove ();
- init_custom();
+ update_da();
}
void init_da (HWND hDlg)
SendDlgItemMessage(hDlg, IDC_DA_MODE, CB_RESETCONTENT, 0, 0);
SendDlgItemMessage(hDlg, IDC_DA_MODE, CB_ADDSTRING, 0, (LPARAM)"Luminance");
SendDlgItemMessage(hDlg, IDC_DA_MODE, CB_ADDSTRING, 0, (LPARAM)"Contrast");
-#if 0
SendDlgItemMessage(hDlg, IDC_DA_MODE, CB_ADDSTRING, 0, (LPARAM)"Gamma");
- SendDlgItemMessage(hDlg, IDC_DA_MODE, CB_ADDSTRING, 0, (LPARAM)"Hue");
- SendDlgItemMessage(hDlg, IDC_DA_MODE, CB_ADDSTRING, 0, (LPARAM)"Saturation");
-#endif
if (da_mode_selected == CB_ERR)
da_mode_selected = 0;
SendDlgItemMessage (hDlg, IDC_DA_MODE, CB_SETCURSEL, da_mode_selected, 0);
if (p)
SendDlgItemMessage (hDlg, IDC_DA_SLIDER, TBM_SETPOS, TRUE, (*p) / 10);
}
-#endif
static int gui_display_depths[3];
static void init_display_mode (HWND hDlg)
CheckDlgButton (hDlg, IDC_XCENTER, workprefs.gfx_xcenter);
CheckDlgButton (hDlg, IDC_YCENTER, workprefs.gfx_ycenter);
-#if 0
init_da (hDlg);
-#endif
}
static void init_resolution_combo (HWND hDlg)
workprefs.gfx_refreshrate = storedrefreshrates[posn1];
}
values_to_displaydlg (hDlg);
-#if 0
} else if (LOWORD (wParam) == IDC_DA_MODE) {
da_mode_selected = SendDlgItemMessage (hDlg, IDC_DA_MODE, CB_GETCURSEL, 0, 0);
init_da (hDlg);
handle_da (hDlg);
-#endif
}
}
SendDlgItemMessage (hDlg, IDC_FRAMERATE2, TBM_SETRANGE, TRUE, MAKELONG (1, 99));
init_displays_combo (hDlg);
init_resolution_combo (hDlg);
-#if 0
init_da (hDlg);
-#endif
case WM_USER:
recursive++;
if (recursive > 0)
break;
recursive++;
-#if 0
+ if (LOWORD (wParam) == IDC_DA_RESET) {
+ int *p;
+ da_mode_selected = SendDlgItemMessage (hDlg, IDC_DA_MODE, CB_GETCURSEL, 0, 0);
+ p = getp_da();
+ if (p)
+ *p = 0;
+ init_da(hDlg);
+ update_da();
+ }
handle_da (hDlg);
-#endif
values_from_displaydlg (hDlg, msg, wParam, lParam);
enable_for_displaydlg (hDlg);
-
recursive--;
break;
SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"UAE");
SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"IDE0");
SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"IDE1");
+ SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"IDE2");
+ SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"IDE3");
SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_SETCURSEL, 0, 0);
ew (hDlg, IDC_HDF_CONTROLLER, is_hdf_rdb());
SendDlgItemMessage(hDlg, IDC_HF_TYPE, CB_RESETCONTENT, 0, 0);
RelativePath="..\scaler.c"
>
</File>
+ <File
+ RelativePath="..\scaler_more.c"
+ >
+ </File>
<File
RelativePath="..\screenshot.c"
>
RelativePath="..\resources\drive_startup.wav"
>
</File>
- <File
- RelativePath="..\resources\resource"
- >
- </File>
<File
RelativePath="..\resources\resource.h"
>
+Beta 7:
+
+- hardfile reset routine randomly read non-existing memory (b4)
+- IDE emulation froze if total read or write transfer was larger
+ than current multimode sector amount
+- added 2 scanline delay before IDE command complete-interrupt is
+ sent. Could cause missed interrupts in compatible 68000-mode and
+ also made emulation sluggish during large reads or writes.
+- HRTMon IDE commands work now in A600 configuration.
+- HD onscreen led write color fixed in IDE mode
+- 4/6 channel modes should really work with Emu10K based cards..
+ (I can always hope..)
+- USP and ISP registers are back in debugger
+- brightness/contrast/gamma setting added to display panel
+ (not working in real time yet)
+- "IDE Splitter" / "4-Way IDE" hardware emulation added. IDEFix or
+ similar driver needed. Enabled if IDE3/IDE4 selected
+- much faster IDE in JIT modes
+
Beta 6:
- added 4 channel and cloned stereo in 5.1 native mode. Workaround for
save_chunk (f, dst, len, "GAYL", 0);
xfree(dst);
}
- for (i = 0; i < 2; i++) {
+ for (i = 0; i < 4; i++) {
dst = save_ide (i, &len);
if (dst) {
save_chunk (f, dst, len, "IDE ", 0);
struct devstruct *dev;
dev = getdevstruct (get_long(request + 24));
- if (log_uaeserial)
- write_log ("%s:%d close, req=%x\n", getdevname(), dev->unit, request);
if (!dev)
return 0;
+ if (log_uaeserial)
+ write_log ("%s:%d close, req=%x\n", getdevname(), dev->unit, request);
dev_close_3 (dev);
put_long (request + 24, 0);
put_word (m68k_areg(&context->regs, 6) + 32, get_word (m68k_areg(&context->regs, 6) + 32) - 1);
int i, err;
for (i = 0; i < MAX_TOTAL_DEVICES; i++) {
- if (devst[i].unit == unit && devst[i].exclusive)
+ if (devst[i].open && devst[i].unit == unit && devst[i].exclusive)
return openfail (ioreq, -6); /* busy */
}
for (i = 0; i < MAX_TOTAL_DEVICES; i++) {
if (!devst[i].open)
break;
}
- dev = &devst[i];
if (i == MAX_TOTAL_DEVICES)
return openfail (ioreq, 32); /* badunitnum */
+ dev = &devst[i];
dev->sysdata = xcalloc (uaeser_getdatalenght(), 1);
if (!uaeser_open (dev->sysdata, dev, unit)) {
xfree (dev->sysdata);