From: Toni Wilen Date: Thu, 12 Apr 2007 15:54:38 +0000 (+0300) Subject: imported winuaesrc1420b7.zip X-Git-Tag: 2100~228 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=d07ad079a245ab60ebe60c75cfb549cc36d47801;p=francis%2Fwinuae.git imported winuaesrc1420b7.zip --- diff --git a/ar.c b/ar.c index 60cc16f7..92913c04 100755 --- a/ar.c +++ b/ar.c @@ -1445,7 +1445,6 @@ static void hrtmon_configure(void) 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; @@ -1456,6 +1455,7 @@ static void hrtmon_configure(void) 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) diff --git a/cdtv.c b/cdtv.c index e06f5c2f..21a1fe45 100755 --- a/cdtv.c +++ b/cdtv.c @@ -64,7 +64,7 @@ static void do_stch(void); static void INT2(void) { - INTREQ(0x8000 | 0x0008); + INTREQ_f(0x8000 | 0x0008); } static int cdrom_command_cnt_out, cdrom_command_size_out; diff --git a/cfgfile.c b/cfgfile.c index a6a2f446..df7c1957 100755 --- a/cfgfile.c +++ b/cfgfile.c @@ -220,7 +220,7 @@ static void write_filesys_config (struct uae_prefs *p, const char *unexpanded, { 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]; @@ -468,6 +468,9 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) 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"); @@ -761,6 +764,9 @@ static int cfgfile_parse_host (struct uae_prefs *p, char *option, char *value) || 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) @@ -1427,10 +1433,11 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, char *option, char *valu 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; } diff --git a/custom.c b/custom.c index 6b8b24e2..5f26a06d 100755 --- a/custom.c +++ b/custom.c @@ -435,12 +435,14 @@ STATIC_INLINE void docols (struct color_entry *colentry) #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); @@ -2638,7 +2640,7 @@ void INTREQ_0 (uae_u16 v) doint (); } -static void INTREQ_f(uae_u32 data) +void INTREQ_f(uae_u32 data) { INTREQ_0 (data); serial_check_irq (); diff --git a/disk.c b/disk.c index 9bf52abf..a3b36fce 100755 --- a/disk.c +++ b/disk.c @@ -2878,7 +2878,7 @@ void DSKLEN (uae_u16 v, int hpos) pos += 16; pos %= drv->tracklen; } - INTREQ (0x8000 | 0x1000); + INTREQ_f (0x8000 | 0x1000); done = 1; } else if (dskdmaen == 3) { /* TURBO write */ @@ -2897,7 +2897,7 @@ void DSKLEN (uae_u16 v, int hpos) put_word (dskpt, 0); dskpt += 2; } - INTREQ (0x8000 | 0x1000); + INTREQ_f (0x8000 | 0x1000); done = 1; } diff --git a/enforcer.c b/enforcer.c index 06d90ad8..f9290f8d 100755 --- a/enforcer.c +++ b/enforcer.c @@ -196,11 +196,17 @@ static void enforcer_display_hit(const char *addressmode, uae_u32 pc, uaecptr ad 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); @@ -370,9 +376,10 @@ static void enforcer_display_hit(const char *addressmode, uae_u32 pc, uaecptr ad 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) diff --git a/gayle.c b/gayle.c index 4166e32f..dd2752d4 100755 --- a/gayle.c +++ b/gayle.c @@ -98,19 +98,24 @@ struct ide_hdf 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) { @@ -122,31 +127,36 @@ 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; @@ -158,14 +168,13 @@ static void ide_data_ready(int blocks) 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; @@ -174,6 +183,8 @@ static void ide_identify_drive(void) 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); @@ -214,8 +225,6 @@ static void ide_identify_drive(void) } 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; @@ -227,21 +236,21 @@ static void ide_initialize_drive_parameters(void) } } 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(); } @@ -287,7 +296,6 @@ static void put_lbachs(struct ide_hdf *ide, int lba, int cyl, int head, int sec, 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(); @@ -295,10 +303,9 @@ static void ide_read_sectors(int multi) } 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) { @@ -307,6 +314,7 @@ static void ide_read_sectors(int multi) } 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; @@ -314,19 +322,20 @@ static void ide_read_sectors(int multi) 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); @@ -336,8 +345,8 @@ static void ide_write_sectors(int multi) 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 */ @@ -368,45 +377,88 @@ static void ide_do_command(uae_u8 cmd) } } -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); @@ -415,15 +467,13 @@ static uae_u32 ide_read (uaecptr addr) 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; @@ -434,60 +484,73 @@ static uae_u32 ide_read (uaecptr addr) } 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; @@ -501,15 +564,12 @@ static void ide_write (uaecptr addr, uae_u32 val) 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; @@ -517,21 +577,25 @@ static void ide_write (uaecptr addr, uae_u32 val) 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: @@ -580,46 +644,78 @@ addrbank gayle_bank = { 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; @@ -648,37 +744,57 @@ addrbank gayle2_bank = { 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); } @@ -747,34 +863,53 @@ static void REGPARAM3 mbres_lput (uaecptr, uae_u32) REGPARAM; 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); } @@ -829,6 +964,17 @@ static void wd_cmd(uae_u8 data) 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--; @@ -994,33 +1140,51 @@ static void REGPARAM3 mbdmac_lput (uaecptr, uae_u32) REGPARAM; 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); } @@ -1040,7 +1204,7 @@ void gayle_free_ide_units(void) { 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); @@ -1091,11 +1255,12 @@ int gayle_add_ide_unit(int ch, char *path, int blocksize, int readonly) { 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); @@ -1106,7 +1271,6 @@ int gayle_add_ide_unit(int ch, char *path, int blocksize, int readonly) 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; @@ -1115,6 +1279,8 @@ int gayle_add_ide_unit(int ch, char *path, int blocksize, int readonly) static void initide(void) { + int i; + if (savestate_state == STATE_RESTORE) return; ide_error = 1; @@ -1122,7 +1288,13 @@ static void initide(void) 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; @@ -1170,16 +1342,31 @@ uae_u8 *save_ide (int num, int *len) 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; } @@ -1194,13 +1381,26 @@ uae_u8 *restore_ide (uae_u8 *src) 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; diff --git a/gfxutil.c b/gfxutil.c index 8bca5e6c..5fc55ebe 100755 --- a/gfxutil.c +++ b/gfxutil.c @@ -8,9 +8,12 @@ #include "sysconfig.h" #include "sysdeps.h" +#include "options.h" #include "custom.h" #include "xwin.h" +#include + #define RED 0 #define GRN 1 #define BLU 2 @@ -86,26 +89,6 @@ static unsigned int doAlpha (int alpha, int bits, int shift) 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) { @@ -128,18 +111,78 @@ 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) @@ -156,9 +199,10 @@ void alloc_colors64k (int rw, int gw, int bw, int rs, int gs, int bs, int aw, in #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]); diff --git a/hardfile.c b/hardfile.c index 52651add..ef12ab73 100755 --- a/hardfile.c +++ b/hardfile.c @@ -779,7 +779,7 @@ void hardfile_reset (void) 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])) diff --git a/include/custom.h b/include/custom.h index 90a06c23..f85c0373 100755 --- a/include/custom.h +++ b/include/custom.h @@ -79,6 +79,7 @@ extern int joy0button, joy1button; 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 */ diff --git a/newcpu.c b/newcpu.c index 4cce579f..d709c994 100755 --- a/newcpu.c +++ b/newcpu.c @@ -1215,6 +1215,7 @@ int m68k_move2c (int regno, uae_u32 *regp) /* 68040/060 */ case 0x806: urp = *regp; break; case 0x807: srp = *regp; break; + /* 68060 only */ case 0x808: { uae_u32 opcr = regs.pcr; @@ -2605,7 +2606,8 @@ void m68k_dumpstate (void *f, uaecptr *nextpc) 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) diff --git a/od-win32/ahidsound.c b/od-win32/ahidsound.c index b00fc011..b3e40260 100755 --- a/od-win32/ahidsound.c +++ b/od-win32/ahidsound.c @@ -191,7 +191,7 @@ void ahi_updatesound(int force) 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); @@ -210,7 +210,7 @@ void ahi_updatesound(int force) if (force == 1) { if (oldpos != pos) { intcount = 1; - INTREQ(0x8000 | 0x2000); + INTREQ_f (0x8000 | 0x2000); return; //to generate amiga ints every amigablksize } else { return; @@ -252,7 +252,7 @@ void ahi_updatesound(int force) oldpos -= ahisndbufsize; if (oldpos != pos) { intcount = 1; - INTREQ(0x8000 | 0x2000); + INTREQ_f (0x8000 | 0x2000); } } diff --git a/od-win32/parser.c b/od-win32/parser.c index 25c9eed3..c01b5147 100755 --- a/od-win32/parser.c +++ b/od-win32/parser.c @@ -739,7 +739,7 @@ void uaeser_close (struct uaeserialdatawin32 *sd) Sleep(10); CloseHandle (sd->evtt); } - if (sd->hCom) + if (sd->hCom != INVALID_HANDLE_VALUE) CloseHandle(sd->hCom); if (sd->evtr) CloseHandle(sd->evtr); diff --git a/od-win32/resources/resource b/od-win32/resources/resource index b3d44a6c..6732add0 100755 --- a/od-win32/resources/resource +++ b/od-win32/resources/resource @@ -903,6 +903,7 @@ #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 @@ -929,7 +930,7 @@ #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 diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index b3d44a6c..211b75b1 100755 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -903,6 +903,7 @@ #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 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 1b4b1195..e2e0ba7d 100755 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -98,8 +98,8 @@ BEGIN 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 @@ -110,6 +110,7 @@ BEGIN 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 diff --git a/od-win32/scaler_more.c b/od-win32/scaler_more.c new file mode 100755 index 00000000..2b53e46e --- /dev/null +++ b/od-win32/scaler_more.c @@ -0,0 +1,73 @@ + +#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 diff --git a/od-win32/serial_win32.c b/od-win32/serial_win32.c index f226872f..e4da2bf6 100755 --- a/od-win32/serial_win32.c +++ b/od-win32/serial_win32.c @@ -118,7 +118,7 @@ static void checkreceive (int mode) 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"); } @@ -183,7 +183,7 @@ static void checksend (int mode) 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 diff --git a/od-win32/sounddep/sound.c b/od-win32/sounddep/sound.c index 8755c084..a0aa9dde 100755 --- a/od-win32/sounddep/sound.c +++ b/od-win32/sounddep/sound.c @@ -43,6 +43,7 @@ #define EXPVS 1.3 int sound_debug = 0; +int sound_mode_skip = 0; static int obtainedfreq; static int have_sound; @@ -214,6 +215,82 @@ static void recalc_offsets(void) 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) { @@ -285,25 +362,24 @@ 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; @@ -312,33 +388,35 @@ static int open_audio_ds (int size) 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)); diff --git a/od-win32/win32.c b/od-win32/win32.c index 86bfe33a..a3f0b083 100755 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -2334,7 +2334,7 @@ static int dxdetect (void) #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) { @@ -2426,6 +2426,8 @@ static int osdetect (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) @@ -2569,7 +2571,7 @@ static void getstartpaths(int start_data) 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; @@ -2686,21 +2688,28 @@ static int process_arg(char **xargv) 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); } diff --git a/od-win32/win32.h b/od-win32/win32.h index 9351f0f8..51f8f20c 100755 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -15,9 +15,9 @@ #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) @@ -67,7 +67,7 @@ extern int framecnt; 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; diff --git a/od-win32/win32gfx.c b/od-win32/win32gfx.c index 17f3ab83..6e7f3799 100755 --- a/od-win32/win32gfx.c +++ b/od-win32/win32gfx.c @@ -1303,11 +1303,11 @@ void init_colors (void) 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; @@ -1315,12 +1315,12 @@ void init_colors (void) 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; @@ -1339,6 +1339,7 @@ void init_colors (void) } } 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 diff --git a/od-win32/win32gui.c b/od-win32/win32gui.c index 27c5e5dc..0e3c2182 100755 --- a/od-win32/win32gui.c +++ b/od-win32/win32gui.c @@ -1983,7 +1983,7 @@ void InitializeListView (HWND hDlg) 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) { @@ -3554,7 +3554,6 @@ static int display_mode_index(uae_u32 x, uae_u32 y, uae_u32 d) return i; } -#if 0 static int da_mode_selected; static int *getp_da (void) @@ -3562,12 +3561,6 @@ 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; @@ -3581,6 +3574,16 @@ static int *getp_da (void) 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; @@ -3593,17 +3596,7 @@ static void handle_da (HWND hDlg) 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) @@ -3612,11 +3605,7 @@ 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); @@ -3626,7 +3615,6 @@ void init_da (HWND hDlg) 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) @@ -3757,9 +3745,7 @@ static void values_to_displaydlg (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) @@ -3918,12 +3904,10 @@ static void values_from_displaydlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM l 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 } } @@ -3947,9 +3931,7 @@ static INT_PTR CALLBACK DisplayDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR 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++; @@ -3963,12 +3945,18 @@ static INT_PTR CALLBACK DisplayDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR 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; @@ -5972,6 +5960,8 @@ static void inithardfile (HWND hDlg) 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); diff --git a/od-win32/winuae_msvc/winuae_msvc.vcproj b/od-win32/winuae_msvc/winuae_msvc.vcproj index 3da64215..7511d243 100755 --- a/od-win32/winuae_msvc/winuae_msvc.vcproj +++ b/od-win32/winuae_msvc/winuae_msvc.vcproj @@ -1353,6 +1353,10 @@ RelativePath="..\scaler.c" > + + @@ -2377,10 +2381,6 @@ RelativePath="..\resources\drive_startup.wav" > - - diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 25de4a77..2e4be0eb 100755 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,4 +1,23 @@ +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 diff --git a/savestate.c b/savestate.c index 4b448d68..01bb34ee 100755 --- a/savestate.c +++ b/savestate.c @@ -726,7 +726,7 @@ int save_state (char *filename, char *description) 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); diff --git a/uaeserial.c b/uaeserial.c index 019f20cc..b07c055c 100755 --- a/uaeserial.c +++ b/uaeserial.c @@ -188,10 +188,10 @@ static uae_u32 REGPARAM2 dev_close (TrapContext *context) 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); @@ -274,16 +274,16 @@ static uae_u32 REGPARAM2 dev_open (TrapContext *context) 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);