diff --git a/src/akiko.cpp b/src/akiko.cpp index f529ea94..d0a364ee 100644 --- a/src/akiko.cpp +++ b/src/akiko.cpp @@ -410,6 +410,7 @@ static uae_u8 cdrom_command; static uae_u8 cdrom_last_rx; static int cdrom_toc_counter; +static uae_u32 cdrom_toc_crc; static uae_u8 cdrom_toc_buffer[MAX_TOC_ENTRIES * 13]; static struct cd_toc_head cdrom_toc_cd_buffer; static uae_u8 qcode_buf[SUBQ_SIZE]; @@ -695,6 +696,7 @@ static int get_cdrom_toc (void) if (s->point >= 2 && s->point < 100 && (s->control & 0x0c) != 0x04 && !secondtrack) secondtrack = addr; } + cdrom_toc_crc = get_crc32 (cdrom_toc_buffer, cdrom_toc_cd_buffer.points * 13); return 0; } static bool is_valid_data_sector(int sector) @@ -813,6 +815,13 @@ static int cdrom_command_led (void) return 0; } +static int cdrom_command_idle_status (void) +{ + cdrom_result_buffer[0] = 0x0a; + cdrom_result_buffer[1] = 0x70; + return 2; +} + static int cdrom_command_media_status (void) { cdrom_result_buffer[0] = 0x0a; @@ -1798,13 +1807,17 @@ addrbank akiko_bank = { ABFLAG_IO | ABFLAG_SAFE, S_READ, S_WRITE }; -static const uae_u8 patchdata[]={0x0c,0x82,0x00,0x00,0x03,0xe8,0x64,0x00,0x00,0x46}; +static const uae_u8 patchdata[] = { 0x0c, 0x82, 0x00, 0x00, 0x03, 0xe8, 0x64, 0x00, 0x00, 0x46 }; +static const uae_u8 patchdata2[] = { 0x0c, 0x82, 0x00, 0x00, 0x03, 0xe8, 0x4e, 0x71, 0x4e, 0x71 }; static void patchrom(void) { + int i; if (currprefs.cpu_model > 68020 || currprefs.cachesize || currprefs.m68k_speed != 0) { - uae_u8* p = extendedkickmem_bank.baseaddr; + uae_u8 *p = extendedkickmem_bank.baseaddr; if (p) { - for (unsigned int i = 0; i < 524288 - sizeof patchdata; i++) { + for (i = 0; i < 524288 - 512; i++) { + if (!memcmp(p + i, patchdata2, sizeof(patchdata2))) + return; if (!memcmp(p + i, patchdata, sizeof(patchdata))) { protect_roms(false); p[i + 6] = 0x4e; @@ -1859,6 +1872,7 @@ static int akiko_thread_do(int start) static void akiko_reset(int hardreset) { + patchrom(); cdaudiostop_do (); nvram_read (); eeprom_reset(cd32_eeprom); @@ -1931,7 +1945,6 @@ int akiko_init (void) cdrom_playing = cdrom_paused = 0; cdrom_data_offset = -1; } - patchrom (); akiko_thread_do(1); gui_flicker_led (LED_HD, 0, -1); akiko_inited = true; @@ -1996,7 +2009,7 @@ uae_u8 *save_akiko (int *len, uae_u8 *dstptr) save_u8 (cdrom_speed); save_u8 (cdrom_current_sector); - save_u32 (0); + save_u32 (cdrom_toc_crc); save_u8 (cdrom_toc_cd_buffer.points); save_u32 (cdrom_toc_cd_buffer.lastaddress); diff --git a/src/ar.cpp b/src/ar.cpp index 01621eca..cc7bf00d 100644 --- a/src/ar.cpp +++ b/src/ar.cpp @@ -1057,10 +1057,11 @@ void action_replay_cia_access(bool write) return; if (action_replay_flag == ACTION_REPLAY_INACTIVE) return; + int delay = currprefs.cpu_cycle_exact ? 1 : 0; if ((armode_write & ARMODE_ACTIVATE_BFE001) && !write) { - event2_newevent_xx(-1, 0, write, action_replay_cia_access_delay); + event2_newevent_xx(-1, delay, write, action_replay_cia_access_delay); } else if ((armode_write & ARMODE_ACTIVATE_BFD100) && write) { - event2_newevent_xx(-1, 0, write, action_replay_cia_access_delay); + event2_newevent_xx(-1, delay, write, action_replay_cia_access_delay); } } @@ -1255,6 +1256,18 @@ static uae_u8* get_checksum_location (void) return (uae_u8*)checksum_end; } +/* Replaces the existing cart checksum with a correct one. */ +/* Useful if you want to patch the rom. */ +static void action_replay_fixup_checksum (uae_u32 new_checksum) +{ + uae_u32* checksum = (uae_u32*)get_checksum_location(); + if (checksum) + do_put_mem_long (checksum, new_checksum); + else + write_log (_T("Unable to locate Checksum in ROM.\n")); + return; +} + /* Longword search on word boundary * the search_value is assumed to already be in the local endian format * return 0 on failure @@ -1418,6 +1431,7 @@ int action_replay_unload (int in_memory_reset) static int superiv_init (struct romdata *rd, struct zfile *f) { uae_u32 chip = currprefs.chipmem_size - 0x10000; + int subtype = rd->id; int flags = rd->type & ROMTYPE_MASK; const TCHAR *memname1, *memname2, *memname3; diff --git a/src/archivers/dms/pfile.cpp b/src/archivers/dms/pfile.cpp index 31085d52..b28f7b3b 100644 --- a/src/archivers/dms/pfile.cpp +++ b/src/archivers/dms/pfile.cpp @@ -1,11 +1,11 @@ /* - * xDMS v1.3 - Portable DMS archive unpacker - Public Domain - * Written by Andre Rodrigues de la Rocha - * - * Handles the processing of a single DMS archive - * - */ +* xDMS v1.3 - Portable DMS archive unpacker - Public Domain +* Written by Andre Rodrigues de la Rocha +* +* Handles the processing of a single DMS archive +* +*/ #define HEADLEN 56 @@ -51,7 +51,7 @@ UCHAR *dms_text; static void log_error(int track) { - write_log (_T("DMS: Ignored error on track %d!\n"), track); + write_log (_T("DMS: Ignored error on track %d!\n"), track); } static void addextra(const TCHAR *name, struct zfile **extra, uae_u8 *p, int size) @@ -131,10 +131,10 @@ USHORT DMS_Process_File(struct zfile *fi, struct zfile *fo, USHORT cmd, USHORT o to = (USHORT) ((b1[18]<<8) | b1[19]); /* Highest track in archive. May be incorrect if archive is "appended" */ if (part && from < 30) { - free(b1); - free(b2); - free(dms_text); - return DMS_FILE_END; + free(b1); + free(b2); + free(dms_text); + return DMS_FILE_END; } pkfsize = (ULONG) ((((ULONG)b1[21])<<16) | (((ULONG)b1[22])<<8) | (ULONG)b1[23]); /* Length of total packed data as in archive */ @@ -231,8 +231,8 @@ USHORT DMS_Process_File(struct zfile *fi, struct zfile *fo, USHORT cmd, USHORT o write_log (_T(" ------ ------- ------- ------ ---- ---- ---- -----\n")); } - // if (((cmd==CMD_UNPACK) || (cmd==CMD_SHOWBANNER)) && (geninfo & 2) && (!pwd)) - // return ERR_NOPASSWD; + // if (((cmd==CMD_UNPACK) || (cmd==CMD_SHOWBANNER)) && (geninfo & 2) && (!pwd)) + // return ERR_NOPASSWD; ret=NO_PROBLEM; @@ -259,7 +259,7 @@ USHORT DMS_Process_File(struct zfile *fi, struct zfile *fo, USHORT cmd, USHORT o } } - if ((cmd == CMD_VIEWFULL) || (cmd == CMD_SHOWDIZ) || (cmd == CMD_SHOWBANNER)) write_log(_T("\n")); + if ((cmd == CMD_VIEWFULL) || (cmd == CMD_SHOWDIZ) || (cmd == CMD_SHOWBANNER)) write_log (_T("\n")); if (ret == DMS_FILE_END) ret = NO_PROBLEM; @@ -295,14 +295,14 @@ static USHORT Process_Track(struct zfile *fi, struct zfile *fo, UCHAR *b1, UCHAR } /* "TR" identifies a Track Header */ - if ((b1[0] != 'T')||(b1[1] != 'R')) - return ERR_NOTTRACK; + if ((b1[0] != 'T')||(b1[1] != 'R')) + return ERR_NOTTRACK; /* Track Header CRC */ hcrc = (USHORT)((b1[THLEN-2] << 8) | b1[THLEN-1]); - if (dms_CreateCRC(b1,(ULONG)(THLEN-2)) != hcrc) - return ERR_THCRC; + if (dms_CreateCRC(b1,(ULONG)(THLEN-2)) != hcrc) + return ERR_THCRC; number = (USHORT)((b1[2] << 8) | b1[3]); /* Number of track */ pklen1 = (USHORT)((b1[6] << 8) | b1[7]); /* Length of packed track data as in archive */ @@ -329,15 +329,15 @@ static USHORT Process_Track(struct zfile *fi, struct zfile *fo, UCHAR *b1, UCHAR write_log (_T("%5d %5d %s %04X %04X %04X %0d\n"), pklen1, unpklen, modes[cmode], usum, hcrc, dcrc, flags); } - if ((pklen1 > TRACK_BUFFER_LEN) || (pklen2 >TRACK_BUFFER_LEN) || (unpklen > TRACK_BUFFER_LEN)) - return ERR_BIGTRACK; + if ((pklen1 > TRACK_BUFFER_LEN) || (pklen2 >TRACK_BUFFER_LEN) || (unpklen > TRACK_BUFFER_LEN)) + return ERR_BIGTRACK; - if (zfile_fread(b1,1,(size_t)pklen1,fi) != pklen1) - return ERR_SREAD; + if (zfile_fread(b1,1,(size_t)pklen1,fi) != pklen1) + return ERR_SREAD; if (dms_CreateCRC(b1,(ULONG)pklen1) != dcrc) { - log_error (number); - crcerr = 1; + log_error (number); + crcerr = 1; } /* track 80 is FILEID.DIZ, track 0xffff (-1) is Banner */ /* and track 0 with 1024 bytes only is a fake boot block with more advertising */ @@ -347,7 +347,7 @@ static USHORT Process_Track(struct zfile *fi, struct zfile *fo, UCHAR *b1, UCHAR normaltrack = false; if ((cmd == CMD_UNPACK) && (number<80) && (unpklen>2048)) { - memset(b2, 0, unpklen); + memset(b2, 0, unpklen); if (!crcerr) { Unpack_Track(b1, b2, pklen2, unpklen, cmode, flags, number, pklen1, usum, dmsflags & DMSFLAG_ENCRYPTED); } @@ -372,21 +372,21 @@ static USHORT Process_Track(struct zfile *fi, struct zfile *fo, UCHAR *b1, UCHAR } if (crcerr) - return NO_PROBLEM; + return NO_PROBLEM; if (number == 0xffff) { if (extra){ - Unpack_Track(b1, b2, pklen2, unpklen, cmode, flags, number, pklen1, usum, dmsflags & DMSFLAG_ENCRYPTED); + Unpack_Track(b1, b2, pklen2, unpklen, cmode, flags, number, pklen1, usum, dmsflags & DMSFLAG_ENCRYPTED); addextra(_T("Banner"), extra, b2, unpklen); - } + } //printbandiz(b2,unpklen); } if (number == 80) { if (extra) { - Unpack_Track(b1, b2, pklen2, unpklen, cmode, flags, number, pklen1, usum, dmsflags & DMSFLAG_ENCRYPTED); + Unpack_Track(b1, b2, pklen2, unpklen, cmode, flags, number, pklen1, usum, dmsflags & DMSFLAG_ENCRYPTED); addextra(_T("FILEID.DIZ"), extra, b2, unpklen); - } + } //printbandiz(b2,unpklen); } @@ -467,67 +467,67 @@ static void dms_decrypt(UCHAR *p, USHORT len, UCHAR *src){ static USHORT Unpack_Track(UCHAR *b1, UCHAR *b2, USHORT pklen2, USHORT unpklen, UCHAR cmode, UCHAR flags, USHORT number, USHORT pklen1, USHORT usum1, int enc) { - USHORT r, err = NO_PROBLEM; - static USHORT pass; - int maybeencrypted; - int pwrounds; - UCHAR *tmp; - USHORT prevpass = 0; + USHORT r, err = NO_PROBLEM; + static USHORT pass; + int maybeencrypted; + int pwrounds; + UCHAR *tmp; + USHORT prevpass = 0; - if (passfound) { - if (number != 80) - dms_decrypt(b1, pklen1, b1); - r = Unpack_Track_2(b1, b2, pklen2, unpklen, cmode, flags); - if (r == NO_PROBLEM) { - if (usum1 == dms_Calc_CheckSum(b2,(ULONG)unpklen)) - return NO_PROBLEM; - } - log_error(number); - if (passretries <= 0) - return ERR_CSUM; - } + if (passfound) { + if (number != 80) + dms_decrypt(b1, pklen1, b1); + r = Unpack_Track_2(b1, b2, pklen2, unpklen, cmode, flags); + if (r == NO_PROBLEM) { + if (usum1 == dms_Calc_CheckSum(b2,(ULONG)unpklen)) + return NO_PROBLEM; + } + log_error(number); + if (passretries <= 0) + return ERR_CSUM; + } - passretries--; - pwrounds = 0; - maybeencrypted = 0; - tmp = (unsigned char*)malloc (pklen1); - memcpy (tmp, b1, pklen1); - memset(b2, 0, unpklen); - for (;;) { - r = Unpack_Track_2(b1, b2, pklen2, unpklen, cmode, flags); - if (r == NO_PROBLEM) { - if (usum1 == dms_Calc_CheckSum(b2,(ULONG)unpklen)) { - passfound = maybeencrypted; - if (passfound) + passretries--; + pwrounds = 0; + maybeencrypted = 0; + tmp = (unsigned char*)malloc (pklen1); + memcpy (tmp, b1, pklen1); + memset(b2, 0, unpklen); + for (;;) { + r = Unpack_Track_2(b1, b2, pklen2, unpklen, cmode, flags); + if (r == NO_PROBLEM) { + if (usum1 == dms_Calc_CheckSum(b2,(ULONG)unpklen)) { + passfound = maybeencrypted; + if (passfound) write_log (_T("DMS: decryption key = 0x%04X\n"), prevpass); - err = NO_PROBLEM; - pass = prevpass; - break; - } - } - if (number == 80 || !enc) { - err = ERR_CSUM; - break; - } - maybeencrypted = 1; - prevpass = pass; - PWDCRC = pass; - pass++; - dms_decrypt(b1, pklen1, tmp); - pwrounds++; - if (pwrounds == 65536) { - err = ERR_CSUM; - passfound = 0; - break; - } - } - free (tmp); - return err; + err = NO_PROBLEM; + pass = prevpass; + break; + } + } + if (number == 80 || !enc) { + err = ERR_CSUM; + break; + } + maybeencrypted = 1; + prevpass = pass; + PWDCRC = pass; + pass++; + dms_decrypt(b1, pklen1, tmp); + pwrounds++; + if (pwrounds == 65536) { + err = ERR_CSUM; + passfound = 0; + break; + } + } + free (tmp); + return err; } static void printbandiz(UCHAR *m, USHORT len){ - UCHAR *i,*j; + UCHAR *i,*j; i=j=m; while (i= ARCSQNUMVALS) err = XADERR_DECRUNCH; else @@ -115,6 +118,9 @@ static uae_s32 ARCunsqueeze(struct zfile *in, struct zfile *out, struct rledata while(i >= 0 && !io.err) i = node[2*i + xadIOGetBitsLow(&io, 1)]; + if (io.err) + return XADERR_ILLEGALDATA; + i = -(i + 1); /* decode fake node index to original data value */ if(i != ARCSQSPEOF) @@ -441,8 +447,12 @@ struct zfile *unwarp(struct zfile *zf) { int i; for (i = 0; i < size; i++) { - uae_u8 v = zfile_getc (zf); - putrle (v, tmpf, algo == 3 ? &rled : NULL); + uae_s32 v = zfile_getc(zf); + if (v == -1) { + err = XADERR_ILLEGALDATA; + break; + } + putrle((uae_u8)v, tmpf, algo == 3 ? &rled : NULL); } } break; diff --git a/src/audio.cpp b/src/audio.cpp index bdb2ffd6..bc18aec4 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -1,16 +1,16 @@ - /* - * UAE - The Un*x Amiga Emulator - * - * Paula audio emulation - * - * Copyright 1995, 1996, 1997 Bernd Schmidt - * Copyright 1996 Marcus Sundberg - * Copyright 1996 Manfred Thole - * Copyright 2006 Toni Wilen - * - * new filter algorithm and anti&sinc interpolators by Antti S. Lankila - * - */ +/* +* UAE - The Un*x Amiga Emulator +* +* Paula audio emulation +* +* Copyright 1995, 1996, 1997 Bernd Schmidt +* Copyright 1996 Marcus Sundberg +* Copyright 1996 Manfred Thole +* Copyright 2006 Toni Wilen +* +* new filter algorithm and anti&sinc interpolators by Antti S. Lankila +* +*/ #include "sysconfig.h" #include "sysdeps.h" diff --git a/src/autoconf.cpp b/src/autoconf.cpp index 63798a9e..51079116 100644 --- a/src/autoconf.cpp +++ b/src/autoconf.cpp @@ -18,6 +18,7 @@ #include "autoconf.h" #include "traps.h" #include "threaddep/thread.h" +#include "native2amiga.h" #include "inputdevice.h" #include "devices.h" @@ -553,7 +554,12 @@ static uae_u32 REGPARAM2 uae_puts (TrapContext *ctx) void rtarea_init_mem (void) { - need_uae_boot_rom(&currprefs); + if (need_uae_boot_rom(&currprefs)) { + rtarea_bank.flags &= ~ABFLAG_ALLOCINDIRECT; + } else { + // not enabled and something else may use same address space + rtarea_bank.flags |= ABFLAG_ALLOCINDIRECT; + } rtarea_bank.reserved_size = RTAREA_SIZE; rtarea_bank.start = rtarea_base; if (!mapped_malloc (&rtarea_bank)) { diff --git a/src/blitfunc.cpp b/src/blitfunc.cpp index 6288ee28..9d48a820 100644 --- a/src/blitfunc.cpp +++ b/src/blitfunc.cpp @@ -1,6 +1,5 @@ #include "sysconfig.h" #include "sysdeps.h" -#include "savestate.h" #include "options.h" #include "custom.h" #include "memory.h" diff --git a/src/blittable.cpp b/src/blittable.cpp index 5d7c2724..5ffb09da 100644 --- a/src/blittable.cpp +++ b/src/blittable.cpp @@ -3,7 +3,6 @@ #include "options.h" #include "custom.h" #include "memory.h" -#include "savestate.h" #include "blitter.h" #include "blitfunc.h" diff --git a/src/blitter.cpp b/src/blitter.cpp index 328c427a..82ee4b75 100644 --- a/src/blitter.cpp +++ b/src/blitter.cpp @@ -14,9 +14,9 @@ #include "memory.h" #include "custom.h" #include "newcpu.h" -#include "savestate.h" #include "blitter.h" #include "blit.h" +#include "savestate.h" /* we must not change ce-mode while blitter is running.. */ static int blitter_cycle_exact, immediate_blits; @@ -313,11 +313,11 @@ int blitter_channel_state (void) return channel_state (blit_cyclecounter); } -STATIC_INLINE int canblit(int hpos) +STATIC_INLINE int canblit (int hpos) { - if (!dmaen(DMA_BLITTER)) + if (!dmaen (DMA_BLITTER)) return -1; - if (is_bitplane_dma(hpos)) + if (is_bitplane_dma (hpos)) return 0; if (cycle_line[hpos] & CYCLE_MASK) { return 0; @@ -1076,7 +1076,9 @@ void do_blitter (int hpos) bltstate = BLT_done; + blitter_cycle_exact = currprefs.blitter_cycle_exact; immediate_blits = currprefs.immediate_blits; + blt_info.got_cycle = 0; last_blitter_hpos = hpos + 1; blit_firstline_cycles = blit_first_cycle = get_cycles (); blit_misscyclecounter = 0; @@ -1119,14 +1121,18 @@ void do_blitter (int hpos) return; } + if (dmaen (DMA_BLITTER)) { + blt_info.got_cycle = 1; + } + if (immediate_blits) { if (dmaen (DMA_BLITTER)) blitter_doit (); return; } - - blit_cyclecounter = cycles * (blit_dmacount2 + (blit_nod ? 0 : 1)); - event2_newevent (ev2_blitter, blit_cyclecounter, 0); + + blit_cyclecounter = cycles * (blit_dmacount2 + (blit_nod ? 0 : 1)); + event2_newevent (ev2_blitter, blit_cyclecounter, 0); } void blitter_check_start (void) @@ -1137,7 +1143,7 @@ void blitter_check_start (void) bltstate = BLT_work; if (immediate_blits) { blitter_doit (); - } + } } void maybe_blit2 (int hack) diff --git a/src/include/blitter.h b/src/include/blitter.h index ecad9e8a..e5756d86 100644 --- a/src/include/blitter.h +++ b/src/include/blitter.h @@ -9,6 +9,7 @@ #ifndef UAE_BLITTER_H #define UAE_BLITTER_H +#include "savestate.h" #include "uae/types.h" struct bltinfo {