]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
imported winuaesrc1420b7.zip
authorToni Wilen <twilen@winuae.net>
Thu, 12 Apr 2007 15:54:38 +0000 (18:54 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 22 Feb 2010 19:33:11 +0000 (21:33 +0200)
27 files changed:
ar.c
cdtv.c
cfgfile.c
custom.c
disk.c
enforcer.c
gayle.c
gfxutil.c
hardfile.c
include/custom.h
newcpu.c
od-win32/ahidsound.c
od-win32/parser.c
od-win32/resources/resource
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/scaler_more.c [new file with mode: 0755]
od-win32/serial_win32.c
od-win32/sounddep/sound.c
od-win32/win32.c
od-win32/win32.h
od-win32/win32gfx.c
od-win32/win32gui.c
od-win32/winuae_msvc/winuae_msvc.vcproj
od-win32/winuaechangelog.txt
savestate.c
uaeserial.c

diff --git a/ar.c b/ar.c
index 60cc16f71d0e7de65e746b5ffff7293abd07c198..92913c04acc7552c5428616c2ac7da254004afd9 100755 (executable)
--- 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 e06f5c2fddbd47960e5a60acc6a2616d7b1009ff..21a1fe45ae6de0ee632a2da5121b774daef1b984 100755 (executable)
--- 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;
index a6a2f446553e0226155375ea850c14c180f9e5c5..df7c19572cdd813262528426dda58aac90977180 100755 (executable)
--- 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;
                }
index 6b8b24e2607cb21c2a2cc309f32a0da54cabb89d..5f26a06d754e508cc6fdeeee7f4c7f3b106bcb50 100755 (executable)
--- 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(&current_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 9bf52abf8577b90abc585afbd9ef01079e1b0687..a3b36fcecb6e642275c8e7590085ef2a472d347d 100755 (executable)
--- 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;
        }
 
index 06d90ad8b6483eb43f30c442cf3bbe23e025eb08..f9290f8d6b2c99bc28982fc43d137931b6d6ea8b 100755 (executable)
@@ -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 4166e32f3949e03273b5daecd2f37221ae4881d6..dd2752d475fc40ab509b0e8338e246ea54ebe32b 100755 (executable)
--- 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;
index 8bca5e6c1a47123b062122116b4ab684dce3b424..5fc55ebe221d51ca0aa1c2946b4e01e34ba0acf9 100755 (executable)
--- 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 <math.h>
+
 #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]);
index 52651adddc8eb73bb8adbffe9230ab6f2aa4d008..ef12ab73715a3b88591d35ba0be9e2f9773066b1 100755 (executable)
@@ -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]))
index 90a06c2300e74d9fb0a203119a80d9026aefe326..f85c03730df335ff1aa3da1e11b5bd018a1005a2 100755 (executable)
@@ -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 */
index 4cce579f69d39391e9c9d7c0f456c5516517c524..d709c994a76aaf370568b67e7fa4cf1e7571ecb1 100755 (executable)
--- 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(&regs, 7);
     if (regs.s && regs.m) regs.msp = m68k_areg(&regs, 7);
     if (regs.s && regs.m == 0) regs.isp = m68k_areg(&regs, 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)
index b00fc011bcd6afaea8ade02c2a6fde3735a9bd0d..b3e40260310777d9de12e1512e91863397b549af 100755 (executable)
@@ -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);
     }
 }
 
index 25c9eed3bbc118ccf8532916db79f49c65fa5418..c01b5147f789d13dbaac85a9666094a1b21684aa 100755 (executable)
@@ -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);
index b3d44a6c2c4dfaa29b4b34de9b3830b0bcd03122..6732add0f9b678a66a93d777998809e6623bf327 100755 (executable)
 #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
index b3d44a6c2c4dfaa29b4b34de9b3830b0bcd03122..211b75b1d93ec4e545f7c2981e89a770b75a94d2 100755 (executable)
 #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
index 1b4b119565022ab832553ea0ba0c4b755b963101..e2e0ba7defe1a5604b74262be96f9fe90ecffb01 100755 (executable)
@@ -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 (executable)
index 0000000..2b53e46
--- /dev/null
@@ -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
index f226872f15fdae1671961ba29cfe6252f3bbac7a..e4da2bf649198638e5e7219dd3919e21a0914c0c 100755 (executable)
@@ -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
index 8755c084a2d0a88130b562dcb871aab4db91ccec..a0aa9dde7acd18a628ba38ea150a366f7a64408e 100755 (executable)
@@ -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));
index 86bfe33ae0e35c8ece24b69782a3188978626daa..a3f0b08384f7e1046674d9a67bec9bda9f72385a 100755 (executable)
@@ -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);
     }
index 9351f0f8f201b9434c2a4a66eaf8c76113e9ebbc..51f8f20c3b5a93b77d9bdd6410522045063a2a15 100755 (executable)
@@ -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;
index 17f3ab8392bed2e6cd3e83976b40a6b34794552b..6e7f3799058fd9d66369f5d322d1c0601ce14213 100755 (executable)
@@ -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
index 27c5e5dc6b42da40c1c7aca081cbd990f5747cf8..0e3c2182e1d79e02853917fa1c0795f467bc34b2 100755 (executable)
@@ -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);
index 3da6421543d4f7a98aa87711291b7cfb12cfa36a..7511d243e12ccdf25f5a5fca5018705639ff239a 100755 (executable)
                                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"
                        >
index 25de4a7722af976efe6a2ccbdf8b1ef87b7bcbdb..2e4be0eb9380fcf2d606d67eeea7b0939a8b7250 100755 (executable)
@@ -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
index 4b448d68285e8ea1d77b9fa758d0339fa579c597..01bb34eefe977cae9b5ad652e0d47e2f32dbfabb 100755 (executable)
@@ -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);
index 019f20cc547245108644bf7f774d75c170a5d86c..b07c055c0537f04dd58b33f057f196e7f3c928bd 100755 (executable)
@@ -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);