From b1eba923de8a779d9ca4fedd397dcb996627b275 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 29 Sep 2007 19:33:46 +0300 Subject: [PATCH] imported winuaesrc1450b1.zip --- akiko.c | 16 +- archivers/lzx/unlzx.c | 45 +- bsdsocket.c | 10 +- cdtv.c | 20 +- custom.c | 6 + expansion.c | 3 +- include/akiko.h | 2 + include/cdtv.h | 2 + include/options.h | 2 +- od-win32/WinUAE_Install.nsi | 2 +- od-win32/bsdsock.c | 2 +- od-win32/mman.c | 8 +- od-win32/parser.c | 35 +- od-win32/picasso96_win.c | 62 +- od-win32/resources/RCa00564 | Bin 85728 -> 0 bytes od-win32/resources/RCa03440 | Bin 149524 -> 0 bytes od-win32/resources/resource.hm | 3 - od-win32/resources/resource.hx | 938 ---------------------- od-win32/resources/winuae.rc | 10 +- od-win32/resources/winuae_minimal.rc | 102 +-- od-win32/soundcheck.c | 26 +- od-win32/win32.c | 21 +- od-win32/win32.h | 6 +- od-win32/win32gfx.c | 15 +- od-win32/winuae_msvc/winuae_msvc.8.vcproj | 4 - od-win32/winuaechangelog.txt | 21 +- zfile.c | 63 +- 27 files changed, 309 insertions(+), 1115 deletions(-) delete mode 100755 od-win32/resources/RCa00564 delete mode 100755 od-win32/resources/RCa03440 delete mode 100755 od-win32/resources/resource.hm delete mode 100755 od-win32/resources/resource.hx diff --git a/akiko.c b/akiko.c index 4798faea..4d180d8d 100755 --- a/akiko.c +++ b/akiko.c @@ -35,7 +35,7 @@ static void irq(void) { if (!(intreq & 8)) { - INTREQ_f(0x8000 | 0x0008); + INTREQ_0 (0x8000 | 0x0008); } } @@ -387,14 +387,24 @@ static int unitnum = -1; static int cdromok = 0; static int cd_hunt; +static void checkint (void) +{ + if (cdrom_status1 & cdrom_status2) + irq(); +} static void set_status(uae_u32 status) { cdrom_status1 |= status; - if (cdrom_status1 & cdrom_status2) - irq(); + checkint (); } +void rethink_akiko (void) +{ + checkint (); +} + + static uae_u8 frombcd (uae_u8 v) { return (v >> 4) * 10 + (v & 15); diff --git a/archivers/lzx/unlzx.c b/archivers/lzx/unlzx.c index 2887833c..a55b4c10 100755 --- a/archivers/lzx/unlzx.c +++ b/archivers/lzx/unlzx.c @@ -610,20 +610,22 @@ struct zfile *archive_access_lzx (struct znode *zn) unsigned int startpos; struct znode *znfirst, *znlast; struct zfile *zf = zn->volume->archive; - struct zfile *dstf; + struct zfile *dstf, *newzf; uae_u8 *buf, *dbuf; unsigned int compsize, unpsize; dstf = NULL; buf = dbuf = NULL; + newzf = NULL; /* find first file in compressed block */ unpsize = 0; znfirst = zn; while (znfirst->prev) { - znfirst = znfirst->prev; - if (!znfirst || znfirst->offset != 0) + struct znode *zt = znfirst->prev; + if (!zt || zt->offset != 0) break; + znfirst = zt; unpsize += znfirst->size; } /* find last file in compressed block */ @@ -642,7 +644,7 @@ struct zfile *archive_access_lzx (struct znode *zn) zfile_fseek (zf, startpos, SEEK_SET); buf = xmalloc(compsize); zfile_fread (buf, compsize, 1, zf); - dbuf = xmalloc (unpsize); + dbuf = xcalloc (unpsize, 1); /* unpack complete block */ memset(offset_len, 0, sizeof offset_len); @@ -654,18 +656,20 @@ struct zfile *archive_access_lzx (struct znode *zn) global_shift = -16; last_offset = 1; destination = dbuf; - while (unpsize > 0) { - uae_u8 *pdest = destination; - if (!read_literal_table()) { - int s; - destination_end = destination + decrunch_length; - decrunch(); - s = destination - pdest; - unpsize -= s; - crc_calc (pdest, s); - } else { - write_log ("LZX corrupt compressed data\n"); - goto end; + if (compsize == unpsize) { + memcpy (dbuf, buf, unpsize); + } else { + while (unpsize > 0) { + uae_u8 *pdest = destination; + if (!read_literal_table()) { + destination_end = destination + decrunch_length; + decrunch(); + unpsize -= decrunch_length; + crc_calc (pdest, decrunch_length); + } else { + write_log ("LZX corrupt compressed data %s\n", zn->name); + goto end; + } } } /* pre-cache all files we just decompressed */ @@ -674,6 +678,8 @@ struct zfile *archive_access_lzx (struct znode *zn) dstf = zfile_fopen_empty (znfirst->name, znfirst->size); zfile_fwrite(dbuf + znfirst->offset2, znfirst->size, 1, dstf); znfirst->f = dstf; + if (znfirst == zn) + newzf = zfile_dup (dstf); } if (znfirst == znlast) break; @@ -682,7 +688,7 @@ struct zfile *archive_access_lzx (struct znode *zn) end: xfree(buf); xfree(dbuf); - return zn->f; + return newzf; } struct zvolume *archive_directory_lzx (struct zfile *in_file) @@ -786,7 +792,6 @@ struct zvolume *archive_directory_lzx (struct zfile *in_file) zn = zvolume_addfile_abs(zv, &zai); zn->offset2 = merge_size; - //write_log ("%d %d %d %s\n", unpack_size, merge_size, pack_size, zai.name); total_pack += pack_size; total_unpack += unpack_size; total_files++; @@ -804,6 +809,10 @@ struct zvolume *archive_directory_lzx (struct zfile *in_file) } else abort = 0; /* continue */ + + //write_log ("unp=%6d mrg=%6d pack=%6d off=%6d %s\n", unpack_size, merge_size, pack_size, zn->offset, zai.name); + + } } } diff --git a/bsdsocket.c b/bsdsocket.c index c2752d0c..5f5ee44b 100755 --- a/bsdsocket.c +++ b/bsdsocket.c @@ -1420,20 +1420,20 @@ void bsdlib_reset (void) SockLibBase = 0; - write_log("BSDSOCK: cleanup starting..\n"); - host_sbcleanup (NULL); - for (sb = socketbases; sb; sb = nsb) { + write_log("BSDSOCK: cleanup start..\n"); + host_sbcleanup (NULL); + for (sb = socketbases; sb; sb = nsb) { nsb = sb->next; write_log("BSDSOCK: cleanup start socket %x\n", sb); host_sbcleanup (sb); - write_log("BSDSOCK: cleanup end\n"); free (sb->dtable); free (sb->ftable); free (sb); } + write_log("BSDSOCK: cleanup end\n"); socketbases = NULL; #if 1 @@ -1448,7 +1448,7 @@ void bsdlib_reset (void) } host_sbreset (); - write_log("BSDSOCK: cleanup end\n"); + write_log("BSDSOCK: cleanup finished\n"); } static const TrapHandler sockfuncs[] = { diff --git a/cdtv.c b/cdtv.c index 0115ba68..de93d5ce 100755 --- a/cdtv.c +++ b/cdtv.c @@ -87,7 +87,7 @@ static void do_stch(void); static void INT2(void) { if (!(intreq & 8)) { - INTREQ_f(0x8000 | 0x0008); + INTREQ_0 (0x8000 | 0x0008); } } @@ -682,7 +682,7 @@ static void tp_check_interrupts(void) return; if (sten == 1) { - if (!(tp_air & (1 << 3)) && (tp_cd & (1 << 3))) { + if (tp_cd & (1 << 3)) { tp_air |= 1 << 3; INT2(); } @@ -820,6 +820,7 @@ static void do_hunt(void) static void checkint(void) { int irq = 0; + if (currprefs.cs_cdtvscsi && (wdscsi_getauxstatus() & 0x80)) { dmac_istr |= ISTR_INTS; if ((dmac_cntr & CNTR_INTEN) && (dmac_istr & ISTR_INTS)) @@ -831,6 +832,13 @@ static void checkint(void) INT2(); } +void rethink_cdtv (void) +{ + checkint (); + tp_check_interrupts (); +} + + void CDTV_hsync_handler(void) { static int subqcnt; @@ -881,10 +889,8 @@ void CDTV_hsync_handler(void) if (cd_playing) gui_cd_led (1); if (cd_media && (tp_cr & 1)) { - if (!(tp_air & (1 << 1))) { - tp_air |= 1 << 1; - INT2(); - } + tp_air |= 1 << 1; + INT2(); } subqcnt--; @@ -1266,7 +1272,7 @@ static void ew (int addr, uae_u32 value) addrbank dmac_bank = { dmac_lget, dmac_wget, dmac_bget, dmac_lput, dmac_wput, dmac_bput, - default_xlate, default_check, NULL, "CDTV CD Controller", + default_xlate, default_check, NULL, "CDTV DMAC/CD Controller", dummy_lgeti, dummy_wgeti, ABFLAG_IO }; diff --git a/custom.c b/custom.c index 7bbd8c82..4c19e33e 100755 --- a/custom.c +++ b/custom.c @@ -2694,6 +2694,12 @@ void INTREQ_f(uae_u32 data) #ifdef A2091 rethink_a2091 (); #endif +#ifdef CDTV + rethink_cdtv (); +#endif +#ifdef CD32 + rethink_akiko (); +#endif } static void INTREQ_d (uae_u16 v, int d) diff --git a/expansion.c b/expansion.c index 56c4f2e9..ce4a0164 100755 --- a/expansion.c +++ b/expansion.c @@ -1184,7 +1184,8 @@ void expamem_reset (void) } z3fastmem_start = currprefs.z3fastmem_start; - p96ram_start = currprefs.z3fastmem_start + ((currprefs.z3fastmem_size + 0xffffff) & ~0xffffff); + if (!p96mode) + p96ram_start = currprefs.z3fastmem_start + ((currprefs.z3fastmem_size + 0xffffff) & ~0xffffff); (*card_init[0]) (); } diff --git a/include/akiko.h b/include/akiko.h index 6292538a..862073d2 100755 --- a/include/akiko.h +++ b/include/akiko.h @@ -12,3 +12,5 @@ extern void akiko_exitgui (void); extern void AKIKO_hsync_handler (void); extern uae_u8 *extendedkickmemory; + +extern void rethink_akiko (void); \ No newline at end of file diff --git a/include/cdtv.h b/include/cdtv.h index 203c2342..1605e306 100755 --- a/include/cdtv.h +++ b/include/cdtv.h @@ -22,5 +22,7 @@ int cdtv_add_scsi_unit(int ch, char *path, int blocksize, int readonly, extern void cdtv_getdmadata(uae_u32*); +extern void rethink_cdtv (void); + #endif diff --git a/include/options.h b/include/options.h index 720c28d8..a788e1e0 100755 --- a/include/options.h +++ b/include/options.h @@ -9,7 +9,7 @@ #define UAEMAJOR 1 #define UAEMINOR 4 -#define UAESUBREV 4 +#define UAESUBREV 5 typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang; diff --git a/od-win32/WinUAE_Install.nsi b/od-win32/WinUAE_Install.nsi index 480705ab..1b36eb29 100755 --- a/od-win32/WinUAE_Install.nsi +++ b/od-win32/WinUAE_Install.nsi @@ -1,5 +1,5 @@ !define PRODUCT_NAME "WinUAE" -!define PRODUCT_VERSION "1.4.3" +!define PRODUCT_VERSION "1.4.4" !define PRODUCT_PUBLISHER "Arabuusimiehet" !define PRODUCT_WEB_SITE "http://www.winuae.net/" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\winuae.exe" diff --git a/od-win32/bsdsock.c b/od-win32/bsdsock.c index e0c292ca..803e1a90 100755 --- a/od-win32/bsdsock.c +++ b/od-win32/bsdsock.c @@ -260,7 +260,6 @@ void deinit_socket_layer(void) { if (!bsd) return; - WSACleanup(); if(bsd->hSockThread) { HANDLE t = bsd->hSockThread; DeleteCriticalSection(&bsd->csSigQueueLock); @@ -279,6 +278,7 @@ void deinit_socket_layer(void) UnregisterClass ("SocketFun", hInst); } close_selectget_threads (); + WSACleanup(); } #ifdef BSDSOCKET diff --git a/od-win32/mman.c b/od-win32/mman.c index 76fc2910..d2c10a29 100755 --- a/od-win32/mman.c +++ b/od-win32/mman.c @@ -242,6 +242,7 @@ void *shmat(int shmid, void *shmaddr, int shmflg) { void *result = (void *)-1; BOOL got = FALSE; + int p96special = FALSE; #ifdef NATMEM_OFFSET unsigned int size=shmids[shmid].size; @@ -296,6 +297,7 @@ void *shmat(int shmid, void *shmaddr, int shmflg) if(!strcmp(shmids[shmid].name,"gfx")) { got = TRUE; if (p96mode) { + p96special = TRUE; p96ram_start = p96mem_offset - natmem_offset; shmaddr = natmem_offset + p96ram_start; } else { @@ -347,7 +349,7 @@ void *shmat(int shmid, void *shmaddr, int shmflg) if (got == FALSE) { if (shmaddr) virtualfreewithlock(shmaddr, os_winnt ? size : 0, os_winnt ? MEM_DECOMMIT : MEM_RELEASE); - result = virtualallocwithlock(shmaddr, size, os_winnt ? MEM_COMMIT : (MEM_RESERVE | MEM_COMMIT | (p96mode ? MEM_WRITE_WATCH : 0)), + result = virtualallocwithlock(shmaddr, size, os_winnt ? MEM_COMMIT : (MEM_RESERVE | MEM_COMMIT | (p96special ? MEM_WRITE_WATCH : 0)), PAGE_EXECUTE_READWRITE); if (result == NULL) { result = (void*)-1; @@ -358,9 +360,9 @@ void *shmat(int shmid, void *shmaddr, int shmflg) if (memorylocking && os_winnt) VirtualLock(shmaddr, size); shmids[shmid].attached = result; - write_log ("VirtualAlloc %08.8X - %08.8X %x (%dk) ok\n", + write_log ("VirtualAlloc %08.8X - %08.8X %x (%dk) ok%s\n", (uae_u8*)shmaddr - natmem_offset, (uae_u8*)shmaddr - natmem_offset + size, - size, size >> 10); + size, size >> 10, p96special ? " P96" : ""); } } else { shmids[shmid].attached = shmaddr; diff --git a/od-win32/parser.c b/od-win32/parser.c index 0e661099..4600e260 100755 --- a/od-win32/parser.c +++ b/od-win32/parser.c @@ -1200,21 +1200,36 @@ int enumserialports(void) cnt = enumserialports_2(); for (i = 0; i < 10; i++) { sprintf(name, "COM%d", i); - if (!QueryDosDevice(name, devname, sizeof devname)) { + if (!QueryDosDevice(name, devname, sizeof devname)) continue; - } else { - for(j = 0; j < cnt; j++) { - if (!strcmp(comports[j].cfgname, name)) - break; - } - if (j == cnt) { - if (cnt >= MAX_SERIAL_PORTS) - break; + for(j = 0; j < cnt; j++) { + if (!strcmp(comports[j].cfgname, name)) + break; + } + if (j == cnt) { + if (cnt >= MAX_SERIAL_PORTS) + break; + comports[j].dev = xmalloc(100); + sprintf(comports[cnt].dev, "\\.\\\\%s", name); + comports[j].cfgname = my_strdup (name); + comports[j].name = my_strdup (name); + write_log ("SERPORT: %d:'%s' = '%s' (%s)\n", cnt, comports[j].name, comports[j].dev, devname); + cnt++; + } + } + if (cnt == 0 && !os_winnt) { + /* windows 98 hack */ + for (i = 0; i < 8; i++) { + COMMCONFIG cc; + DWORD size = sizeof(COMMCONFIG); + sprintf(name, "COM%d", i); + if(GetDefaultCommConfig (name, &cc, &size)) { + j = cnt; comports[j].dev = xmalloc(100); sprintf(comports[cnt].dev, "\\.\\\\%s", name); comports[j].cfgname = my_strdup (name); comports[j].name = my_strdup (name); - write_log ("SERPORT: %d:'%s' = '%s' (%s)\n", cnt, comports[j].name, comports[j].dev, devname); + write_log ("W98SERPORT: %d:'%s'\n", cnt, comports[j].name); cnt++; } } diff --git a/od-win32/picasso96_win.c b/od-win32/picasso96_win.c index a0e7227b..6750fc5b 100755 --- a/od-win32/picasso96_win.c +++ b/od-win32/picasso96_win.c @@ -3374,11 +3374,12 @@ extern int p96mode; static void flushpixels_rgbx(uae_u8 *dst) { - int i, j; + int i, j, off; int rowwidth_src = picasso_vidinfo.width * picasso_vidinfo.pixbytes; int rowwidth_dst = picasso96_state.Width * picasso96_state.BytesPerPixel; ULONG ps; ULONG_PTR gwwcnt; + uae_u8 *src = p96ram_start + natmem_offset; if (!picasso_vidinfo.extra_mem) return; @@ -3386,22 +3387,47 @@ static void flushpixels_rgbx(uae_u8 *dst) gwwbufsize = allocated_gfxmem / 4096 + 1; gwwbuf = xmalloc (gwwbufsize * sizeof (void*)); } - gwwcnt = gwwbufsize; - if (GetWriteWatch(WRITE_WATCH_FLAG_RESET, p96ram_start + natmem_offset, allocated_gfxmem, gwwbuf, &gwwcnt, &ps)) - return; - for (i = 0; i < gwwcnt; i++) { - uae_u8 *p = gwwbuf[i]; - uaecptr addr = p - p96ram_start - natmem_offset; - for (j = 0; j < ps / 4; j++) { - int xbytes, y; - uae_u32 *dst2; - y = addr / picasso96_state.BytesPerRow; - xbytes = addr % picasso96_state.BytesPerRow; - dst2 = (uae_u32*)(dst + y * picasso_vidinfo.rowbytes + xbytes); - if (xbytes < rowwidth_dst && y < picasso96_state.Height) - *dst2 = ((uae_u32*)p)[0]; - addr += 4; - p += 4; + for (;;) { + gwwcnt = gwwbufsize; + if (GetWriteWatch(WRITE_WATCH_FLAG_RESET, src, allocated_gfxmem, gwwbuf, &gwwcnt, &ps)) + return; + if (gwwcnt == 0) + return; + off = picasso96_state.XYOffset - gfxmem_start; + for (i = 0; i < gwwcnt; i++) { + uae_u8 *p = gwwbuf[i]; + uaecptr addr = (p - src) - off; + int y = addr / picasso96_state.BytesPerRow; + int yend = (addr + ps + picasso96_state.BytesPerRow - 1) / picasso96_state.BytesPerRow; + uae_u8 *src2 = src + y * picasso96_state.BytesPerRow + off; + uae_u8 *dst2 = dst + y * picasso_vidinfo.rowbytes; + + while (y <= yend && y < picasso96_state.Height) { +#if 0 + for (j = 0; j < rowwidth_dst; j++) + dst2[j] = src2[j] ^ 0xff; +#else + memcpy (dst2, src2, rowwidth_dst); +#endif + src2 += picasso96_state.BytesPerRow; + dst2 += picasso_vidinfo.rowbytes; + y++; + } + +#if 0 + for (j = 0; j < ps / 4; j++) { + int xbytes, y; + uae_u32 *dst2; + y = addr / picasso96_state.BytesPerRow; + xbytes = addr % picasso96_state.BytesPerRow; + if (xbytes < rowwidth_dst && y < picasso96_state.Height) { + dst2 = (uae_u32*)(dst + y * picasso_vidinfo.rowbytes + xbytes); + *dst2 = ((uae_u32*)p)[0]; + } + addr += 4; + p += 4; + } +#endif } } } @@ -3499,6 +3525,8 @@ static void flushpixels(void) if (p96mode) { if(picasso_vidinfo.rgbformat == picasso96_state.RGBFormat) flushpixels_rgbx(dst); + else + write_log("!"); } else { if(picasso_vidinfo.rgbformat == picasso96_state.RGBFormat) flushpixels_rgb(dst); diff --git a/od-win32/resources/RCa00564 b/od-win32/resources/RCa00564 deleted file mode 100755 index 6415f0b234f130b3929a0520536e3157673fcabb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85728 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 11000) { - if (minfreq > freq) { + if (DSCaps.dwFlags & DSCAPS_CONTINUOUSRATE) { + int minfreq = DSCaps.dwMinSecondarySampleRate; + int maxfreq = DSCaps.dwMaxSecondarySampleRate; + if (minfreq > freq && freq < 22050) { freq = minfreq; - sounddata_frequency = freq; write_log ("SOUND: minimum supported frequency: %d\n", minfreq); } - if (maxfreq < freq) { + if (maxfreq < freq && freq > 44100) { freq = maxfreq; - sounddata_frequency = freq; write_log ("SOUND: maximum supported frequency: %d\n", maxfreq); } - } else { - write_log ("SOUND: ignored weird min (%d) or max (%d) sample rate\n", minfreq, maxfreq); } memset (&sound_buffer, 0, sizeof (sound_buffer)); @@ -255,7 +250,7 @@ static HWND GetConsoleHwnd(void) // ensure window title has been updated - Sleep(40); + Sleep(1000); // look for NewWindowTitle @@ -510,7 +505,7 @@ static int osdetect (void) return 1; } -static int srates[] = { 22050, 32000, 44100, 0 }; +static int srates[] = { 22050, 44100, 48000, 0 }; int main (int argc, char **argv) { @@ -518,7 +513,8 @@ int main (int argc, char **argv) logfile = fopen("soundlog.txt","w"); osdetect(); - write_log2("OS: %s %d.%d%s\n", os_winnt ? "NT" : "W9X/ME", osVersion.dwMajorVersion, osVersion.dwMinorVersion, os_winnt_admin ? " (Admin)" : ""); + write_log2("WinUAE soundtest 0.2. OS: %s %d.%d%s\n", + os_winnt ? "NT" : "W9X/ME", osVersion.dwMajorVersion, osVersion.dwMinorVersion, os_winnt_admin ? " (Admin)" : ""); init_mmtimer(); if (!QueryPerformanceFrequency(&qpf)) { diff --git a/od-win32/win32.c b/od-win32/win32.c index e1896231..332fd920 100755 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -409,7 +409,7 @@ static int figure_processor_speed (void) dummythread_die = 1; sleep_resolution = 1; - if (clkdiv >= 0.90 && clkdiv <= 1.10 && rpt_available) { + if ((clkdiv >= 0.90 && clkdiv <= 1.10 && rpt_available) && no_rdtsc < 2) { limit = 2.5; if (mm_timerres && (ratea1 / ratecnt) < limit * clockrate1000) { /* MM-timer is ok */ timermode = 0; @@ -2615,8 +2615,11 @@ static int osdetect (void) if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) os_64bit = 1; } - if (!os_winnt) + if (!os_winnt) { + extern int p96mode; + p96mode = 0; return 1; + } os_winnt_admin = isadminpriv (); if (os_winnt_admin) { if (pIsUserAnAdmin) { @@ -2814,7 +2817,7 @@ static void getstartpaths(void) } extern void test (void); -extern int screenshotmode, b0rken_ati_overlay, postscript_print_debugging, sound_debug, log_uaeserial; +extern int screenshotmode, postscript_print_debugging, sound_debug, log_uaeserial; extern int force_direct_catweasel, max_allowed_mman, sound_mode_skip; extern DWORD_PTR cpu_affinity; @@ -2881,14 +2884,6 @@ static int process_arg(char **xargv) continue; } #endif - if (!strcmp (arg, "-disableowr")) { - b0rken_ati_overlay = -1; - continue; - } - if (!strcmp (arg, "-enableowr")) { - b0rken_ati_overlay = 1; - continue; - } if (!strcmp (arg, "-nordtsc")) { no_rdtsc = 1; continue; @@ -2897,6 +2892,10 @@ static int process_arg(char **xargv) no_rdtsc = -1; continue; } + if (!strcmp (arg, "-busywait")) { + no_rdtsc = 2; + continue; + } if (!strcmp (arg, "-norawinput")) { no_rawinput = 1; continue; diff --git a/od-win32/win32.h b/od-win32/win32.h index b6b5df2c..595e6d66 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 0 -#define WINUAEPUBLICBETA 0 -#define WINUAEDATE MAKEBD(2007, 9, 22) +#define WINUAEBETA 1 +#define WINUAEPUBLICBETA 1 +#define WINUAEDATE MAKEBD(2007, 9, 29) #define WINUAEEXTRA "" #define WINUAEREV "" diff --git a/od-win32/win32gfx.c b/od-win32/win32gfx.c index c8b9fbf9..e2fd57f0 100755 --- a/od-win32/win32gfx.c +++ b/od-win32/win32gfx.c @@ -94,7 +94,6 @@ static int screen_is_initialized; int display_change_requested, normal_display_change_starting; int window_led_drives, window_led_drives_end; extern int console_logging; -int b0rken_ati_overlay; #define SM_WINDOW 0 #define SM_WINDOW_OVERLAY 1 @@ -569,10 +568,14 @@ BOOL CALLBACK displaysCallback (GUID *guid, LPSTR desc, LPSTR name, LPVOID ctx, GetMonitorInfo(hm, (LPMONITORINFO)&lpmi); } md->rect = lpmi.rcMonitor; - if (md->rect.left == 0 && md->rect.top == 0) - sprintf (tmp, "%s (%d*%d)", desc, md->rect.right - md->rect.left, md->rect.bottom - md->rect.top); - else - sprintf (tmp, "%s (%d*%d) [%d*%d]", desc, md->rect.right - md->rect.left, md->rect.bottom - md->rect.top, md->rect.left, md->rect.top); + if (os_winnt) { + if (md->rect.left == 0 && md->rect.top == 0) + sprintf (tmp, "%s (%d*%d)", desc, md->rect.right - md->rect.left, md->rect.bottom - md->rect.top); + else + sprintf (tmp, "%s (%d*%d) [%d*%d]", desc, md->rect.right - md->rect.left, md->rect.bottom - md->rect.top, md->rect.left, md->rect.top); + } else { + strcpy (tmp, desc); + } md->name = my_strdup (tmp); write_log ("'%s' '%s' %s\n", desc, name, outGUID(guid)); return 1; @@ -754,7 +757,7 @@ void setoverlay(int quick) MONITORINFO mi; if (quick) { - if (!(currentmode->flags & DM_OVERLAY) || b0rken_ati_overlay <= 0) + if (!(currentmode->flags & DM_OVERLAY)) return; goto end; } diff --git a/od-win32/winuae_msvc/winuae_msvc.8.vcproj b/od-win32/winuae_msvc/winuae_msvc.8.vcproj index ca425e2d..3d5c99fc 100755 --- a/od-win32/winuae_msvc/winuae_msvc.8.vcproj +++ b/od-win32/winuae_msvc/winuae_msvc.8.vcproj @@ -2489,10 +2489,6 @@ RelativePath="..\hq2x32.obj" > - - diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 3820063f..02fc315b 100755 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,8 +1,27 @@ +Beta 1: + +- CDTV and CD32 interrupt handling improved, fixes "Snoopy In The + Case Of The Missing Blanket" +- lzx decompressor compatibility and stability improved, store-mode + supported +- do not include display dimensions in display list if Windows 98/ME + (it is garbage, at least on some systems) +- Windows 98/ME serial port detection update +- possible fix for overlay issues but it might cause slow downs in + some cases.. +- added -busywait debugging command line option +- DiskSqueeze (dsq) dms-like disk packer format supported (probably + totally useless but was easy to do..) cop, dimp, warp (not to be + confused with mfmwarp) support may be "useful" too, perhaps in + future.. Unfortunately most formats are not documented. + +1.4.4 + Beta 9: RC2 - deleting file, recycle bin support enabled and deletion fails: - return error code was wrong (SHFileOperation() is weird) + returned error code was wrong (SHFileOperation() is weird) - Action Replay 1/2/3 work again - bsdsocket froze if new configuration was loaded on the fly - filter crashes (old bug) if display was big, also centering code diff --git a/zfile.c b/zfile.c index 49ffbf4e..3efed15a 100755 --- a/zfile.c +++ b/zfile.c @@ -92,6 +92,7 @@ void zfile_fclose (struct zfile *f) } static uae_u8 exeheader[]={0x00,0x00,0x03,0xf3,0x00,0x00,0x00,0x00}; +static char *diskimages[] = { "adf", "adz", "ipf", "fdi", "dms", "dsq", 0 }; int zfile_gettype (struct zfile *z) { uae_u8 buf[8]; @@ -101,21 +102,16 @@ int zfile_gettype (struct zfile *z) return ZFILE_UNKNOWN; ext = strrchr (z->name, '.'); if (ext != NULL) { + int i; ext++; - if (strcasecmp (ext, "adf") == 0) - return ZFILE_DISKIMAGE; - if (strcasecmp (ext, "adz") == 0) - return ZFILE_DISKIMAGE; + for (i = 0; diskimages[i]; i++) { + if (strcasecmp (ext, diskimages[i]) == 0) + return ZFILE_DISKIMAGE; + } if (strcasecmp (ext, "roz") == 0) return ZFILE_ROM; - if (strcasecmp (ext, "ipf") == 0) - return ZFILE_DISKIMAGE; - if (strcasecmp (ext, "fdi") == 0) - return ZFILE_DISKIMAGE; if (strcasecmp (ext, "uss") == 0) return ZFILE_STATEFILE; - if (strcasecmp (ext, "dms") == 0) - return ZFILE_DISKIMAGE; if (strcasecmp (ext, "rom") == 0) return ZFILE_ROM; if (strcasecmp (ext, "key") == 0) @@ -219,13 +215,52 @@ struct zfile *zfile_gunzip (struct zfile *z) return z2; } +static struct zfile *dsq (struct zfile *z) +{ + struct zfile *zo; + + zo = zfile_fopen_empty ("zipped.dsq", 1760 * 512); + if (zo) { + struct zvolume *zv = archive_directory_lzx (z); + if (zv) { + if (zv->root.child) { + struct zfile *zi = archive_access_lzx (zv->root.child); + if (zi) { + uae_u8 *buf = zi->data; + if (!memcmp (buf, "PKD", 3)) { + int sectors = buf[18]; + int heads = buf[15]; + int blocks = (buf[6] << 8) | buf[7]; + int blocksize = (buf[10] << 8) | buf[11]; + if (blocksize == 512 && blocks == 1760 && sectors == 22 && heads == 2) { + int off = 52; + int i; + for (i = 0; i < blocks / (sectors / heads); i++) { + zfile_fwrite (zi->data + off, sectors * blocksize / heads, 1, zo); + off += sectors * (blocksize + 16) / heads; + } + zfile_fclose_archive (zv); + zfile_fclose (z); + return zo; + } + } + } + zfile_fclose (zi); + } + } + zfile_fclose (zo); + } + return z; +} + static struct zfile *dms (struct zfile *z) { int ret; struct zfile *zo; zo = zfile_fopen_empty ("zipped.dms", 1760 * 512); - if (!zo) return z; + if (!zo) + return z; ret = DMS_Process_File (z, zo, CMD_UNPACK, OPT_VERBOSE, 0, 0); if (ret == NO_PROBLEM || ret == DMS_FILE_END) { zfile_fclose (z); @@ -237,7 +272,7 @@ static struct zfile *dms (struct zfile *z) const char *uae_ignoreextensions[] = { ".gif", ".jpg", ".png", ".xml", ".pdf", ".txt", 0 }; const char *uae_diskimageextensions[] = - { ".adf", ".adz", ".ipf", ".fdi", ".exe", ".dms", 0 }; + { ".adf", ".adz", ".ipf", ".fdi", ".exe", ".dms", ".dsq", 0 }; int zfile_is_ignore_ext(const char *name) @@ -332,6 +367,8 @@ static struct zfile *zuncompress (struct zfile *z, int dodefault) return zfile_gunzip (z); if (strcasecmp (ext, "dms") == 0) return dms (z); + if (strcasecmp (ext, "dsq") == 0) + return dsq (z); #if defined(ARCHIVEACCESS) for (i = 0; plugins_7z_x[i]; i++) { if (strcasecmp (ext, plugins_7z[i]) == 0) @@ -536,7 +573,7 @@ struct zfile *zfile_fopen (const char *name, const char *mode) struct zfile *zfile_dup (struct zfile *zf) { struct zfile *nzf; - if (!zf->data) + if (!zf || !zf->data) return NULL; nzf = zfile_create(); nzf->data = (uae_u8*)malloc (zf->size); -- 2.47.3