imported winuaesrc1000b11.zip

This commit is contained in:
Toni Wilen 2005-02-12 15:35:09 +02:00
parent 432c015a4b
commit 8115e475ca
27 changed files with 2034 additions and 205 deletions

View File

@ -47,11 +47,11 @@ static struct arcadiarom roms[] = {
{ "ar_dart.zip", "scpa211", "dart_", 1, 4, 0, 7, 6, 3, 1, 2, 5, 0x98f564 },
{ "ar_fast.zip", "scpav3_0.1", "fastv28.", 0, 7, 6, 5, 4, 3, 2, 1, 0, 0x9902bc },
{ "ar_ldrb.zip", "scpa211", "lbg240", 0, 7, 6, 5, 4, 3, 2, 1, 0, 0x98f564 },
{ "ar_ldrba.zip", "ar_ldrb.zip/scpa211", "ldrb_", 1, 2, 3, 4, 1, 0, 7, 5, 6, 0x98f564 },
{ "ar_ldrba.zip", "scpa211", "ldrb_", 1, 2, 3, 4, 1, 0, 7, 5, 6, 0x98f564 },
{ "ar_ninj.zip", "scpa211", "ninj_", 1, 1, 6, 5, 7, 4, 2, 0, 3, 0x98f564 },
{ "ar_rdwr.zip", "scpa211", "rdwr_", 1, 3, 1, 6, 4, 0, 5, 2, 7, 0x98f564 },
{ "ar_sdwr.zip", "scpa211", "sdwr_", 1, 6, 3, 4, 5, 2, 1, 0, 7, 0x98f564 },
{ "ar_spot.zip", "spotv3.0", "spotv2.", 0, 7, 6, 5, 4, 3, 2, 1, 0, 0x9902bc },
{ "ar_spot.zip", "scpav3_0.1", "spotv2.", 0, 7, 6, 5, 4, 3, 2, 1, 0, 0x9902bc },
{ "ar_sprg.zip", "scpa211", "sprg_", 1, 4, 7, 3, 0, 6, 5, 2, 1, 0x98f564 },
{ "ar_xeon.zip", "scpa211", "xeon_", 1, 3, 1, 2, 4, 0, 5, 6, 7, 0x98f564 },
{ NULL, NULL, NULL }
@ -130,34 +130,40 @@ static struct arcadiarom *is_arcadia (char *xpath)
static int load_roms (char *xpath, struct arcadiarom *rom)
{
char path[MAX_DPATH], path2[MAX_DPATH];
char path[MAX_DPATH], path2[MAX_DPATH], path3[MAX_DPATH], *p;
int i;
i = 0;
strcpy (path2, xpath);
if (strchr (rom->bios, '/')) {
char *p = path2 + strlen (path2) - 1;
while (p > path2) {
if (p[0] == '\\' || p[0] == '/') {
*p = 0;
break;
}
p--;
}
if (p == path2)
strcpy (path3, xpath);
p = path3 + strlen (path3) - 1;
while (p > path3) {
if (p[0] == '\\' || p[0] == '/') {
*p = 0;
break;
}
p--;
}
sprintf (path, "%s/%s", path2, rom->bios);
if (p == path3)
*p = 0;
strcpy (path2, xpath);
if (strchr (rom->bios, '/'))
strcpy (path2, path3);
sprintf (path, "%s/ar_bios.zip/%s", path3, rom->bios);
if (!load_rom8 (path, arbmemory + bios_offset, 0)) {
write_log ("Arcadia: bios load failed ('%s')\n", path);
return 0;
write_log ("Arcadia: bios load failed ('%s')\n", path);
sprintf (path, "%s/%s", path2, rom->bios);
if (!load_rom8 (path, arbmemory + bios_offset, 0)) {
write_log ("Arcadia: bios load failed ('%s')\n", path);
return 0;
}
}
write_log ("Arcadia: bios '%s' loaded\n", path);
i = 0;
for (;;) {
sprintf (path, "%s/%s%d", xpath, rom->rom, i + 1);
sprintf (path, "%s/%s%d", xpath, rom->rom, i + 1);
if (!load_rom8 (path, arbmemory + 2 * 65536 * i, rom->bin)) {
if (i == 0)
write_log ("Arcadia: game rom load failed ('%s')\n", path);
write_log ("Arcadia: game rom load failed ('%s')\n", path);
break;
}
i++;

View File

@ -906,7 +906,7 @@ void audio_hsync (int dmaaction)
write_log ("%d:>5: LEN=%d PT=%08.8X\n", nr, cdp->wlen, cdp->pt);
#endif
}
cdp->dat2 = chipmem_wget (cdp->pt);
cdp->dat2 = chipmem_agnus_wget (cdp->pt);
if (cdp->request_word >= 2)
handle2 = 1;
if (chan_ena) {

View File

@ -227,7 +227,7 @@ static void blitter_dofast(void)
uae_u32 bltadat, blitahold;
uae_u16 bltbdat;
if (bltadatptr) {
blt_info.bltadat = bltadat = chipmem_wget (bltadatptr);
blt_info.bltadat = bltadat = chipmem_agnus_wget (bltadatptr);
bltadatptr += 2;
} else
bltadat = blt_info.bltadat;
@ -236,17 +236,17 @@ static void blitter_dofast(void)
preva = bltadat;
if (bltbdatptr) {
blt_info.bltbdat = bltbdat = chipmem_wget (bltbdatptr);
blt_info.bltbdat = bltbdat = chipmem_agnus_wget (bltbdatptr);
bltbdatptr += 2;
blitbhold = (((uae_u32)prevb << 16) | bltbdat) >> blt_info.blitbshift;
prevb = bltbdat;
}
if (bltcdatptr) {
blt_info.bltcdat = chipmem_wget (bltcdatptr);
blt_info.bltcdat = chipmem_agnus_wget (bltcdatptr);
bltcdatptr += 2;
}
if (dodst) chipmem_wput (dstp, blt_info.bltddat);
if (dodst) chipmem_agnus_wput (dstp, blt_info.bltddat);
blt_info.bltddat = blit_func (blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF;
if (blitfill) {
uae_u16 d = blt_info.bltddat;
@ -269,7 +269,7 @@ static void blitter_dofast(void)
if (bltcdatptr) bltcdatptr += blt_info.bltcmod;
if (bltddatptr) bltddatptr += blt_info.bltdmod;
}
if (dodst) chipmem_wput (dstp, blt_info.bltddat);
if (dodst) chipmem_agnus_wput (dstp, blt_info.bltddat);
blt_info.bltbhold = blitbhold;
}
blit_masktable[0] = 0xFFFF;
@ -320,7 +320,7 @@ static void blitter_dofast_desc(void)
uae_u32 bltadat, blitahold;
uae_u16 bltbdat;
if (bltadatptr) {
bltadat = blt_info.bltadat = chipmem_wget (bltadatptr);
bltadat = blt_info.bltadat = chipmem_agnus_wget (bltadatptr);
bltadatptr -= 2;
} else
bltadat = blt_info.bltadat;
@ -329,17 +329,17 @@ static void blitter_dofast_desc(void)
preva = bltadat;
if (bltbdatptr) {
blt_info.bltbdat = bltbdat = chipmem_wget (bltbdatptr);
blt_info.bltbdat = bltbdat = chipmem_agnus_wget (bltbdatptr);
bltbdatptr -= 2;
blitbhold = (((uae_u32)bltbdat << 16) | prevb) >> blt_info.blitdownbshift;
prevb = bltbdat;
}
if (bltcdatptr) {
blt_info.bltcdat = blt_info.bltbdat = chipmem_wget (bltcdatptr);
blt_info.bltcdat = blt_info.bltbdat = chipmem_agnus_wget (bltcdatptr);
bltcdatptr -= 2;
}
if (dodst) chipmem_wput (dstp, blt_info.bltddat);
if (dodst) chipmem_agnus_wput (dstp, blt_info.bltddat);
blt_info.bltddat = blit_func (blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF;
if (blitfill) {
uae_u16 d = blt_info.bltddat;
@ -362,7 +362,7 @@ static void blitter_dofast_desc(void)
if (bltcdatptr) bltcdatptr -= blt_info.bltcmod;
if (bltddatptr) bltddatptr -= blt_info.bltdmod;
}
if (dodst) chipmem_wput (dstp, blt_info.bltddat);
if (dodst) chipmem_agnus_wput (dstp, blt_info.bltddat);
blt_info.bltbhold = blitbhold;
}
blit_masktable[0] = 0xFFFF;
@ -604,7 +604,7 @@ STATIC_INLINE int blitter_doddma (void)
wd = 1;
}
if (wd) {
chipmem_wput (bltdpt, d);
chipmem_agnus_wput (bltdpt, d);
bltdpt += blit_add;
blitter_hcounter2++;
if (blitter_hcounter2 == blt_info.hblitsize) {
@ -626,11 +626,11 @@ STATIC_INLINE void blitter_dodma (int ch)
switch (ch)
{
case 1:
blt_info.bltadat = chipmem_wget (bltapt);
blt_info.bltadat = chipmem_agnus_wget (bltapt);
bltapt += blit_add;
break;
case 2:
blt_info.bltbdat = chipmem_wget (bltbpt);
blt_info.bltbdat = chipmem_agnus_wget (bltbpt);
bltbpt += blit_add;
if (blitdesc)
blt_info.bltbhold = (((uae_u32)blt_info.bltbdat << 16) | prevb) >> blt_info.blitdownbshift;
@ -639,7 +639,7 @@ STATIC_INLINE void blitter_dodma (int ch)
prevb = blt_info.bltbdat;
break;
case 3:
blt_info.bltcdat = chipmem_wget (bltcpt);
blt_info.bltcdat = chipmem_agnus_wget (bltcpt);
bltcpt += blit_add;
break;
}
@ -924,7 +924,6 @@ void do_blitter (int hpos)
blitter_dump ();
}
#endif
blit_slowdown = 0;
unset_special (SPCFLAG_BLTNASTY);

View File

@ -11,11 +11,15 @@
#include "catweasel.h"
#include "uae.h"
#include <catweasl_usr.h>
struct catweasel_contr cwc;
static int cwhsync;
static int handshake;
static HANDLE handle = INVALID_HANDLE_VALUE;
void catweasel_hsync (void)
{
if (cwhsync <= 0)
@ -89,21 +93,45 @@ void catweasel_do_bput (uaecptr addr, uae_u32 b)
int catweasel_init (void)
{
if (!currprefs.catweasel_io)
return 0;
if (!ioport_init ())
return 0;
cwc.type = currprefs.catweasel_io >= 0x400 ? CATWEASEL_TYPE_MK3 : CATWEASEL_TYPE_MK1;
cwc.iobase = currprefs.catweasel_io;
char name[32];
int i, len;
uae_u8 buffer[1000];
uae_u32 model, base;
return 0;
for (i = 0; i < 4; i++) {
sprintf (name, "\\\\.\\CAT%d_F0", i);
handle = CreateFile (name, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (handle != INVALID_HANDLE_VALUE)
break;
write_log("%s: %d\n", name, GetLastError());
}
if (handle == INVALID_HANDLE_VALUE)
goto fail;
if (!DeviceIoControl (handle, CW_LOCK_EXCLUSIVE, 0, 0, buffer, sizeof (buffer), &len, 0)) {
write_log ("CW_LOCK_EXCLUSIVE failed %d\n", GetLastError());
goto fail;
}
model = *((uae_u32*)(buffer + 4));
base = *((uae_u32*)(buffer + 0));
write_log ("Catweasel MK%d @%p detected and enabled\n", model, base);
cwc.type = model == 0 ? 1 : model == 3 ? 4 : 2;
cwc.iobase = base;
catweasel_init_controller (&cwc);
return 1;
fail:
catweasel_free ();
return 0;
}
void catweasel_free (void)
{
if (!currprefs.catweasel_io)
return;
ioport_free ();
if (handle != INVALID_HANDLE_VALUE)
CloseHandle (handle);
handle = INVALID_HANDLE_VALUE;
cwc.type = 0;
}
@ -775,4 +803,6 @@ int catweasel_read(catweasel_drive *d, int side, int clock, int rawmode)
return 1;
}
#endif
#endif

804
catweasel_old.c Executable file
View File

@ -0,0 +1,804 @@
#include "sysconfig.h"
#include "sysdeps.h"
#ifdef CATWEASEL
#include "config.h"
#include "options.h"
#include "memory.h"
#include "ioport.h"
#include "catweasel.h"
#include "uae.h"
#include <catweasl_usr.h>
struct catweasel_contr cwc;
static int cwhsync;
static int handshake;
static HANDLE h = INVALID_HANDLE_VALUE;
void catweasel_hsync (void)
{
if (cwhsync <= 0)
return;
cwhsync--;
if (cwhsync == 0) {
if (handshake)
ioport_write (currprefs.catweasel_io + 0xd0, 0);
handshake = 0;
}
}
int catweasel_read_joystick (uae_u8 *dir, uae_u8 *buttons)
{
if (cwc.type != CATWEASEL_TYPE_MK3)
return 0;
*dir = ioport_read (currprefs.catweasel_io + 0xc0);
*buttons = ioport_read (currprefs.catweasel_io + 0xc8);
return 1;
}
int catweasel_read_keyboard (uae_u8 *keycode)
{
uae_u8 v;
if (cwc.type != CATWEASEL_TYPE_MK3)
return 0;
v = ioport_read (currprefs.catweasel_io + 0xd4);
if (!(v & 0x80))
return 0;
if (handshake)
return 0;
*keycode = ioport_read (currprefs.catweasel_io + 0xd0);
ioport_write (currprefs.catweasel_io + 0xd0, 0);
handshake = 1;
cwhsync = 10;
return 1;
}
uae_u32 catweasel_do_bget (uaecptr addr)
{
if (cwc.type == CATWEASEL_TYPE_MK3) {
if ((currprefs.catweasel_io & 3) == 0 && addr >= 0xc0 && addr <= 0xfc)
return ioport_read (currprefs.catweasel_io + addr);
} else {
if (addr >= currprefs.catweasel_io && addr <= currprefs.catweasel_io + 8) {
return ioport_read (addr & 0x3ff);
} else if(addr >= 0x10000 + currprefs.catweasel_io && addr <= 0x10000 + currprefs.catweasel_io) {
return ioport_read (addr & 0x3ff);
} else if ((addr & 0x3ff) < 0x200 || (addr & 0x3ff) >= 0x400) {
write_log("catweasel_bget @%08.8X!\n",addr);
}
}
return 0;
}
void catweasel_do_bput (uaecptr addr, uae_u32 b)
{
if (cwc.type == CATWEASEL_TYPE_MK3) {
if ((currprefs.catweasel_io & 3) == 0 && addr >= 0xc0 && addr <= 0xfc)
ioport_write (currprefs.catweasel_io + addr, b);
} else {
if (addr >= currprefs.catweasel_io && addr <= currprefs.catweasel_io + 8) {
ioport_write (addr & 0x3ff, b);
} else if(addr >= 0x10000 + currprefs.catweasel_io && addr <= 0x10000 + currprefs.catweasel_io) {
ioport_write (addr & 0x3ff, b);
} else if ((addr & 0x3ff) < 0x200 || (addr & 0x3ff) >= 0x400) {
write_log("catweasel_bput @%08.8X=%02.2X!\n",addr,b);
}
}
}
int catweasel_init (void)
{
char name[32];
int i, len;
uae_u8 buffer[1000];
uae_u32 model, base;
for (i = 0; i < 4; i++) {
sprintf (name, "\\\\.\\CAT%d", i);
handle = CreateFile (devname, GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (handle != INVALID_HANDLE_VALUE)
break;
}
if (handle == INVALID_HANDLE_VALUE)
goto fail;
if (!DeviceIoControl (handle, CW_LOCK_EXCLUSIVE, 0L, 0, buffer, sizeof (buffer), &len, 0) {
write_log ("CW_LOCK_EXCLUSIVE failed %d\n", GetLastError());
goto fail;
model = *((uae_u32*)(buffer + 4));
base = *((uae_u32*)(buffer + 0));
write_log ("Catweasel MK%d @%p detected and enabled\n", model, base);
cwc.type = model == 0 ? 1 : model == 3 ? 4 : 2;
cwc.iobase = base;
catweasel_init_controller (&cwc);
return 1;
fail:
catweasel_free ();
return 0;
}
void catweasel_free (void)
{
if (handle != INVALID_HANDLE_VALUE)
CloseHandle (handle);
handle = INVALID_HANDLE_VALUE;
cwc.type = 0;
}
#define outb(v,port) ioport_write(port,v)
#define inb(port) ioport_read(port)
#define LONGEST_TRACK 16000
static uae_u8 mfmbuf[LONGEST_TRACK * 4];
static uae_u8 tmpmfmbuffer[LONGEST_TRACK * 2];
static int bitshiftcompare(uae_u8 *src,int bit,int len,uae_u8 *comp)
{
uae_u8 b;
int ones,zeros,len2;
ones=zeros=0;
len2=len;
while(len--) {
b = (comp[0] << bit) | (comp[1] >> (8 - bit));
if(b != *src) return 1;
if(b==0x00) zeros++;
if(b==0xff) ones++;
src++;
comp++;
}
if(ones==len2||zeros==len2) return 1;
return 0;
}
static uae_u8 *mergepieces(uae_u8 *start,int len,int bits,uae_u8 *sync)
{
uae_u8 *dst=tmpmfmbuffer;
uae_u8 b;
int size;
int shift;
size=len-(sync-start);
memcpy(dst,sync,size);
dst+=size;
b=start[len];
b&=~(255>>bits);
b|=start[0]>>bits;
*dst++=b;
shift=8-bits;
while(start<=sync+2000) {
*dst++=(start[0]<<shift)|(start[1]>>(8-shift));
start++;
}
return tmpmfmbuffer;
}
#define SCANOFFSET 1 /* scanning range in bytes, -SCANOFFSET to SCANOFFSET */
#define SCANOFFSET2 20
#define SCANLENGHT 200 /* scanning length in bytes */
static uae_u8* scantrack(uae_u8 *sync1,uae_u8 *sync2,int *trackbytes,int *trackbits)
{
int i,bits,bytes,matched;
uae_u8 *sync2bak=sync2;
sync1+=SCANOFFSET2;
sync2+=SCANOFFSET2;
while(sync1 < sync2bak - 2*SCANOFFSET - SCANOFFSET2 - SCANLENGHT) {
matched=0x7fff;
for(i=0;i<2*SCANOFFSET*8;i++) {
bits=i&7;
bytes=-SCANOFFSET+(i>>3);
if(!bitshiftcompare(sync1,bits,SCANLENGHT,sync2+bytes)) {
if(matched==0x7fff) {
matched=i;
} else {
break;
}
}
}
if(matched!=0x7fff && i>=2*SCANOFFSET*8) {
bits=matched&7;
bytes=-SCANOFFSET+(matched>>3);
*trackbytes=sync2+bytes-sync1;
*trackbits=bits;
return mergepieces(sync1,*trackbytes,*trackbits,sync2bak);
}
sync1++;
sync2++;
}
return 0;
}
static unsigned char threshtab[128];
static void codec_makethresh(int trycnt, const unsigned char *origt, unsigned char *t, int numthresh)
{
static unsigned char tab[10] = { 0, 0, 0, 0, -1, -2, 1, 2, -1, 1 };
if (trycnt >= sizeof (tab))
trycnt = sizeof (tab) - 1;
while(numthresh--)
t[numthresh] = origt[numthresh] + tab[trycnt];
}
static void codec_init_threshtab(int trycnt, const unsigned char *origt)
{
static unsigned char old_thresholds[2] = { 0, 0 };
unsigned char t[2];
int a, i;
codec_makethresh(trycnt, origt, t, 2);
if(*(unsigned short*)t == *(unsigned short*)old_thresholds)
return;
for(i=0,a=2; i<128; i++) {
if(i == t[0] || i == t[1])
a++;
threshtab[i] = a;
}
*(unsigned short*)&old_thresholds = *(unsigned short*)t;
}
static __inline__ void CWSetCReg(catweasel_contr *c, unsigned char clear, unsigned char set)
{
c->control_register = (c->control_register & ~clear) | set;
outb(c->control_register, c->io_sr);
}
static void CWTriggerStep(catweasel_contr *c)
{
CWSetCReg(c, c->crm_step, 0);
CWSetCReg(c, 0, c->crm_step);
}
void catweasel_init_controller(catweasel_contr *c)
{
int i, j;
if(!c->iobase)
return;
switch(c->type) {
case CATWEASEL_TYPE_MK1:
c->crm_sel0 = 1 << 5;
c->crm_sel1 = 1 << 4;
c->crm_mot0 = 1 << 3;
c->crm_mot1 = 1 << 7;
c->crm_dir = 1 << 1;
c->crm_step = 1 << 0;
c->srm_trk0 = 1 << 4;
c->srm_dchg = 1 << 5;
c->srm_writ = 1 << 1;
c->io_sr = c->iobase + 2;
c->io_mem = c->iobase;
break;
case CATWEASEL_TYPE_MK3:
c->crm_sel0 = 1 << 2;
c->crm_sel1 = 1 << 3;
c->crm_mot0 = 1 << 1;
c->crm_mot1 = 1 << 5;
c->crm_dir = 1 << 4;
c->crm_step = 1 << 7;
c->srm_trk0 = 1 << 2;
c->srm_dchg = 1 << 5;
c->srm_writ = 1 << 6;
c->srm_dskready = 1 << 4;
c->io_sr = c->iobase + 0xe8;
c->io_mem = c->iobase + 0xe0;
break;
default:
return;
}
c->control_register = 255;
/* select all drives, step inside */
CWSetCReg(c, c->crm_dir | c->crm_sel0 | c->crm_sel1, 0);
for(i=0;i<2;i++) {
c->drives[i].number = i;
c->drives[i].contr = c;
c->drives[i].diskindrive = 0;
/* select only the respective drive, step to track 0 */
if(i == 0) {
CWSetCReg(c, c->crm_sel0, c->crm_dir | c->crm_sel1);
} else {
CWSetCReg(c, c->crm_sel1, c->crm_dir | c->crm_sel0);
}
for(j = 0; j < 86 && (inb(c->io_sr) & c->srm_trk0); j++) {
CWTriggerStep(c);
sleep_millis(6);
}
if(j < 86) {
c->drives[i].type = 1;
c->drives[i].track = 0;
} else {
c->drives[i].type = 0;
}
}
c->drives[0].sel = c->crm_sel0;
c->drives[0].mot = c->crm_mot0;
c->drives[1].sel = c->crm_sel1;
c->drives[1].mot = c->crm_mot1;
CWSetCReg(c, 0, c->crm_sel0 | c->crm_sel1); /* deselect all drives */
}
void catweasel_free_controller(catweasel_contr *c)
{
if(!c->iobase)
return;
/* all motors off, deselect all drives */
CWSetCReg(c, 0, c->crm_mot0 | c->crm_mot1 | c->crm_sel0 | c->crm_sel1);
}
void catweasel_set_motor(catweasel_drive *d, int on)
{
CWSetCReg(d->contr, d->sel, 0);
if (on)
CWSetCReg(d->contr, d->mot, 0);
else
CWSetCReg(d->contr, 0, d->mot);
CWSetCReg(d->contr, 0, d->sel);
}
int catweasel_step(catweasel_drive *d, int dir)
{
catweasel_contr *c = d->contr;
CWSetCReg(c, d->sel, 0);
if (dir > 0)
CWSetCReg(c, c->crm_dir, 0);
else
CWSetCReg(c, 0, c->crm_dir);
CWTriggerStep (c);
CWSetCReg(c, 0, d->sel);
d->track += dir > 0 ? 1 : -1;
return 1;
}
int catweasel_disk_changed(catweasel_drive *d)
{
int ret;
CWSetCReg(d->contr, d->sel, 0);
ret = (inb(d->contr->io_sr) & d->contr->srm_dchg) ? 0 : 1;
CWSetCReg(d->contr, 0, d->sel);
return ret;
}
int catweasel_diskready(catweasel_drive *d)
{
int ret;
CWSetCReg(d->contr, d->sel, 0);
ret = (inb(d->contr->io_sr) & d->contr->srm_dskready) ? 0 : 1;
CWSetCReg(d->contr, 0, d->sel);
return ret;
}
int catweasel_track0(catweasel_drive *d)
{
int ret;
CWSetCReg(d->contr, d->sel, 0);
ret = (inb(d->contr->io_sr) & d->contr->srm_trk0) ? 0 : 1;
CWSetCReg(d->contr, 0, d->sel);
if (ret)
d->track = 0;
return ret;
}
int catweasel_write_protected(catweasel_drive *d)
{
int ret;
CWSetCReg(d->contr, d->sel, 0);
ret = !(inb(d->contr->io_sr) & 8);
CWSetCReg(d->contr, 0, d->sel);
return ret;
}
uae_u8 catweasel_read_byte(catweasel_drive *d)
{
return inb(d->contr->io_mem);
}
static const unsigned char amiga_thresholds[] = { 0x22, 0x30 }; // 27, 38 for 5.25"
#define FLOPPY_WRITE_LEN 6250
#define MFMMASK 0x55555555
static uae_u32 getmfmlong (uae_u16 * mbuf)
{
return (uae_u32)(((*mbuf << 16) | *(mbuf + 1)) & MFMMASK);
}
static int drive_write_adf_amigados (uae_u16 *mbuf, uae_u16 *mend, uae_u8 *writebuffer, int track)
{
int i, secwritten = 0;
uae_u32 odd, even, chksum, id, dlong;
uae_u8 *secdata;
uae_u8 secbuf[544];
char sectable[22];
int num_sectors = 11;
int ec = 0;
memset (sectable, 0, sizeof (sectable));
mend -= (4 + 16 + 8 + 512);
while (secwritten < num_sectors) {
int trackoffs;
do {
while (*mbuf++ != 0x4489) {
if (mbuf >= mend) {
ec = 1;
goto err;
}
}
} while (*mbuf++ != 0x4489);
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 2);
mbuf += 4;
id = (odd << 1) | even;
trackoffs = (id & 0xff00) >> 8;
if (trackoffs > 10) {
ec = 2;
goto err;
}
chksum = odd ^ even;
for (i = 0; i < 4; i++) {
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 8);
mbuf += 2;
dlong = (odd << 1) | even;
if (dlong) {
ec = 6;
goto err;
}
chksum ^= odd ^ even;
} /* could check here if the label is nonstandard */
mbuf += 8;
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 2);
mbuf += 4;
if (((odd << 1) | even) != chksum) {
ec = 3;
goto err;
}
odd = (id & 0x00ff0000) >> 16;
if (odd != track) {
ec = 7;
goto err;
}
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 2);
mbuf += 4;
chksum = (odd << 1) | even;
secdata = secbuf + 32;
for (i = 0; i < 128; i++) {
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 256);
mbuf += 2;
dlong = (odd << 1) | even;
*secdata++ = dlong >> 24;
*secdata++ = dlong >> 16;
*secdata++ = dlong >> 8;
*secdata++ = dlong;
chksum ^= odd ^ even;
}
mbuf += 256;
if (chksum) {
ec = 4;
goto err;
}
sectable[trackoffs] = 1;
secwritten++;
memcpy (writebuffer + trackoffs * 512, secbuf + 32, 512);
}
if (secwritten == 0 || secwritten < 0) {
ec = 5;
goto err;
}
return 0;
err:
write_log ("mfm decode error %d. secwritten=%d\n", ec, secwritten);
for (i = 0; i < num_sectors; i++)
write_log ("%d:%d ", i, sectable[i]);
write_log ("\n");
return ec;
}
static void mfmcode (uae_u16 * mfm, int words)
{
uae_u32 lastword = 0;
while (words--) {
uae_u32 v = *mfm;
uae_u32 lv = (lastword << 16) | v;
uae_u32 nlv = 0x55555555 & ~lv;
uae_u32 mfmbits = (nlv << 1) & (nlv >> 1);
*mfm++ = v | mfmbits;
lastword = v;
}
}
#define FLOPPY_GAP_LEN 360
static int amigados_mfmcode (uae_u8 *src, uae_u16 *dst, int num_secs, int track)
{
int sec;
memset (dst, 0xaa, FLOPPY_GAP_LEN * 2);
for (sec = 0; sec < num_secs; sec++) {
uae_u8 secbuf[544];
int i;
uae_u16 *mfmbuf = dst + 544 * sec + FLOPPY_GAP_LEN;
uae_u32 deven, dodd;
uae_u32 hck = 0, dck = 0;
secbuf[0] = secbuf[1] = 0x00;
secbuf[2] = secbuf[3] = 0xa1;
secbuf[4] = 0xff;
secbuf[5] = track;
secbuf[6] = sec;
secbuf[7] = num_secs - sec;
for (i = 8; i < 24; i++)
secbuf[i] = 0;
mfmbuf[0] = mfmbuf[1] = 0xaaaa;
mfmbuf[2] = mfmbuf[3] = 0x4489;
memcpy (secbuf + 32, src + sec * 512, 512);
deven = ((secbuf[4] << 24) | (secbuf[5] << 16)
| (secbuf[6] << 8) | (secbuf[7]));
dodd = deven >> 1;
deven &= 0x55555555;
dodd &= 0x55555555;
mfmbuf[4] = dodd >> 16;
mfmbuf[5] = dodd;
mfmbuf[6] = deven >> 16;
mfmbuf[7] = deven;
for (i = 8; i < 48; i++)
mfmbuf[i] = 0xaaaa;
for (i = 0; i < 512; i += 4) {
deven = ((secbuf[i + 32] << 24) | (secbuf[i + 33] << 16)
| (secbuf[i + 34] << 8) | (secbuf[i + 35]));
dodd = deven >> 1;
deven &= 0x55555555;
dodd &= 0x55555555;
mfmbuf[(i >> 1) + 32] = dodd >> 16;
mfmbuf[(i >> 1) + 33] = dodd;
mfmbuf[(i >> 1) + 256 + 32] = deven >> 16;
mfmbuf[(i >> 1) + 256 + 33] = deven;
}
for (i = 4; i < 24; i += 2)
hck ^= (mfmbuf[i] << 16) | mfmbuf[i + 1];
deven = dodd = hck;
dodd >>= 1;
mfmbuf[24] = dodd >> 16;
mfmbuf[25] = dodd;
mfmbuf[26] = deven >> 16;
mfmbuf[27] = deven;
for (i = 32; i < 544; i += 2)
dck ^= (mfmbuf[i] << 16) | mfmbuf[i + 1];
deven = dodd = dck;
dodd >>= 1;
mfmbuf[28] = dodd >> 16;
mfmbuf[29] = dodd;
mfmbuf[30] = deven >> 16;
mfmbuf[31] = deven;
mfmcode (mfmbuf + 4, 544 - 4);
}
return (num_secs * 544 + FLOPPY_GAP_LEN) * 2 * 8;
}
static uae_u16 amigamfmbuffer[LONGEST_TRACK];
static uae_u8 amigabuffer[512*22];
/* search and align to 0x4489 WORDSYNC markers */
static int isamigatrack(uae_u8 *mfmdata, uae_u8 *mfmdatae, uae_u16 *mfmdst, int track)
{
uae_u16 *dst = amigamfmbuffer;
int len;
int shift, syncshift, sync,ret;
uae_u32 l;
uae_u16 w;
sync = syncshift = shift = 0;
len = (mfmdatae - mfmdata) * 8;
if (len > LONGEST_TRACK * 8)
len = LONGEST_TRACK * 8;
while (len--) {
l = (mfmdata[0] << 16) | (mfmdata[1] << 8) | (mfmdata[2] << 0);
w = l >> (8 - shift);
if (w == 0x4489) {
sync = 1;
syncshift = 0;
}
if (sync) {
if (syncshift == 0) *dst++ = w;
syncshift ++;
if (syncshift == 16) syncshift = 0;
}
shift++;
if (shift == 8) {
mfmdata++;
shift = 0;
}
}
if (sync) {
ret=drive_write_adf_amigados (amigamfmbuffer, dst, amigabuffer, track);
if(!ret)
return amigados_mfmcode (amigabuffer, mfmdst, 11, track);
write_log ("decode error %d\n", ret);
} else {
write_log ("decode error: no sync found\n");
}
return 0;
}
int catweasel_fillmfm (catweasel_drive *d, uae_u16 *mfm, int side, int clock, int rawmode)
{
int i, j, oldsync, syncs[10], synccnt, endcnt;
uae_u32 tt1 = 0, tt2 = 0;
uae_u8 *p1;
int bytes = 0, bits = 0;
static int lasttrack, trycnt;
if (cwc.type == 0)
return 0;
if (d->contr->control_register & d->mot)
return 0;
if (!catweasel_read (d, side, 1, rawmode))
return 0;
if(d->contr->type == CATWEASEL_TYPE_MK1) {
inb(d->contr->iobase + 1);
inb(d->contr->io_mem); /* ignore first byte */
} else {
outb(0, d->contr->iobase + 0xe4);
}
catweasel_read_byte (d);
if (lasttrack == d->track)
trycnt++;
else
trycnt = 0;
lasttrack = d->track;
codec_init_threshtab(trycnt, amiga_thresholds);
i = 0; j = 0;
synccnt = 0;
oldsync = -1;
endcnt = 0;
while (j < LONGEST_TRACK * 4) {
uae_u8 b = catweasel_read_byte (d);
if (b >= 250) {
if (b == 255 - endcnt) {
endcnt++;
if (endcnt == 5)
break;
} else
endcnt = 0;
}
if (rawmode) {
if (b & 0x80) {
if (oldsync < j) {
syncs[synccnt++] = j;
oldsync = j + 300;
}
}
if (synccnt >= 3 && j > oldsync)
break;
}
b = threshtab[b & 0x7f];
tt1 = (tt1 << b) + 1;
tt2 += b;
if (tt2 >= 16) {
tt2 -= 16;
mfmbuf[j++] = tt1 >> (tt2 + 8);
mfmbuf[j++] = tt1 >> tt2;
}
i++;
}
write_log ("cyl=%d, side=%d, length %d, syncs %d\n", d->track, side, j, synccnt);
if (rawmode) {
if (synccnt >= 3) {
p1 = scantrack (mfmbuf + syncs[1], mfmbuf + syncs[2], &bytes, &bits);
if (p1) {
j = 0;
for (i = 0; i < bytes + 2; i+=2) {
mfm[j++] = (p1[i] << 8) | p1[i + 1];
}
return bytes * 8 + bits;
}
}
} else {
return isamigatrack (mfmbuf, mfmbuf + j, mfm, d->track * 2 + side);
}
return 0;
}
int catweasel_read(catweasel_drive *d, int side, int clock, int rawmode)
{
int iobase = d->contr->iobase;
CWSetCReg(d->contr, d->sel, 0);
if(d->contr->type == CATWEASEL_TYPE_MK1) {
CWSetCReg(d->contr, 1<<2, (!side)<<2); /* set disk side */
inb(iobase+1); /* ra reset */
outb(clock*128, iobase+3);
inb(iobase+1);
inb(iobase+0);
// inb(iobase+0);
// outb(0, iobase+3); /* don't store index pulse */
inb(iobase+1);
inb(iobase+7); /* start reading */
sleep_millis(rawmode ? 550 : 225);
outb(0, iobase+1); /* stop reading, don't reset RAM pointer */
outb(128, iobase+0); /* add data end mark */
outb(128, iobase+0);
inb(iobase+1); /* Reset RAM pointer */
} else {
CWSetCReg(d->contr, 1<<6, (!side)<<6); /* set disk side */
outb(0, iobase + 0xe4); /* Reset memory pointer */
switch(clock) {
case 0: /* 28MHz */
outb(128, iobase + 0xec);
break;
case 1: /* 14MHz */
outb(0, iobase + 0xec);
break;
}
inb(iobase + 0xe0);
inb(iobase + 0xe0);
outb(0, iobase + 0xec); /* no IRQs, no MFM predecode */
inb(iobase + 0xe0);
outb(0, iobase + 0xec); /* don't store index pulse */
outb(0, iobase + 0xe4); /* Reset memory pointer */
inb(iobase + 0xf0); /* start reading */
sleep_millis(rawmode ? 550 : 225);
inb(iobase + 0xe4); /* stop reading, don't reset RAM pointer */
outb(255, iobase + 0xe0); /* add data end mark */
outb(254, iobase + 0xe0); /* add data end mark */
outb(253, iobase + 0xe0); /* add data end mark */
outb(252, iobase + 0xe0); /* add data end mark */
outb(251, iobase + 0xe0); /* add data end mark */
outb(0, iobase + 0xe4); /* Reset memory pointer */
}
CWSetCReg(d->contr, 0, d->sel);
return 1;
}
#endif

778
catweasel_old2.c Executable file
View File

@ -0,0 +1,778 @@
#include "sysconfig.h"
#include "sysdeps.h"
#ifdef CATWEASEL
#include "config.h"
#include "options.h"
#include "memory.h"
#include "ioport.h"
#include "catweasel.h"
#include "uae.h"
struct catweasel_contr cwc;
static int cwhsync;
static int handshake;
void catweasel_hsync (void)
{
if (cwhsync <= 0)
return;
cwhsync--;
if (cwhsync == 0) {
if (handshake)
ioport_write (currprefs.catweasel_io + 0xd0, 0);
handshake = 0;
}
}
int catweasel_read_joystick (uae_u8 *dir, uae_u8 *buttons)
{
if (cwc.type != CATWEASEL_TYPE_MK3)
return 0;
*dir = ioport_read (currprefs.catweasel_io + 0xc0);
*buttons = ioport_read (currprefs.catweasel_io + 0xc8);
return 1;
}
int catweasel_read_keyboard (uae_u8 *keycode)
{
uae_u8 v;
if (cwc.type != CATWEASEL_TYPE_MK3)
return 0;
v = ioport_read (currprefs.catweasel_io + 0xd4);
if (!(v & 0x80))
return 0;
if (handshake)
return 0;
*keycode = ioport_read (currprefs.catweasel_io + 0xd0);
ioport_write (currprefs.catweasel_io + 0xd0, 0);
handshake = 1;
cwhsync = 10;
return 1;
}
uae_u32 catweasel_do_bget (uaecptr addr)
{
if (cwc.type == CATWEASEL_TYPE_MK3) {
if ((currprefs.catweasel_io & 3) == 0 && addr >= 0xc0 && addr <= 0xfc)
return ioport_read (currprefs.catweasel_io + addr);
} else {
if (addr >= currprefs.catweasel_io && addr <= currprefs.catweasel_io + 8) {
return ioport_read (addr & 0x3ff);
} else if(addr >= 0x10000 + currprefs.catweasel_io && addr <= 0x10000 + currprefs.catweasel_io) {
return ioport_read (addr & 0x3ff);
} else if ((addr & 0x3ff) < 0x200 || (addr & 0x3ff) >= 0x400) {
write_log("catweasel_bget @%08.8X!\n",addr);
}
}
return 0;
}
void catweasel_do_bput (uaecptr addr, uae_u32 b)
{
if (cwc.type == CATWEASEL_TYPE_MK3) {
if ((currprefs.catweasel_io & 3) == 0 && addr >= 0xc0 && addr <= 0xfc)
ioport_write (currprefs.catweasel_io + addr, b);
} else {
if (addr >= currprefs.catweasel_io && addr <= currprefs.catweasel_io + 8) {
ioport_write (addr & 0x3ff, b);
} else if(addr >= 0x10000 + currprefs.catweasel_io && addr <= 0x10000 + currprefs.catweasel_io) {
ioport_write (addr & 0x3ff, b);
} else if ((addr & 0x3ff) < 0x200 || (addr & 0x3ff) >= 0x400) {
write_log("catweasel_bput @%08.8X=%02.2X!\n",addr,b);
}
}
}
int catweasel_init (void)
{
if (!currprefs.catweasel_io)
return 0;
if (!ioport_init ())
return 0;
cwc.type = currprefs.catweasel_io >= 0x400 ? CATWEASEL_TYPE_MK3 : CATWEASEL_TYPE_MK1;
cwc.iobase = currprefs.catweasel_io;
catweasel_init_controller (&cwc);
return 1;
}
void catweasel_free (void)
{
if (!currprefs.catweasel_io)
return;
ioport_free ();
cwc.type = 0;
}
#define outb(v,port) ioport_write(port,v)
#define inb(port) ioport_read(port)
#define LONGEST_TRACK 16000
static uae_u8 mfmbuf[LONGEST_TRACK * 4];
static uae_u8 tmpmfmbuffer[LONGEST_TRACK * 2];
static int bitshiftcompare(uae_u8 *src,int bit,int len,uae_u8 *comp)
{
uae_u8 b;
int ones,zeros,len2;
ones=zeros=0;
len2=len;
while(len--) {
b = (comp[0] << bit) | (comp[1] >> (8 - bit));
if(b != *src) return 1;
if(b==0x00) zeros++;
if(b==0xff) ones++;
src++;
comp++;
}
if(ones==len2||zeros==len2) return 1;
return 0;
}
static uae_u8 *mergepieces(uae_u8 *start,int len,int bits,uae_u8 *sync)
{
uae_u8 *dst=tmpmfmbuffer;
uae_u8 b;
int size;
int shift;
size=len-(sync-start);
memcpy(dst,sync,size);
dst+=size;
b=start[len];
b&=~(255>>bits);
b|=start[0]>>bits;
*dst++=b;
shift=8-bits;
while(start<=sync+2000) {
*dst++=(start[0]<<shift)|(start[1]>>(8-shift));
start++;
}
return tmpmfmbuffer;
}
#define SCANOFFSET 1 /* scanning range in bytes, -SCANOFFSET to SCANOFFSET */
#define SCANOFFSET2 20
#define SCANLENGHT 200 /* scanning length in bytes */
static uae_u8* scantrack(uae_u8 *sync1,uae_u8 *sync2,int *trackbytes,int *trackbits)
{
int i,bits,bytes,matched;
uae_u8 *sync2bak=sync2;
sync1+=SCANOFFSET2;
sync2+=SCANOFFSET2;
while(sync1 < sync2bak - 2*SCANOFFSET - SCANOFFSET2 - SCANLENGHT) {
matched=0x7fff;
for(i=0;i<2*SCANOFFSET*8;i++) {
bits=i&7;
bytes=-SCANOFFSET+(i>>3);
if(!bitshiftcompare(sync1,bits,SCANLENGHT,sync2+bytes)) {
if(matched==0x7fff) {
matched=i;
} else {
break;
}
}
}
if(matched!=0x7fff && i>=2*SCANOFFSET*8) {
bits=matched&7;
bytes=-SCANOFFSET+(matched>>3);
*trackbytes=sync2+bytes-sync1;
*trackbits=bits;
return mergepieces(sync1,*trackbytes,*trackbits,sync2bak);
}
sync1++;
sync2++;
}
return 0;
}
static unsigned char threshtab[128];
static void codec_makethresh(int trycnt, const unsigned char *origt, unsigned char *t, int numthresh)
{
static unsigned char tab[10] = { 0, 0, 0, 0, -1, -2, 1, 2, -1, 1 };
if (trycnt >= sizeof (tab))
trycnt = sizeof (tab) - 1;
while(numthresh--)
t[numthresh] = origt[numthresh] + tab[trycnt];
}
static void codec_init_threshtab(int trycnt, const unsigned char *origt)
{
static unsigned char old_thresholds[2] = { 0, 0 };
unsigned char t[2];
int a, i;
codec_makethresh(trycnt, origt, t, 2);
if(*(unsigned short*)t == *(unsigned short*)old_thresholds)
return;
for(i=0,a=2; i<128; i++) {
if(i == t[0] || i == t[1])
a++;
threshtab[i] = a;
}
*(unsigned short*)&old_thresholds = *(unsigned short*)t;
}
static __inline__ void CWSetCReg(catweasel_contr *c, unsigned char clear, unsigned char set)
{
c->control_register = (c->control_register & ~clear) | set;
outb(c->control_register, c->io_sr);
}
static void CWTriggerStep(catweasel_contr *c)
{
CWSetCReg(c, c->crm_step, 0);
CWSetCReg(c, 0, c->crm_step);
}
void catweasel_init_controller(catweasel_contr *c)
{
int i, j;
if(!c->iobase)
return;
switch(c->type) {
case CATWEASEL_TYPE_MK1:
c->crm_sel0 = 1 << 5;
c->crm_sel1 = 1 << 4;
c->crm_mot0 = 1 << 3;
c->crm_mot1 = 1 << 7;
c->crm_dir = 1 << 1;
c->crm_step = 1 << 0;
c->srm_trk0 = 1 << 4;
c->srm_dchg = 1 << 5;
c->srm_writ = 1 << 1;
c->io_sr = c->iobase + 2;
c->io_mem = c->iobase;
break;
case CATWEASEL_TYPE_MK3:
c->crm_sel0 = 1 << 2;
c->crm_sel1 = 1 << 3;
c->crm_mot0 = 1 << 1;
c->crm_mot1 = 1 << 5;
c->crm_dir = 1 << 4;
c->crm_step = 1 << 7;
c->srm_trk0 = 1 << 2;
c->srm_dchg = 1 << 5;
c->srm_writ = 1 << 6;
c->srm_dskready = 1 << 4;
c->io_sr = c->iobase + 0xe8;
c->io_mem = c->iobase + 0xe0;
break;
default:
return;
}
c->control_register = 255;
/* select all drives, step inside */
CWSetCReg(c, c->crm_dir | c->crm_sel0 | c->crm_sel1, 0);
for(i=0;i<2;i++) {
c->drives[i].number = i;
c->drives[i].contr = c;
c->drives[i].diskindrive = 0;
/* select only the respective drive, step to track 0 */
if(i == 0) {
CWSetCReg(c, c->crm_sel0, c->crm_dir | c->crm_sel1);
} else {
CWSetCReg(c, c->crm_sel1, c->crm_dir | c->crm_sel0);
}
for(j = 0; j < 86 && (inb(c->io_sr) & c->srm_trk0); j++) {
CWTriggerStep(c);
sleep_millis(6);
}
if(j < 86) {
c->drives[i].type = 1;
c->drives[i].track = 0;
} else {
c->drives[i].type = 0;
}
}
c->drives[0].sel = c->crm_sel0;
c->drives[0].mot = c->crm_mot0;
c->drives[1].sel = c->crm_sel1;
c->drives[1].mot = c->crm_mot1;
CWSetCReg(c, 0, c->crm_sel0 | c->crm_sel1); /* deselect all drives */
}
void catweasel_free_controller(catweasel_contr *c)
{
if(!c->iobase)
return;
/* all motors off, deselect all drives */
CWSetCReg(c, 0, c->crm_mot0 | c->crm_mot1 | c->crm_sel0 | c->crm_sel1);
}
void catweasel_set_motor(catweasel_drive *d, int on)
{
CWSetCReg(d->contr, d->sel, 0);
if (on)
CWSetCReg(d->contr, d->mot, 0);
else
CWSetCReg(d->contr, 0, d->mot);
CWSetCReg(d->contr, 0, d->sel);
}
int catweasel_step(catweasel_drive *d, int dir)
{
catweasel_contr *c = d->contr;
CWSetCReg(c, d->sel, 0);
if (dir > 0)
CWSetCReg(c, c->crm_dir, 0);
else
CWSetCReg(c, 0, c->crm_dir);
CWTriggerStep (c);
CWSetCReg(c, 0, d->sel);
d->track += dir > 0 ? 1 : -1;
return 1;
}
int catweasel_disk_changed(catweasel_drive *d)
{
int ret;
CWSetCReg(d->contr, d->sel, 0);
ret = (inb(d->contr->io_sr) & d->contr->srm_dchg) ? 0 : 1;
CWSetCReg(d->contr, 0, d->sel);
return ret;
}
int catweasel_diskready(catweasel_drive *d)
{
int ret;
CWSetCReg(d->contr, d->sel, 0);
ret = (inb(d->contr->io_sr) & d->contr->srm_dskready) ? 0 : 1;
CWSetCReg(d->contr, 0, d->sel);
return ret;
}
int catweasel_track0(catweasel_drive *d)
{
int ret;
CWSetCReg(d->contr, d->sel, 0);
ret = (inb(d->contr->io_sr) & d->contr->srm_trk0) ? 0 : 1;
CWSetCReg(d->contr, 0, d->sel);
if (ret)
d->track = 0;
return ret;
}
int catweasel_write_protected(catweasel_drive *d)
{
int ret;
CWSetCReg(d->contr, d->sel, 0);
ret = !(inb(d->contr->io_sr) & 8);
CWSetCReg(d->contr, 0, d->sel);
return ret;
}
uae_u8 catweasel_read_byte(catweasel_drive *d)
{
return inb(d->contr->io_mem);
}
static const unsigned char amiga_thresholds[] = { 0x22, 0x30 }; // 27, 38 for 5.25"
#define FLOPPY_WRITE_LEN 6250
#define MFMMASK 0x55555555
static uae_u32 getmfmlong (uae_u16 * mbuf)
{
return (uae_u32)(((*mbuf << 16) | *(mbuf + 1)) & MFMMASK);
}
static int drive_write_adf_amigados (uae_u16 *mbuf, uae_u16 *mend, uae_u8 *writebuffer, int track)
{
int i, secwritten = 0;
uae_u32 odd, even, chksum, id, dlong;
uae_u8 *secdata;
uae_u8 secbuf[544];
char sectable[22];
int num_sectors = 11;
int ec = 0;
memset (sectable, 0, sizeof (sectable));
mend -= (4 + 16 + 8 + 512);
while (secwritten < num_sectors) {
int trackoffs;
do {
while (*mbuf++ != 0x4489) {
if (mbuf >= mend) {
ec = 1;
goto err;
}
}
} while (*mbuf++ != 0x4489);
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 2);
mbuf += 4;
id = (odd << 1) | even;
trackoffs = (id & 0xff00) >> 8;
if (trackoffs > 10) {
ec = 2;
goto err;
}
chksum = odd ^ even;
for (i = 0; i < 4; i++) {
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 8);
mbuf += 2;
dlong = (odd << 1) | even;
if (dlong) {
ec = 6;
goto err;
}
chksum ^= odd ^ even;
} /* could check here if the label is nonstandard */
mbuf += 8;
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 2);
mbuf += 4;
if (((odd << 1) | even) != chksum) {
ec = 3;
goto err;
}
odd = (id & 0x00ff0000) >> 16;
if (odd != track) {
ec = 7;
goto err;
}
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 2);
mbuf += 4;
chksum = (odd << 1) | even;
secdata = secbuf + 32;
for (i = 0; i < 128; i++) {
odd = getmfmlong (mbuf);
even = getmfmlong (mbuf + 256);
mbuf += 2;
dlong = (odd << 1) | even;
*secdata++ = dlong >> 24;
*secdata++ = dlong >> 16;
*secdata++ = dlong >> 8;
*secdata++ = dlong;
chksum ^= odd ^ even;
}
mbuf += 256;
if (chksum) {
ec = 4;
goto err;
}
sectable[trackoffs] = 1;
secwritten++;
memcpy (writebuffer + trackoffs * 512, secbuf + 32, 512);
}
if (secwritten == 0 || secwritten < 0) {
ec = 5;
goto err;
}
return 0;
err:
write_log ("mfm decode error %d. secwritten=%d\n", ec, secwritten);
for (i = 0; i < num_sectors; i++)
write_log ("%d:%d ", i, sectable[i]);
write_log ("\n");
return ec;
}
static void mfmcode (uae_u16 * mfm, int words)
{
uae_u32 lastword = 0;
while (words--) {
uae_u32 v = *mfm;
uae_u32 lv = (lastword << 16) | v;
uae_u32 nlv = 0x55555555 & ~lv;
uae_u32 mfmbits = (nlv << 1) & (nlv >> 1);
*mfm++ = v | mfmbits;
lastword = v;
}
}
#define FLOPPY_GAP_LEN 360
static int amigados_mfmcode (uae_u8 *src, uae_u16 *dst, int num_secs, int track)
{
int sec;
memset (dst, 0xaa, FLOPPY_GAP_LEN * 2);
for (sec = 0; sec < num_secs; sec++) {
uae_u8 secbuf[544];
int i;
uae_u16 *mfmbuf = dst + 544 * sec + FLOPPY_GAP_LEN;
uae_u32 deven, dodd;
uae_u32 hck = 0, dck = 0;
secbuf[0] = secbuf[1] = 0x00;
secbuf[2] = secbuf[3] = 0xa1;
secbuf[4] = 0xff;
secbuf[5] = track;
secbuf[6] = sec;
secbuf[7] = num_secs - sec;
for (i = 8; i < 24; i++)
secbuf[i] = 0;
mfmbuf[0] = mfmbuf[1] = 0xaaaa;
mfmbuf[2] = mfmbuf[3] = 0x4489;
memcpy (secbuf + 32, src + sec * 512, 512);
deven = ((secbuf[4] << 24) | (secbuf[5] << 16)
| (secbuf[6] << 8) | (secbuf[7]));
dodd = deven >> 1;
deven &= 0x55555555;
dodd &= 0x55555555;
mfmbuf[4] = dodd >> 16;
mfmbuf[5] = dodd;
mfmbuf[6] = deven >> 16;
mfmbuf[7] = deven;
for (i = 8; i < 48; i++)
mfmbuf[i] = 0xaaaa;
for (i = 0; i < 512; i += 4) {
deven = ((secbuf[i + 32] << 24) | (secbuf[i + 33] << 16)
| (secbuf[i + 34] << 8) | (secbuf[i + 35]));
dodd = deven >> 1;
deven &= 0x55555555;
dodd &= 0x55555555;
mfmbuf[(i >> 1) + 32] = dodd >> 16;
mfmbuf[(i >> 1) + 33] = dodd;
mfmbuf[(i >> 1) + 256 + 32] = deven >> 16;
mfmbuf[(i >> 1) + 256 + 33] = deven;
}
for (i = 4; i < 24; i += 2)
hck ^= (mfmbuf[i] << 16) | mfmbuf[i + 1];
deven = dodd = hck;
dodd >>= 1;
mfmbuf[24] = dodd >> 16;
mfmbuf[25] = dodd;
mfmbuf[26] = deven >> 16;
mfmbuf[27] = deven;
for (i = 32; i < 544; i += 2)
dck ^= (mfmbuf[i] << 16) | mfmbuf[i + 1];
deven = dodd = dck;
dodd >>= 1;
mfmbuf[28] = dodd >> 16;
mfmbuf[29] = dodd;
mfmbuf[30] = deven >> 16;
mfmbuf[31] = deven;
mfmcode (mfmbuf + 4, 544 - 4);
}
return (num_secs * 544 + FLOPPY_GAP_LEN) * 2 * 8;
}
static uae_u16 amigamfmbuffer[LONGEST_TRACK];
static uae_u8 amigabuffer[512*22];
/* search and align to 0x4489 WORDSYNC markers */
static int isamigatrack(uae_u8 *mfmdata, uae_u8 *mfmdatae, uae_u16 *mfmdst, int track)
{
uae_u16 *dst = amigamfmbuffer;
int len;
int shift, syncshift, sync,ret;
uae_u32 l;
uae_u16 w;
sync = syncshift = shift = 0;
len = (mfmdatae - mfmdata) * 8;
if (len > LONGEST_TRACK * 8)
len = LONGEST_TRACK * 8;
while (len--) {
l = (mfmdata[0] << 16) | (mfmdata[1] << 8) | (mfmdata[2] << 0);
w = l >> (8 - shift);
if (w == 0x4489) {
sync = 1;
syncshift = 0;
}
if (sync) {
if (syncshift == 0) *dst++ = w;
syncshift ++;
if (syncshift == 16) syncshift = 0;
}
shift++;
if (shift == 8) {
mfmdata++;
shift = 0;
}
}
if (sync) {
ret=drive_write_adf_amigados (amigamfmbuffer, dst, amigabuffer, track);
if(!ret)
return amigados_mfmcode (amigabuffer, mfmdst, 11, track);
write_log ("decode error %d\n", ret);
} else {
write_log ("decode error: no sync found\n");
}
return 0;
}
int catweasel_fillmfm (catweasel_drive *d, uae_u16 *mfm, int side, int clock, int rawmode)
{
int i, j, oldsync, syncs[10], synccnt, endcnt;
uae_u32 tt1 = 0, tt2 = 0;
uae_u8 *p1;
int bytes = 0, bits = 0;
static int lasttrack, trycnt;
if (cwc.type == 0)
return 0;
if (d->contr->control_register & d->mot)
return 0;
if (!catweasel_read (d, side, 1, rawmode))
return 0;
if(d->contr->type == CATWEASEL_TYPE_MK1) {
inb(d->contr->iobase + 1);
inb(d->contr->io_mem); /* ignore first byte */
} else {
outb(0, d->contr->iobase + 0xe4);
}
catweasel_read_byte (d);
if (lasttrack == d->track)
trycnt++;
else
trycnt = 0;
lasttrack = d->track;
codec_init_threshtab(trycnt, amiga_thresholds);
i = 0; j = 0;
synccnt = 0;
oldsync = -1;
endcnt = 0;
while (j < LONGEST_TRACK * 4) {
uae_u8 b = catweasel_read_byte (d);
if (b >= 250) {
if (b == 255 - endcnt) {
endcnt++;
if (endcnt == 5)
break;
} else
endcnt = 0;
}
if (rawmode) {
if (b & 0x80) {
if (oldsync < j) {
syncs[synccnt++] = j;
oldsync = j + 300;
}
}
if (synccnt >= 3 && j > oldsync)
break;
}
b = threshtab[b & 0x7f];
tt1 = (tt1 << b) + 1;
tt2 += b;
if (tt2 >= 16) {
tt2 -= 16;
mfmbuf[j++] = tt1 >> (tt2 + 8);
mfmbuf[j++] = tt1 >> tt2;
}
i++;
}
write_log ("cyl=%d, side=%d, length %d, syncs %d\n", d->track, side, j, synccnt);
if (rawmode) {
if (synccnt >= 3) {
p1 = scantrack (mfmbuf + syncs[1], mfmbuf + syncs[2], &bytes, &bits);
if (p1) {
j = 0;
for (i = 0; i < bytes + 2; i+=2) {
mfm[j++] = (p1[i] << 8) | p1[i + 1];
}
return bytes * 8 + bits;
}
}
} else {
return isamigatrack (mfmbuf, mfmbuf + j, mfm, d->track * 2 + side);
}
return 0;
}
int catweasel_read(catweasel_drive *d, int side, int clock, int rawmode)
{
int iobase = d->contr->iobase;
CWSetCReg(d->contr, d->sel, 0);
if(d->contr->type == CATWEASEL_TYPE_MK1) {
CWSetCReg(d->contr, 1<<2, (!side)<<2); /* set disk side */
inb(iobase+1); /* ra reset */
outb(clock*128, iobase+3);
inb(iobase+1);
inb(iobase+0);
// inb(iobase+0);
// outb(0, iobase+3); /* don't store index pulse */
inb(iobase+1);
inb(iobase+7); /* start reading */
sleep_millis(rawmode ? 550 : 225);
outb(0, iobase+1); /* stop reading, don't reset RAM pointer */
outb(128, iobase+0); /* add data end mark */
outb(128, iobase+0);
inb(iobase+1); /* Reset RAM pointer */
} else {
CWSetCReg(d->contr, 1<<6, (!side)<<6); /* set disk side */
outb(0, iobase + 0xe4); /* Reset memory pointer */
switch(clock) {
case 0: /* 28MHz */
outb(128, iobase + 0xec);
break;
case 1: /* 14MHz */
outb(0, iobase + 0xec);
break;
}
inb(iobase + 0xe0);
inb(iobase + 0xe0);
outb(0, iobase + 0xec); /* no IRQs, no MFM predecode */
inb(iobase + 0xe0);
outb(0, iobase + 0xec); /* don't store index pulse */
outb(0, iobase + 0xe4); /* Reset memory pointer */
inb(iobase + 0xf0); /* start reading */
sleep_millis(rawmode ? 550 : 225);
inb(iobase + 0xe4); /* stop reading, don't reset RAM pointer */
outb(255, iobase + 0xe0); /* add data end mark */
outb(254, iobase + 0xe0); /* add data end mark */
outb(253, iobase + 0xe0); /* add data end mark */
outb(252, iobase + 0xe0); /* add data end mark */
outb(251, iobase + 0xe0); /* add data end mark */
outb(0, iobase + 0xe4); /* Reset memory pointer */
}
CWSetCReg(d->contr, 0, d->sel);
return 1;
}
#endif

View File

@ -2643,6 +2643,7 @@ int build_in_prefs (struct uae_prefs *p, int model, int config, int compa, int r
case 7:
v = bip_a500 (p, 3, compa, romcheck);
p->nr_floppies = 0;
p->chipset_mask = CSMASK_ECS_AGNUS;
p->dfxtype[0] = -1;
p->dfxtype[1] = -1;
break;

View File

@ -837,7 +837,7 @@ STATIC_INLINE void fetch (int nr, int fm)
p = bplpt[nr] + bpl_off[nr];
switch (fm) {
case 0:
fetched[nr] = last_custom_value = chipmem_wget (p);
fetched[nr] = last_custom_value = chipmem_agnus_wget (p);
bplpt[nr] += 2;
break;
#ifdef AGA
@ -2381,6 +2381,10 @@ STATIC_INLINE uae_u16 DMACONR (void)
decide_blitter (current_hpos ());
v = dmacon | (bltstate == BLT_done ? 0 : 0x4000)
| (blt_info.blitzero ? 0x2000 : 0);
#if 0
if (!dmaen (DMA_BLITTER))
v &= ~0x4000;
#endif
return v;
}
STATIC_INLINE uae_u16 INTENAR (void)
@ -3389,7 +3393,7 @@ static void predict_copper (void)
if (state == COP_read2) {
w1 = cop_state.i1;
if (w1 & 1) {
w2 = chipmem_wget (ip);
w2 = chipmem_agnus_wget (ip);
if (w2 & 1)
goto done;
state = COP_wait;
@ -3407,9 +3411,9 @@ static void predict_copper (void)
while (c_hpos + 1 < maxhpos) {
if (state == COP_read1) {
w1 = chipmem_wget (ip);
w1 = chipmem_agnus_wget (ip);
if (w1 & 1) {
w2 = chipmem_wget (ip + 2);
w2 = chipmem_agnus_wget (ip + 2);
if (w2 & 1)
break;
state = COP_wait;
@ -3635,7 +3639,7 @@ static void update_copper (int until_hpos)
case COP_read1:
if (copper_cant_read (old_hpos))
continue;
cop_state.i1 = chipmem_wget (cop_state.ip);
cop_state.i1 = chipmem_agnus_wget (cop_state.ip);
#ifdef CPUEMU_6
cycle_line[old_hpos] |= CYCLE_COPPER;
#endif
@ -3649,7 +3653,7 @@ static void update_copper (int until_hpos)
case COP_read2:
if (copper_cant_read (old_hpos))
continue;
cop_state.i2 = chipmem_wget (cop_state.ip);
cop_state.i2 = chipmem_agnus_wget (cop_state.ip);
#ifdef CPUEMU_6
cycle_line[old_hpos] |= CYCLE_COPPER;
#endif
@ -3771,18 +3775,18 @@ static void update_copper (int until_hpos)
if ((vp1 > vcmp || (vp1 == vcmp && hp1 >= hcmp))
&& ((cop_state.saved_i2 & 0x8000) != 0 || ! (DMACONR() & 0x4000)))
cop_state.ignore_next = 1;
if (chipmem_wget (cop_state.ip) & 1) { /* FIXME: HACK!!! */
if (chipmem_agnus_wget (cop_state.ip) & 1) { /* FIXME: HACK!!! */
/* copper never skips if following instruction is WAIT or another SKIP... */
cop_state.ignore_next = 0;
}
cop_state.state = COP_read1;
if (cop_state.ignore_next && (chipmem_wget (cop_state.ip) & 1) == 0) {
if (cop_state.ignore_next && (chipmem_agnus_wget (cop_state.ip) & 1) == 0) {
/* another undocumented copper feature:
copper stops if skipped instruction is MOVE to dangerous register...
*/
test_copper_dangerous (chipmem_wget(cop_state.ip));
test_copper_dangerous (chipmem_agnus_wget(cop_state.ip));
}
record_copper (cop_state.ip - 4, old_hpos, vpos);
@ -3885,7 +3889,7 @@ STATIC_INLINE uae_u16 sprite_fetch (struct sprite *s, int dma, int hpos, int cyc
{
uae_u16 data = last_custom_value;
if (dma) {
data = last_custom_value = chipmem_wget (s->pt);
data = last_custom_value = chipmem_agnus_wget (s->pt);
#ifdef CPUEMU_6
cycle_line[hpos] |= CYCLE_SPRITE;
#endif

View File

@ -27,7 +27,7 @@
extern uae_u32 natmem_offset;
int flashscreen = 0;
static int enforcer_installed = 0;
static int enforcer_installed = 0,enforcermode = 0;
static int enforcer_hit = 0; /* set to 1 if displaying the hit */
#define ENFORCER_BUF_SIZE 4096
@ -182,16 +182,19 @@ static void enforcer_display_hit(const char *addressmode, uae_u32 pc, uaecptr ad
static int bestpc_idxs[INSTRUCTIONLINES/2];
char *enforcer_buf_ptr = enforcer_buf;
uaecptr bestpc,pospc,nextpc,temppc;
if (enforcer_hit) return; /* our function itself generated a hit ;), avoid endless loop */
enforcer_hit = 1;
if (!(sysbase = get_long(4))) return;
if (!(this_task = get_long(sysbase + 276))) return;
task_name = get_long(this_task + 10); /* ln_Name */
native_task_name = amiga2native(task_name,100);
/*if (strcmp(native_task_name,"c:MCP")!=0)
{
Exception (0x2d,0);
}*/
strcpy(enforcer_buf_ptr,"Enforcer Hit! Bad program\n");
enforcer_buf_ptr += strlen(enforcer_buf_ptr);
@ -368,8 +371,13 @@ uae_u32 REGPARAM2 chipmem_lget2 (uaecptr addr)
m = (uae_u32 *)(chipmemory + addr);
if (ISILLEGAL(addr))
{
enforcer_display_hit("LONG READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
}
}
return do_get_mem_long (m);
}
@ -382,8 +390,13 @@ uae_u32 REGPARAM2 chipmem_wget2(uaecptr addr)
m = (uae_u16 *)(chipmemory + addr);
if (ISILLEGAL(addr))
{
enforcer_display_hit("WORD READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
}
}
return do_get_mem_word (m);
}
@ -393,8 +406,14 @@ uae_u32 REGPARAM2 chipmem_bget2 (uaecptr addr)
addr &= chipmem_mask;
if (ISILLEGAL(addr))
{
enforcer_display_hit("BYTE READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
}
}
return chipmemory[addr];
}
@ -407,8 +426,13 @@ void REGPARAM2 chipmem_lput2 (uaecptr addr, uae_u32 l)
m = (uae_u32 *)(chipmemory + addr);
if (ISILLEGAL(addr))
{
enforcer_display_hit("LONG WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
if ( addr!=0x100 ) set_special (SPCFLAG_TRAP);
}
}
do_put_mem_long (m, l);
}
@ -421,8 +445,13 @@ void REGPARAM2 chipmem_wput2 (uaecptr addr, uae_u32 w)
m = (uae_u16 *)(chipmemory + addr);
if (ISILLEGAL(addr))
{
enforcer_display_hit("WORD WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
}
}
do_put_mem_word (m, w);
}
@ -433,8 +462,14 @@ void REGPARAM2 chipmem_bput2 (uaecptr addr, uae_u32 b)
addr &= chipmem_mask;
if (ISILLEGAL(addr))
{
enforcer_display_hit("BYTE WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
chipmemory[addr] = b;
chipmemory[addr] = b;
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
}
}
}
int REGPARAM2 chipmem_check2 (uaecptr addr, uae_u32 size)
@ -455,6 +490,11 @@ uae_u32 REGPARAM2 dummy_lget2 (uaecptr addr)
{
special_mem |= S_READ;
enforcer_display_hit("LONG READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET), addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
return 0;
}
return 0xbadedeef;
}
@ -479,6 +519,11 @@ uae_u32 REGPARAM2 dummy_wget2 (uaecptr addr)
}
#endif
enforcer_display_hit("WORD READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
return 0;
}
return 0xbadf;
}
@ -486,6 +531,11 @@ uae_u32 REGPARAM2 dummy_bget2 (uaecptr addr)
{
special_mem |= S_READ;
enforcer_display_hit("BYTE READ from",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
return 0;
}
return 0xbadedeef;
}
@ -493,18 +543,33 @@ void REGPARAM2 dummy_lput2 (uaecptr addr, uae_u32 l)
{
special_mem |= S_WRITE;
enforcer_display_hit("LONG WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
return;
}
}
void REGPARAM2 dummy_wput2 (uaecptr addr, uae_u32 w)
{
special_mem |= S_WRITE;
enforcer_display_hit("WORD WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
return;
}
}
void REGPARAM2 dummy_bput2 (uaecptr addr, uae_u32 b)
{
special_mem |= S_WRITE;
enforcer_display_hit("BYTE WRITE to",(uae_u32)(regs.pc_p - NATMEM_OFFSET),addr);
if (enforcermode==1)
{
set_special (SPCFLAG_TRAP);
return;
}
}
int REGPARAM2 dummy_check2 (uaecptr addr, uae_u32 size)
@ -520,10 +585,10 @@ int REGPARAM2 dummy_check2 (uaecptr addr, uae_u32 size)
exceptions so enforcer can use it. Returns 1 if enforcer
is enabled
*************************************************************/
int enforcer_enable(void)
int enforcer_enable(int enfmode)
{
extern addrbank chipmem_bank,dummy_bank;
enforcermode=enfmode;
if (!enforcer_installed)
{
saved_dummy_lget = dummy_bank.lget;

View File

@ -312,7 +312,7 @@ static void REGPARAM2 expamem_bput (uaecptr addr, uae_u32 value)
break;
case 0x4c:
write_log (" Card %d (Zorro %s) had no success.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
write_log (" Card %d (Zorro%s) had no success.\n", ecard + 1, expamem_type() == 0xc0 ? "II" : "III");
++ecard;
if (ecard < MAX_EXPANSION_BOARDS)
(*card_init[ecard]) ();
@ -1162,6 +1162,8 @@ void expamem_reset (void)
#ifdef ARCADIA
if (arcadia_rom) {
arcadiaboot = mapped_malloc (0x10000, "arcadia");
arcadia_bank.baseaddr = arcadiaboot;
card_init[cardno] = expamem_init_arcadia;
card_map[cardno++] = expamem_map_arcadia;
}
@ -1170,12 +1172,12 @@ void expamem_reset (void)
card_init[cardno] = expamem_init_fastcard;
card_map[cardno++] = expamem_map_fastcard;
}
if (z3fastmem != NULL) {
if (z3fastmem != NULL && kickstart_version >= 36) {
card_init[cardno] = expamem_init_z3fastmem;
card_map[cardno++] = expamem_map_z3fastmem;
}
#ifdef PICASSO96
if (gfxmemory != NULL) {
if (gfxmemory != NULL && kickstart_version >= 36) {
card_init[cardno] = expamem_init_gfxcard;
card_map[cardno++] = expamem_map_gfxcard;
}
@ -1224,10 +1226,6 @@ void expansion_init (void)
exit (0);
}
filesys_bank.baseaddr = (uae_u8*)filesysory;
#ifdef ARCADIA
arcadiaboot = mapped_malloc (0x10000, "arcadia");
arcadia_bank.baseaddr = arcadiaboot;
#endif
}
void expansion_cleanup (void)

View File

@ -200,7 +200,8 @@ char *get_filesys_unit (struct uaedev_mount_info *mountinfo, int nr,
*blocksize = uip->hf.blocksize;
*size = uip->hf.size;
*bootpri = uip->bootpri;
*flags = uip->automounted ? FILESYS_FLAG_DONOTSAVE : 0;
if (flags)
*flags = uip->automounted ? FILESYS_FLAG_DONOTSAVE : 0;
if (filesysdir)
*filesysdir = uip->filesysdir ? my_strdup (uip->filesysdir) : 0;
return 0;
@ -1744,7 +1745,7 @@ action_lock (Unit *unit, dpacket packet)
uae_u32 err;
if (mode != SHARED_LOCK && mode != EXCLUSIVE_LOCK) {
TRACE(("Bad mode.\n"));
TRACE(("Bad mode %d (should be %d or %d).\n", mode, SHARED_LOCK, EXCLUSIVE_LOCK));
mode = SHARED_LOCK;
}
@ -2763,9 +2764,10 @@ action_parent (Unit *unit, dpacket packet)
if (!lock) {
PUT_PCK_RES1 (packet, 0);
PUT_PCK_RES2 (packet, 0);
return;
} else {
action_parent_common (unit, packet, get_long (lock + 4));
}
action_parent_common (unit, packet, get_long (lock + 4));
TRACE(("=%x %d\n", GET_PCK_RES1 (packet), GET_PCK_RES2 (packet)));
}
static void
@ -3210,10 +3212,18 @@ static uae_u32 exter_int_helper (void)
unit->cmds_complete = unit->cmds_acked;
while (comm_pipe_has_data (unit->ui.back_pipe)) {
uaecptr locks, lockend;
int cnt = 0;
locks = read_comm_pipe_int_blocking (unit->ui.back_pipe);
lockend = locks;
while (get_long (lockend) != 0)
while (get_long (lockend) != 0) {
if (get_long (lockend) == lockend) {
write_log ("filesystem lock queue corrupted!\n");
break;
}
lockend = get_long (lockend);
cnt++;
}
TRACE(("%d %x %x %x\n", cnt, locks, lockend, m68k_areg (regs, 3)));
put_long (lockend, get_long (m68k_areg (regs, 3)));
put_long (m68k_areg (regs, 3), locks);
}

View File

@ -97,15 +97,15 @@ static void generate_func(void)
printf("uaecptr dstp = 0;\n");
printf("for (j = 0; j < b->vblitsize; j++) {\n");
printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n\n");
if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_wget (ptc); ptc += 2; }\n");
if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_wget (ptb); ptb += 2;\n");
if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_agnus_wget (ptc); ptc += 2; }\n");
if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_agnus_wget (ptb); ptb += 2;\n");
if (b_is_on) printf("\t\t\tsrcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;\n");
if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n");
if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_wget (pta); pta += 2; } else { bltadat = blt_info.bltadat; }\n");
if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_agnus_wget (pta); pta += 2; } else { bltadat = blt_info.bltadat; }\n");
if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
if (a_is_on) printf("\t\tsrca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;\n");
if (a_is_on) printf("\t\tpreva = bltadat;\n");
printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n");
printf("\t\tif (dstp) chipmem_agnus_wput (dstp, dstd);\n");
printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
printf("\t\ttotald |= dstd;\n");
printf("\t\tif (ptd) { dstp = ptd; ptd += 2; }\n");
@ -117,7 +117,7 @@ static void generate_func(void)
printf("}\n");
if (b_is_on) printf("b->bltbhold = srcb;\n");
printf("b->bltcdat = srcc;\n");
printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n");
printf("\t\tif (dstp) chipmem_agnus_wput (dstp, dstd);\n");
#if 0
printf("}\n");
#endif
@ -174,15 +174,15 @@ static void generate_func(void)
printf("uaecptr dstp = 0;\n");
printf("for (j = 0; j < b->vblitsize; j++) {\n");
printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n");
if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_wget (ptc); ptc -= 2; }\n");
if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_wget (ptb); ptb -= 2;\n");
if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_agnus_wget (ptc); ptc -= 2; }\n");
if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_agnus_wget (ptb); ptb -= 2;\n");
if (b_is_on) printf("\t\t\tsrcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;\n");
if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n");
if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_wget (pta); pta -= 2; } else { bltadat = blt_info.bltadat; }\n");
if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_agnus_wget (pta); pta -= 2; } else { bltadat = blt_info.bltadat; }\n");
if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
if (a_is_on) printf("\t\tsrca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;\n");
if (a_is_on) printf("\t\tpreva = bltadat;\n");
printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n");
printf("\t\tif (dstp) chipmem_agnus_wput (dstp, dstd);\n");
printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
printf("\t\ttotald |= dstd;\n");
printf("\t\tif (ptd) { dstp = ptd; ptd -= 2; }\n");
@ -194,7 +194,7 @@ static void generate_func(void)
printf("}\n");
if (b_is_on) printf("b->bltbhold = srcb;\n");
printf("b->bltcdat = srcc;\n");
printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n");
printf("\t\tif (dstp) chipmem_agnus_wput (dstp, dstd);\n");
#if 0
printf("}\n");
#endif

View File

@ -44,6 +44,7 @@ typedef struct catweasel_contr {
#define CATWEASEL_TYPE_NONE -1
#define CATWEASEL_TYPE_MK1 1
#define CATWEASEL_TYPE_MK3 3
#define CATWEASEL_TYPE_MK4 4
/* Initialize a Catweasel controller; c->iobase and c->msdelay must have
been initialized -- msdelay might be used */

View File

@ -62,6 +62,7 @@ STATIC_INLINE int dmaen (unsigned int dmamask)
#define SPCFLAG_BLTNASTY 512
#define SPCFLAG_EXEC 1024
#define SPCFLAG_ACTION_REPLAY 2048
#define SPCFLAG_TRAP 4096 /* enforcer-hack */
#define SPCFLAG_MODE_CHANGE 8192
#define SPCFLAG_END_COMPILE 16384

View File

@ -81,6 +81,7 @@ extern uae_u8 *filesysory;
extern uae_u8 *rtarea;
extern addrbank chipmem_bank;
extern addrbank chipmem_agnus_bank;
extern addrbank chipmem_bank_ce2;
extern addrbank kickmem_bank;
extern addrbank custom_bank;
@ -200,6 +201,13 @@ extern void chipmem_lput (uaecptr, uae_u32) REGPARAM;
extern void chipmem_wput (uaecptr, uae_u32) REGPARAM;
extern void chipmem_bput (uaecptr, uae_u32) REGPARAM;
extern uae_u32 chipmem_agnus_lget (uaecptr) REGPARAM;
extern uae_u32 chipmem_agnus_wget (uaecptr) REGPARAM;
extern uae_u32 chipmem_agnus_bget (uaecptr) REGPARAM;
extern void chipmem_agnus_lput (uaecptr, uae_u32) REGPARAM;
extern void chipmem_agnus_wput (uaecptr, uae_u32) REGPARAM;
extern void chipmem_agnus_bput (uaecptr, uae_u32) REGPARAM;
extern uae_u32 chipmem_mask, kickmem_mask;
extern uae_u8 *kickmemory;
extern int kickmem_size;

View File

@ -219,6 +219,7 @@ struct uae_prefs {
int win32_midiindev;
int win32_aspi;
int win32_soundcard;
int win32_norecyclebin;
int curses_reverse_video;

View File

@ -82,7 +82,7 @@ struct inputevent {
#define AM_AF 32 /* supports autofire */
#define AM_INFO 64 /* information data for gui */
#define AM_DUMMY 128 /* placeholder */
#define AM_K (AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF) /* keyboard */
#define AM_K (AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF) /* generic button/switch */
/* event flags */
#define ID_FLAG_AUTOFIRE 1

View File

@ -22,25 +22,25 @@ DEFEVENT(JOY1_VERT,"Joy1 Vertical",AM_JOY_AXIS,0,1,DIR_UP|DIR_DOWN)
DEFEVENT(JOY1_HORIZ_POT,"Joy1 Horizontal (Analog)",AM_JOY_AXIS,64,1,0)
DEFEVENT(JOY1_VERT_POT,"Joy1 Vertical (Analog)",AM_JOY_AXIS,64,1,1)
DEFEVENT(JOY1_LEFT,"Joy1 Left",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_LEFT)
DEFEVENT(JOY1_RIGHT,"Joy1 Right",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_RIGHT)
DEFEVENT(JOY1_UP,"Joy1 Up",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_UP)
DEFEVENT(JOY1_DOWN,"Joy1 Down",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_DOWN)
DEFEVENT(JOY1_LEFT_UP,"Joy1 Left+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_LEFT|DIR_UP)
DEFEVENT(JOY1_LEFT_DOWN,"Joy1 Left+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_LEFT|DIR_DOWN)
DEFEVENT(JOY1_RIGHT_UP,"Joy1 Right+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_RIGHT|DIR_UP)
DEFEVENT(JOY1_RIGHT_DOWN,"Joy1 Right+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,1,DIR_RIGHT|DIR_DOWN)
DEFEVENT(JOY1_LEFT,"Joy1 Left",AM_K,16,1,DIR_LEFT)
DEFEVENT(JOY1_RIGHT,"Joy1 Right",AM_K,16,1,DIR_RIGHT)
DEFEVENT(JOY1_UP,"Joy1 Up",AM_K,16,1,DIR_UP)
DEFEVENT(JOY1_DOWN,"Joy1 Down",AM_K,16,1,DIR_DOWN)
DEFEVENT(JOY1_LEFT_UP,"Joy1 Left+Up",AM_K,16,1,DIR_LEFT|DIR_UP)
DEFEVENT(JOY1_LEFT_DOWN,"Joy1 Left+Down",AM_K,16,1,DIR_LEFT|DIR_DOWN)
DEFEVENT(JOY1_RIGHT_UP,"Joy1 Right+Up",AM_K,16,1,DIR_RIGHT|DIR_UP)
DEFEVENT(JOY1_RIGHT_DOWN,"Joy1 Right+Down",AM_K,16,1,DIR_RIGHT|DIR_DOWN)
DEFEVENT(JOY1_FIRE_BUTTON,"Joy1 Fire/Mouse1 Left Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_1)
DEFEVENT(JOY1_2ND_BUTTON,"Joy1 2nd Button/Mouse1 Right Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_2)
DEFEVENT(JOY1_3RD_BUTTON,"Joy1 3rd Button/Mouse1 Middle Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_3)
DEFEVENT(JOY1_CD32_PLAY,"Joy1 CD32 Play",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_PLAY)
DEFEVENT(JOY1_CD32_RWD,"Joy1 CD32 RWD",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_RWD)
DEFEVENT(JOY1_CD32_FFW,"Joy1 CD32 FFW",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_FFW)
DEFEVENT(JOY1_CD32_GREEN,"Joy1 CD32 Green",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_GREEN)
DEFEVENT(JOY1_CD32_YELLOW,"Joy1 CD32 Yellow",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_YELLOW)
DEFEVENT(JOY1_CD32_RED,"Joy1 CD32 Red",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_RED)
DEFEVENT(JOY1_CD32_BLUE,"Joy1 CD32 Blue",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,1,JOYBUTTON_CD32_BLUE)
DEFEVENT(JOY1_FIRE_BUTTON,"Joy1 Fire/Mouse1 Left Button",AM_K,4,1,JOYBUTTON_1)
DEFEVENT(JOY1_2ND_BUTTON,"Joy1 2nd Button/Mouse1 Right Button",AM_K,4,1,JOYBUTTON_2)
DEFEVENT(JOY1_3RD_BUTTON,"Joy1 3rd Button/Mouse1 Middle Button",AM_K,4,1,JOYBUTTON_3)
DEFEVENT(JOY1_CD32_PLAY,"Joy1 CD32 Play",AM_K,4,1,JOYBUTTON_CD32_PLAY)
DEFEVENT(JOY1_CD32_RWD,"Joy1 CD32 RWD",AM_K,4,1,JOYBUTTON_CD32_RWD)
DEFEVENT(JOY1_CD32_FFW,"Joy1 CD32 FFW",AM_K,4,1,JOYBUTTON_CD32_FFW)
DEFEVENT(JOY1_CD32_GREEN,"Joy1 CD32 Green",AM_K,4,1,JOYBUTTON_CD32_GREEN)
DEFEVENT(JOY1_CD32_YELLOW,"Joy1 CD32 Yellow",AM_K,4,1,JOYBUTTON_CD32_YELLOW)
DEFEVENT(JOY1_CD32_RED,"Joy1 CD32 Red",AM_K,4,1,JOYBUTTON_CD32_RED)
DEFEVENT(JOY1_CD32_BLUE,"Joy1 CD32 Blue",AM_K,4,1,JOYBUTTON_CD32_BLUE)
/* joystick/mouse port 2 */
@ -63,25 +63,25 @@ DEFEVENT(JOY2_VERT,"Joy2 Vertical",AM_JOY_AXIS,0,2,DIR_UP|DIR_DOWN)
DEFEVENT(JOY2_HORIZ_POT,"Joy2 Horizontal (Analog)",AM_JOY_AXIS,64,2,0)
DEFEVENT(JOY2_VERT_POT,"Joy2 Vertical (Analog)",AM_JOY_AXIS,64,2,1)
DEFEVENT(JOY2_LEFT,"Joy2 Left",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_LEFT)
DEFEVENT(JOY2_RIGHT,"Joy2 Right",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_RIGHT)
DEFEVENT(JOY2_UP,"Joy2 Up",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_UP)
DEFEVENT(JOY2_DOWN,"Joy2 Down",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_DOWN)
DEFEVENT(JOY2_LEFT_UP,"Joy2 Left+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_LEFT|DIR_UP)
DEFEVENT(JOY2_LEFT_DOWN,"Joy2 Left+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_LEFT|DIR_DOWN)
DEFEVENT(JOY2_RIGHT_UP,"Joy2 Right+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_RIGHT|DIR_UP)
DEFEVENT(JOY2_RIGHT_DOWN,"Joy2 Right+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,2,DIR_RIGHT|DIR_DOWN)
DEFEVENT(JOY2_LEFT,"Joy2 Left",AM_K,16,2,DIR_LEFT)
DEFEVENT(JOY2_RIGHT,"Joy2 Right",AM_K,16,2,DIR_RIGHT)
DEFEVENT(JOY2_UP,"Joy2 Up",AM_K,16,2,DIR_UP)
DEFEVENT(JOY2_DOWN,"Joy2 Down",AM_K,16,2,DIR_DOWN)
DEFEVENT(JOY2_LEFT_UP,"Joy2 Left+Up",AM_K,16,2,DIR_LEFT|DIR_UP)
DEFEVENT(JOY2_LEFT_DOWN,"Joy2 Left+Down",AM_K,16,2,DIR_LEFT|DIR_DOWN)
DEFEVENT(JOY2_RIGHT_UP,"Joy2 Right+Up",AM_K,16,2,DIR_RIGHT|DIR_UP)
DEFEVENT(JOY2_RIGHT_DOWN,"Joy2 Right+Down",AM_K,16,2,DIR_RIGHT|DIR_DOWN)
DEFEVENT(JOY2_FIRE_BUTTON,"Joy2 Fire/Mouse1 Left Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_1)
DEFEVENT(JOY2_2ND_BUTTON,"Joy2 2nd Button/Mouse1 Right Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_2)
DEFEVENT(JOY2_3RD_BUTTON,"Joy2 3rd Button/Mouse1 Middle Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_3)
DEFEVENT(JOY2_CD32_PLAY,"Joy2 CD32 Play",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_PLAY)
DEFEVENT(JOY2_CD32_RWD,"Joy2 CD32 RWD",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_RWD)
DEFEVENT(JOY2_CD32_FFW,"Joy2 CD32 FFW",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_FFW)
DEFEVENT(JOY2_CD32_GREEN,"Joy2 CD32 Green",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_GREEN)
DEFEVENT(JOY2_CD32_YELLOW,"Joy2 CD32 Yellow",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_YELLOW)
DEFEVENT(JOY2_CD32_RED,"Joy2 CD32 Red",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_RED)
DEFEVENT(JOY2_CD32_BLUE,"Joy2 CD32 Blue",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,2,JOYBUTTON_CD32_BLUE)
DEFEVENT(JOY2_FIRE_BUTTON,"Joy2 Fire/Mouse1 Left Button",AM_K,4,2,JOYBUTTON_1)
DEFEVENT(JOY2_2ND_BUTTON,"Joy2 2nd Button/Mouse1 Right Button",AM_K,4,2,JOYBUTTON_2)
DEFEVENT(JOY2_3RD_BUTTON,"Joy2 3rd Button/Mouse1 Middle Button",AM_K,4,2,JOYBUTTON_3)
DEFEVENT(JOY2_CD32_PLAY,"Joy2 CD32 Play",AM_K,4,2,JOYBUTTON_CD32_PLAY)
DEFEVENT(JOY2_CD32_RWD,"Joy2 CD32 RWD",AM_K,4,2,JOYBUTTON_CD32_RWD)
DEFEVENT(JOY2_CD32_FFW,"Joy2 CD32 FFW",AM_K,4,2,JOYBUTTON_CD32_FFW)
DEFEVENT(JOY2_CD32_GREEN,"Joy2 CD32 Green",AM_K,4,2,JOYBUTTON_CD32_GREEN)
DEFEVENT(JOY2_CD32_YELLOW,"Joy2 CD32 Yellow",AM_K,4,2,JOYBUTTON_CD32_YELLOW)
DEFEVENT(JOY2_CD32_RED,"Joy2 CD32 Red",AM_K,4,2,JOYBUTTON_CD32_RED)
DEFEVENT(JOY2_CD32_BLUE,"Joy2 CD32 Blue",AM_K,4,2,JOYBUTTON_CD32_BLUE)
/* parallel port joystick adapter */
@ -89,29 +89,29 @@ DEFEVENT(PAR_JOY1_START, "Parallel port joystick adapter", AM_INFO, 0,3,0)
DEFEVENT(PAR_JOY1_HORIZ,"Parallel Joy1 Horizontal",AM_JOY_AXIS,0,3,DIR_LEFT|DIR_RIGHT)
DEFEVENT(PAR_JOY1_VERT,"Parallel Joy1 Vertical",AM_JOY_AXIS,0,3,DIR_UP|DIR_DOWN)
DEFEVENT(PAR_JOY1_LEFT,"Parallel Joy1 Left",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_LEFT)
DEFEVENT(PAR_JOY1_RIGHT,"Parallel Joy1 Right",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_RIGHT)
DEFEVENT(PAR_JOY1_UP,"Parallel Joy1 Up",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_UP)
DEFEVENT(PAR_JOY1_DOWN,"Parallel Joy1 Down",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_DOWN)
DEFEVENT(PAR_JOY1_LEFT_UP,"Parallel Joy1 Left+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_LEFT|DIR_UP)
DEFEVENT(PAR_JOY1_LEFT_DOWN,"Parallel Joy1 Left+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_LEFT|DIR_DOWN)
DEFEVENT(PAR_JOY1_RIGHT_UP,"Parallel Joy1 Right+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_RIGHT|DIR_UP)
DEFEVENT(PAR_JOY1_RIGHT_DOWN,"Parallel Joy1 Right+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,3,DIR_RIGHT|DIR_DOWN)
DEFEVENT(PAR_JOY1_FIRE_BUTTON,"Parallel Joy1 Fire Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,3,JOYBUTTON_1)
DEFEVENT(PAR_JOY1_LEFT,"Parallel Joy1 Left",AM_K,16,3,DIR_LEFT)
DEFEVENT(PAR_JOY1_RIGHT,"Parallel Joy1 Right",AM_K,16,3,DIR_RIGHT)
DEFEVENT(PAR_JOY1_UP,"Parallel Joy1 Up",AM_K,16,3,DIR_UP)
DEFEVENT(PAR_JOY1_DOWN,"Parallel Joy1 Down",AM_K,16,3,DIR_DOWN)
DEFEVENT(PAR_JOY1_LEFT_UP,"Parallel Joy1 Left+Up",AM_K,16,3,DIR_LEFT|DIR_UP)
DEFEVENT(PAR_JOY1_LEFT_DOWN,"Parallel Joy1 Left+Down",AM_K,16,3,DIR_LEFT|DIR_DOWN)
DEFEVENT(PAR_JOY1_RIGHT_UP,"Parallel Joy1 Right+Up",AM_K,16,3,DIR_RIGHT|DIR_UP)
DEFEVENT(PAR_JOY1_RIGHT_DOWN,"Parallel Joy1 Right+Down",AM_K,16,3,DIR_RIGHT|DIR_DOWN)
DEFEVENT(PAR_JOY1_FIRE_BUTTON,"Parallel Joy1 Fire Button",AM_K,4,3,JOYBUTTON_1)
DEFEVENT(PAR_JOY2_START, "", AM_DUMMY, 0,4,0)
DEFEVENT(PAR_JOY2_HORIZ,"Parallel Joy2 Horizontal",AM_JOY_AXIS,0,4,DIR_LEFT|DIR_RIGHT)
DEFEVENT(PAR_JOY2_VERT,"Parallel Joy2 Vertical",AM_JOY_AXIS,0,4,DIR_UP|DIR_DOWN)
DEFEVENT(PAR_JOY2_LEFT,"Parallel Joy2 Left",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_LEFT)
DEFEVENT(PAR_JOY2_RIGHT,"Parallel Joy2 Right",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_RIGHT)
DEFEVENT(PAR_JOY2_UP,"Parallel Joy2 Up",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_UP)
DEFEVENT(PAR_JOY2_DOWN,"Parallel Joy2 Down",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_DOWN)
DEFEVENT(PAR_JOY2_LEFT_UP,"Parallel Joy2 Left+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_LEFT|DIR_UP)
DEFEVENT(PAR_JOY2_LEFT_DOWN,"Parallel Joy2 Left+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_LEFT|DIR_DOWN)
DEFEVENT(PAR_JOY2_RIGHT_UP,"Parallel Joy2 Right+Up",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_RIGHT|DIR_UP)
DEFEVENT(PAR_JOY2_RIGHT_DOWN,"Parallel Joy2 Right+Down",AM_KEY|AM_JOY_BUT|AM_AF,16,4,DIR_RIGHT|DIR_DOWN)
DEFEVENT(PAR_JOY2_FIRE_BUTTON,"Parallel Joy2 Fire Button",AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF,4,4,JOYBUTTON_1)
DEFEVENT(PAR_JOY2_LEFT,"Parallel Joy2 Left",AM_K,16,4,DIR_LEFT)
DEFEVENT(PAR_JOY2_RIGHT,"Parallel Joy2 Right",AM_K,16,4,DIR_RIGHT)
DEFEVENT(PAR_JOY2_UP,"Parallel Joy2 Up",AM_K,16,4,DIR_UP)
DEFEVENT(PAR_JOY2_DOWN,"Parallel Joy2 Down",AM_K,16,4,DIR_DOWN)
DEFEVENT(PAR_JOY2_LEFT_UP,"Parallel Joy2 Left+Up",AM_K,16,4,DIR_LEFT|DIR_UP)
DEFEVENT(PAR_JOY2_LEFT_DOWN,"Parallel Joy2 Left+Down",AM_K,16,4,DIR_LEFT|DIR_DOWN)
DEFEVENT(PAR_JOY2_RIGHT_UP,"Parallel Joy2 Right+Up",AM_K,16,4,DIR_RIGHT|DIR_UP)
DEFEVENT(PAR_JOY2_RIGHT_DOWN,"Parallel Joy2 Right+Down",AM_K,16,4,DIR_RIGHT|DIR_DOWN)
DEFEVENT(PAR_JOY2_FIRE_BUTTON,"Parallel Joy2 Fire Button",AM_K,4,4,JOYBUTTON_1)
DEFEVENT(PAR_JOY_END, "", AM_DUMMY, 0,0,0)
@ -277,7 +277,7 @@ DEFEVENT(SPC_STATESAVEDIALOG,"Save state",AM_K,0,0,AKS_STATESAVEDIALOG)
DEFEVENT(SPC_STATERESTOREDIALOG,"Restore state",AM_K,0,0,AKS_STATERESTOREDIALOG)
DEFEVENT(SPC_TOGGLEFULLSCREEN,"Toggle windowed/fullscreen",AM_K,0,0,AKS_TOGGLEFULLSCREEN)
DEFEVENT(SPC_DECREASE_REFRESHRATE,"Decrease emulation speed",AM_K,0,0,AKS_DECREASEREFRESHRATE)
DEFEVENT(SPC_INCREASE_REFRESHRARE,"Increase emulation speed",AM_K,0,0,AKS_INCREASEREFRESHRATE)
DEFEVENT(SPC_INCREASE_REFRESHRATE,"Increase emulation speed",AM_K,0,0,AKS_INCREASEREFRESHRATE)
DEFEVENT(SPC_ARCADIA_DIAGNOSTICS,"Arcadia diagnostics dip switch",AM_K,0,0,AKS_ARCADIADIAGNOSTICS)
DEFEVENT(SPC_ARCADIA_PLAYER1,"Arcadia player 1",AM_K,0,0,AKS_ARCADIAPLY1)

132
memory.c
View File

@ -93,7 +93,7 @@ static struct romdata roms[] = {
{ "Kickstart v1.0 (A1000)(NTSC)", 0, 0, 0x299790ff, 262144, 1, 0, 0, ROMTYPE_KICK },
{ "Kickstart v1.1 (A1000)(NTSC)", 31, 34, 0xd060572a, 262144, 2, 0, 0, ROMTYPE_KICK },
{ "Kickstart v1.1 (A1000)(PAL)", 31, 34, 0xec86dae2, 262144, 3, 0, 0, ROMTYPE_KICK },
{ "Kickstart v1.2 (A1000)", 33, 166, 0x0ed783d0, 262144, 4, 0, 0, ROMTYPE_KICK },
{ "Kickstart v1.2 (A1000)", 33, 166, 0x9ed783d0, 262144, 4, 0, 0, ROMTYPE_KICK },
{ "Kickstart v1.2 (A500,A1000,A2000)", 33, 180, 0xa6ce1636, 262144, 5, 0, 0, ROMTYPE_KICK },
{ "Kickstart v1.3 (A500,A1000,A2000)", 34, 5, 0xc4f0f55f, 262144, 6, 60, 0, ROMTYPE_KICK },
{ "Kickstart v1.3 (A3000)", 34, 5, 0xe0f37258, 262144, 32, 0, 0, ROMTYPE_KICK },
@ -194,14 +194,13 @@ uae_u8 *load_keyfile (struct uae_prefs *p, char *path, int *size)
strcat (tmp, "rom.key");
f = zfile_fopen (tmp, "rb");
if (!f) {
f = zfile_fopen ("roms\\rom.key", "rb");
f = zfile_fopen ("roms/rom.key", "rb");
if (!f) {
strcpy (tmp, start_path);
strcat (tmp, "rom.key");
f = zfile_fopen(tmp, "rb");
if (!f) {
strcpy (tmp, start_path);
strcat (tmp, "..\\shared\\rom\\rom.key");
sprintf (tmp, "%s../shared/rom/rom.key", start_path);
f = zfile_fopen(tmp, "rb");
}
}
@ -302,10 +301,12 @@ struct romdata *getromdatabydata (uae_u8 *rom, int size)
memcpy (rom, tmp, 4);
i = 0;
while (roms[i].name) {
if (crc32a == roms[i].crc32 || crc32b == roms[i].crc32)
return &roms[i];
if (crc32c == roms[i].crc32 && roms[i].type == ROMTYPE_AR)
return &roms[i];
if (roms[i].crc32) {
if (crc32a == roms[i].crc32 || crc32b == roms[i].crc32)
return &roms[i];
if (crc32c == roms[i].crc32 && roms[i].type == ROMTYPE_AR)
return &roms[i];
}
i++;
}
xfree (tmpbuf);
@ -382,7 +383,8 @@ __inline__ void byteput (uaecptr addr, uae_u32 b)
}
#endif
uae_u32 chipmem_mask, kickmem_mask, extendedkickmem_mask, bogomem_mask, a3000mem_mask;
uae_u32 chipmem_mask, chipmem_full_mask;
uae_u32 kickmem_mask, extendedkickmem_mask, bogomem_mask, a3000mem_mask;
static int illegal_count;
/* A dummy bank that only contains zeros */
@ -690,7 +692,6 @@ void REGPARAM2 chipmem_lput (uaecptr addr, uae_u32 l)
do_put_mem_long (m, l);
}
void REGPARAM2 chipmem_wput (uaecptr addr, uae_u32 w)
{
uae_u16 *m;
@ -708,6 +709,66 @@ void REGPARAM2 chipmem_bput (uaecptr addr, uae_u32 b)
chipmemory[addr] = b;
}
uae_u32 REGPARAM2 chipmem_agnus_lget (uaecptr addr)
{
uae_u32 *m;
addr -= chipmem_start & chipmem_full_mask;
addr &= chipmem_full_mask;
m = (uae_u32 *)(chipmemory + addr);
return do_get_mem_long (m);
}
uae_u32 REGPARAM2 chipmem_agnus_wget (uaecptr addr)
{
uae_u16 *m;
addr -= chipmem_start & chipmem_full_mask;
addr &= chipmem_full_mask;
m = (uae_u16 *)(chipmemory + addr);
return do_get_mem_word (m);
}
uae_u32 REGPARAM2 chipmem_agnus_bget (uaecptr addr)
{
addr -= chipmem_start & chipmem_full_mask;
addr &= chipmem_full_mask;
return chipmemory[addr];
}
void REGPARAM2 chipmem_agnus_lput (uaecptr addr, uae_u32 l)
{
uae_u32 *m;
addr -= chipmem_start & chipmem_full_mask;
addr &= chipmem_full_mask;
if (addr >= allocated_chipmem)
return;
m = (uae_u32 *)(chipmemory + addr);
do_put_mem_long (m, l);
}
void REGPARAM2 chipmem_agnus_wput (uaecptr addr, uae_u32 w)
{
uae_u16 *m;
addr -= chipmem_start & chipmem_full_mask;
addr &= chipmem_full_mask;
if (addr >= allocated_chipmem)
return;
m = (uae_u16 *)(chipmemory + addr);
do_put_mem_word (m, w);
}
void REGPARAM2 chipmem_agnus_bput (uaecptr addr, uae_u32 b)
{
addr -= chipmem_start & chipmem_full_mask;
addr &= chipmem_full_mask;
if (addr >= allocated_chipmem)
return;
chipmemory[addr] = b;
}
int REGPARAM2 chipmem_check (uaecptr addr, uae_u32 size)
{
addr -= chipmem_start & chipmem_mask;
@ -1216,6 +1277,12 @@ addrbank chipmem_bank = {
chipmem_xlate, chipmem_check, NULL
};
addrbank chipmem_agnus_bank = {
chipmem_agnus_lget, chipmem_agnus_wget, chipmem_agnus_bget,
chipmem_agnus_lput, chipmem_agnus_wput, chipmem_agnus_bput,
chipmem_xlate, chipmem_check, NULL
};
#ifdef AGA
addrbank chipmem_bank_ce2 = {
chipmem_lget_ce2, chipmem_wget_ce2, chipmem_bget_ce2,
@ -1438,21 +1505,27 @@ static int patch_residents (uae_u8 *kickmemory)
static int load_kickstart (void)
{
struct zfile *f = zfile_fopen (currprefs.romfile, "rb");
char tmprom[MAX_DPATH];
char tmprom[MAX_DPATH], tmprom2[MAX_DPATH];
int patched = 0;
strcpy (tmprom, currprefs.romfile);
if (f == NULL) {
strcpy (currprefs.romfile, "roms/kick.rom");
f = zfile_fopen (currprefs.romfile, "rb");
sprintf (tmprom2, "%s%s", start_path, currprefs.romfile);
f = zfile_fopen (tmprom2, "rb");
if (f == NULL) {
strcpy( currprefs.romfile, "kick.rom" );
f = zfile_fopen( currprefs.romfile, "rb" );
sprintf (currprefs.romfile, "%sroms/kick.rom", start_path);
f = zfile_fopen (currprefs.romfile, "rb");
if (f == NULL) {
strcpy( currprefs.romfile, "..\\shared\\rom\\kick.rom" );
f = zfile_fopen( currprefs.romfile, "rb" );
sprintf (currprefs.romfile, "%skick.rom", start_path);
f = zfile_fopen (currprefs.romfile, "rb");
if (f == NULL) {
sprintf (currprefs.romfile, "%s../shared/rom/kick.rom", start_path);
f = zfile_fopen (currprefs.romfile, "rb");
}
}
}
} else {
strcpy (currprefs.romfile, tmprom2);
}
}
if( f == NULL ) { /* still no luck */
#if defined(AMIGA)||defined(__POS__)
@ -1659,19 +1732,26 @@ void clearexec (void)
static void allocate_memory (void)
{
if (allocated_chipmem != currprefs.chipmem_size) {
int memsize;
if (chipmemory)
mapped_free (chipmemory);
chipmemory = 0;
allocated_chipmem = currprefs.chipmem_size;
chipmem_mask = allocated_chipmem - 1;
chipmemory = mapped_malloc (allocated_chipmem, "chip");
memsize = allocated_chipmem = currprefs.chipmem_size;
chipmem_full_mask = chipmem_mask = allocated_chipmem - 1;
if ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) && allocated_chipmem < 0x100000) {
chipmem_full_mask = 0x100000 - 1;
memsize *= 2;
}
chipmemory = mapped_malloc (memsize, "chip");
if (chipmemory == 0) {
write_log ("Fatal error: out of memory for chipmem.\n");
allocated_chipmem = 0;
} else
clearexec ();
} else {
clearexec ();
if (memsize != allocated_chipmem)
memset (chipmemory + allocated_chipmem, 0xff, memsize - allocated_chipmem);
}
}
if (allocated_bogomem != currprefs.bogomem_size) {
@ -1770,8 +1850,10 @@ void memory_reset (void)
load_extendedkickstart ();
kickmem_mask = 524288 - 1;
if (!load_kickstart ()) {
if (strlen (currprefs.romfile) > 0)
if (strlen (currprefs.romfile) > 0) {
write_log ("%s\n", currprefs.romfile);
notify_user (NUMSG_NOROM);
}
#ifdef AUTOCONFIG
init_ersatz_rom (kickmemory);
ersatzkickfile = 1;

View File

@ -1698,9 +1698,13 @@ static int do_specialties (int cycles)
do_copper ();
}
if (regs.spcflags & SPCFLAG_DOTRACE) {
if (regs.spcflags & SPCFLAG_DOTRACE)
Exception (9,last_trace_ad);
if (regs.spcflags & SPCFLAG_TRAP) {
unset_special (SPCFLAG_TRAP);
Exception (32 + 15, 0);
}
while (regs.spcflags & SPCFLAG_STOP) {
do_cycles (4 * CYCLE_UNIT);
if (regs.spcflags & SPCFLAG_COPPER)

View File

@ -437,7 +437,8 @@ static int recycle (const char *name)
memset (&fos, 0, sizeof (fos));
fos.wFunc = FO_DELETE;
fos.pFrom = p;
fos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NORECURSION | FOF_SILENT;
fos.fFlags = (currprefs.win32_norecyclebin ? 0 : FOF_ALLOWUNDO) |
FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NORECURSION | FOF_SILENT;
v = SHFileOperation (&fos);
xfree (p);
return v ? -1 : 0;
@ -469,14 +470,12 @@ int my_rmdir (const char *name)
}
return recycle (name);
//return RemoveDirectory (name) == 0 ? -1 : 0;
}
/* "move to Recycle Bin" (if enabled) -version of DeleteFile() */
int my_unlink (const char *name)
{
return recycle (name);
//return DeleteFile (name) == 0 ? -1 : 0;
}
int my_rename (const char *oldname, const char *newname)

View File

@ -25,6 +25,8 @@ void init_shm( void )
#else
LPBYTE address = (LPBYTE)0x10000000; // Letting the system decide doesn't seem to work on some systems
#endif
int size = 0x19000000;
int add = 0x1000000;
canbang = 0;
gfxoffs = 0;
@ -37,27 +39,34 @@ void init_shm( void )
shmids[i].addr = NULL;
shmids[i].name[0] = 0;
}
while( address < (LPBYTE)0xa0000000 )
while (address < (LPBYTE)0xa0000000)
{
blah = VirtualAlloc( address, 0x19000000, MEM_RESERVE, PAGE_EXECUTE_READWRITE );
if( blah == NULL )
blah = VirtualAlloc( address, size, MEM_RESERVE, PAGE_EXECUTE_READWRITE );
if (blah == NULL)
{
address += 0x01000000;
address += add;
}
else
{
natmem_offset = (uae_u32)blah + 0x1000000;
natmem_offset = (uae_u32)blah;
write_log ("NATMEM: Our special area: 0x%x-0x%x\n", natmem_offset, natmem_offset + size);
VirtualFree (blah, 0, MEM_RELEASE);
while (address < (LPBYTE)0xa0000000) {
address += add * 8;
blah = VirtualAlloc (address, size, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (blah == NULL) {
address -= add * 8;
break;
}
VirtualFree (blah, 0, MEM_RELEASE);
}
natmem_offset = (uae_u8*)natmem_offset + ((uae_u8*)address - (uae_u8*)natmem_offset) / 2;
write_log ("NATMEM: after adjustment; 0x%x-0x%x\n", natmem_offset, natmem_offset + size);
canbang = 1;
break;
}
}
if( natmem_offset )
{
write_log( "NATMEM: Our special area is 0x%x\n", natmem_offset );
VirtualFree( blah, 0, MEM_RELEASE );
canbang = 1;
}
else
{
if (!natmem_offset) {
write_log( "NATMEM: No special area could be allocated!\n" );
}
}
@ -199,6 +208,12 @@ void *shmat(int shmid, LPVOID shmaddr, int shmflg)
shmids[shmid].attached=result;
return result;
}
if(!strcmp(shmids[shmid].name,"arcadia"))
{
result=natmem_offset+0x10000;
shmids[shmid].attached=result;
return result;
}
}
#endif
@ -210,10 +225,11 @@ void *shmat(int shmid, LPVOID shmaddr, int shmflg)
{
result=(void*)VirtualFree(shmaddr,0,MEM_RELEASE);
}
result =VirtualAlloc(shmaddr,size,MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
result = VirtualAlloc(shmaddr,size,MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if( result == NULL )
{
result = (void *)-1;
write_log ("VirtualAlloc %x %x failed %d\n", shmaddr, size, GetLastError ());
}
else
{

View File

@ -1583,7 +1583,7 @@ static void FillBoardInfo (uaecptr amigamemptr, struct LibResolution *res, struc
put_byte (amigamemptr + PSSO_ModeInfo_first_union, 98);
put_byte (amigamemptr + PSSO_ModeInfo_second_union, 14);
put_long (amigamemptr + PSSO_ModeInfo_PixelClock, dm->res.width * dm->res.height * (currprefs.gfx_refreshrate ? currprefs.gfx_refreshrate : default_freq));
put_long (amigamemptr + PSSO_ModeInfo_PixelClock, dm->res.width * dm->res.height * (currprefs.gfx_refreshrate ? abs (currprefs.gfx_refreshrate) : default_freq));
}
static int AssignModeID( int i, int count )
@ -2235,8 +2235,8 @@ STATIC_INLINE int BlitRectHelper( void )
* If we have a destination RenderInfo, then we've been called from picasso_BlitRectNoMaskComplete()
* and we need to put the results on the screen from the frame-buffer.
*/
//if (dstri == NULL)
if (dstri->Memory == ri->Memory)
//if (dstri->Memory == ri->Memory)
if (dstri == NULL || dstri->Memory == ri->Memory)
{
if( mask != 0xFF && Bpp > 1 )
{
@ -2862,7 +2862,7 @@ void init_hz_p96 (void)
if (isfullscreen ())
rate = DirectDraw_CurrentRefreshRate ();
else
rate = currprefs.gfx_refreshrate;
rate = abs (currprefs.gfx_refreshrate);
if (rate <= 0)
rate = 60;
p96syncrate /= rate;

View File

@ -1258,7 +1258,7 @@ BEGIN
IDS_SELECTFILESYSROOT "Please select your file-system root directory..."
IDS_DEFAULTMIDIOUT "Default MIDI-Out Device"
IDS_CONTRIBUTORS1 "Bernd Schmidt - The Grand-Master\nSam Jordan - Custom-chip, floppy-DMA, etc.\nMathias Ortmann - Original WinUAE Main Guy, BSD Socket support\nBrian King - Picasso96 Support, Integrated GUI for WinUAE, previous WinUAE Main Guy\nToni Wilen - Core updates, WinUAE Main Guy\nGustavo Goedert/Peter Remmers/Michael Sontheimer/Tomi Hakala/Tim Gunn/Nemo Pohle - DOS Port Stuff\nSamuel Devulder/Olaf Barthel/Sam Jordan - Amiga Ports\nKrister Bergman - XFree86 and OS/2 Port\nA. Blanchard/Ernesto Corvi - MacOS Port\nChristian Bauer - BeOS Port\nIan Stephenson - NextStep Port\nPeter Teichmann - Acorn/RiscOS Port\nStefan Reinauer - ZorroII/III AutoConfig, Serial Support\nChristian Schmitt/Chris Hames - Serial Support\nHerman ten Brugge - 68020/68881 Emulation Code\nTauno Taipaleenmaki - Various UAE-Control/UAE-Library Support\nBrett Eden/Tim Gunn/Paolo Besser/Nemo Pohle - Various Docs and Web-Sites\nGeorg Veichtlbauer - Help File coordinator, German GUI\nFulvio Leonardi - Italian translator for WinUAE\n"
IDS_CONTRIBUTORS2 "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser - Postscript printing emulation idea and testing."
IDS_CONTRIBUTORS2 "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser - Postscript printing emulation idea and testing.\nPéter Tóth /Balázs Rátkai/Iván Herczeg/András Arató - Hungarian translation"
IDS_INVALIDPRTPORT "The printer you have in this configuration is not valid on this machine.\n"
IDS_RESTOREUSS "Restore a UAE Snap-Shot File"
IDS_USS "UAE Snap-Shot Files"
@ -1277,7 +1277,7 @@ BEGIN
IDS_PATH "Path"
IDS_RW "R/W"
IDS_SECTORS "Sectors"
IDS_SURFACES "Surfaces"
IDS_SURFACES "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser - Postscript printing emulation idea and testing.\nHungarian translation - Péter Tóth , Balázs Rátkai , Iván Herczeg , András Arató"
IDS_RESERVED "Reserved"
IDS_BLOCKSIZE "Block Size"
IDS_NAME "Name"

View File

@ -1958,7 +1958,7 @@ static void WIN32_HandleRegistryStuff( void )
KEY_ALL_ACCESS, NULL, &hWinUAEKeyLocal, &disposition ) == ERROR_SUCCESS ) )
{
/* Set our (default) sub-key to BE the "WinUAE" command for launching a configuration */
sprintf( path, "%sWinUAE.exe -f \"%%1\"", start_path );
sprintf( path, "%sWinUAE.exe -log -f \"%%1\"", start_path );
RegSetValueEx( hWinUAEKeyLocal, "", 0, REG_SZ, (CONST BYTE *)path, strlen( path ) + 1 );
}
RegCloseKey( hWinUAEKeyLocal );
@ -2222,6 +2222,7 @@ __asm{
posn[1] = 0;
sprintf (help_file, "%sWinUAE.chm", start_path );
sprintf( VersionStr, "WinUAE %d.%d.%d%s", UAEMAJOR, UAEMINOR, UAESUBREV, WINUAEBETA ? WINUAEBETASTR : "" );
SetCurrentDirectory (start_path);
logging_init ();

View File

@ -22,7 +22,7 @@ extern int manual_palette_refresh_needed;
extern int mouseactive, focus;
extern int ignore_messages_all;
#define WINUAEBETA 1
#define WINUAEBETASTR " Beta 1"
#define WINUAEBETASTR " Beta 2"
extern void my_kbd_handler (int, int, int);
extern void clearallkeys(void);

View File

@ -497,7 +497,7 @@ end:
free (p);
}
int scan_roms (char *pathp)
static int scan_roms_2 (char *pathp)
{
HKEY fkey = NULL;
char buf[MAX_PATH], path[MAX_PATH];
@ -530,7 +530,7 @@ int scan_roms (char *pathp)
char tmppath[MAX_PATH];
strcpy (tmppath, path);
strcat (tmppath, find_data.cFileName);
if (scan_rom (tmppath, fkey, keybuf, keysize))
if (find_data.nFileSizeLow < 10000000 && scan_rom (tmppath, fkey, keybuf, keysize))
ret = 1;
if (FindNextFile (handle, &find_data) == 0) {
FindClose (handle);
@ -548,6 +548,20 @@ end:
if (fkey)
RegCloseKey (fkey);
free_keyfile (keybuf);
return ret;
}
int scan_roms (char *pathp)
{
char path[MAX_DPATH];
int ret = scan_roms_2 (pathp);
sprintf (path, "%s..\\shared\\rom\\", start_path);
if (!ret && pathp == NULL) {
ret = scan_roms_2 (path);
if (ret)
set_path ("KickstartPath", path);
}
read_rom_list (0);
show_rom_list ();
return ret;
@ -4313,7 +4327,7 @@ static BOOL MiscDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
break;
}
}
} else {
} else if (currentpage == MISC2_ID) {
misc_getpri (hDlg, IDC_ACTIVE_PRIORITY, &workprefs.win32_active_priority);
misc_getpri (hDlg, IDC_INACTIVE_PRIORITY, &workprefs.win32_inactive_priority);
misc_getpri (hDlg, IDC_MINIMIZED_PRIORITY, &workprefs.win32_iconified_priority);
@ -6128,15 +6142,18 @@ static void swapperhili (HWND hDlg, int entry)
static void addswapperfile (HWND hDlg, int entry)
{
char path[MAX_DPATH];
int lastentry = entry;
if (MultiDiskSelection (hDlg, -1, 0, &changed_prefs, path)) {
char dpath[MAX_DPATH];
loopmulti (path, NULL);
while (loopmulti(path, dpath) && entry < MAX_SPARE_DRIVES) {
strcpy (workprefs.dfxlist[entry], dpath);
lastentry = entry;
entry++;
}
InitializeListView (hDlg);
swapperhili (hDlg, entry);
swapperhili (hDlg, lastentry);
}
}
@ -6270,10 +6287,14 @@ static BOOL CALLBACK SwapperDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM
break;
case IDC_DISKLISTINSERT:
if (entry >= 0 && getfloppybox (hDlg, IDC_DISKTEXT, tmp, sizeof (tmp))) {
strcpy (workprefs.dfxlist[entry], tmp);
InitializeListView (hDlg);
swapperhili (hDlg, entry);
if (entry >= 0) {
if (getfloppybox (hDlg, IDC_DISKTEXT, tmp, sizeof (tmp))) {
strcpy (workprefs.dfxlist[entry], tmp);
InitializeListView (hDlg);
swapperhili (hDlg, entry);
} else {
addswapperfile (hDlg, entry);
}
}
break;