This commit is contained in:
Toni Wilen 2014-03-22 20:27:25 +02:00
parent 7d9d35b75a
commit 6df2d7e31e
15 changed files with 1575 additions and 1414 deletions

View File

@ -630,7 +630,7 @@ void cfgfile_target_dwrite_str (struct zfile *f, const TCHAR *option, const TCHA
cfg_dowrite (f, option, value, 1, 1);
}
void cfgfile_write (struct zfile *f, const TCHAR *option, const TCHAR *optionext, const TCHAR *format,...)
void cfgfile_write_ext (struct zfile *f, const TCHAR *option, const TCHAR *optionext, const TCHAR *format,...)
{
va_list parms;
TCHAR tmp[CONFIG_BLEN], tmp2[CONFIG_BLEN];
@ -654,7 +654,7 @@ void cfgfile_write (struct zfile *f, const TCHAR *option, const TCHAR *format,..
cfg_dowrite (f, option, tmp, 0, 0);
va_end (parms);
}
void cfgfile_dwrite (struct zfile *f, const TCHAR *option, const TCHAR *optionext, const TCHAR *format,...)
void cfgfile_dwrite_ext (struct zfile *f, const TCHAR *option, const TCHAR *optionext, const TCHAR *format,...)
{
va_list parms;
TCHAR tmp[CONFIG_BLEN], tmp2[CONFIG_BLEN];
@ -1212,13 +1212,13 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
const TCHAR *ext = j == 0 ? NULL : _T("_rtg");
for (int i = 0; i <MAX_FILTERSHADERS; i++) {
if (gf->gfx_filtershader[i][0])
cfgfile_write (f, _T("gfx_filter_pre"), ext, _T("D3D:%s"), gf->gfx_filtershader[i]);
cfgfile_write_ext (f, _T("gfx_filter_pre"), ext, _T("D3D:%s"), gf->gfx_filtershader[i]);
if (gf->gfx_filtermask[i][0])
cfgfile_write_str (f, _T("gfx_filtermask_pre"), ext, gf->gfx_filtermask[i]);
}
for (int i = 0; i <MAX_FILTERSHADERS; i++) {
if (gf->gfx_filtershader[i + MAX_FILTERSHADERS][0])
cfgfile_write (f, _T("gfx_filter_post"), ext, _T("D3D:%s"), gf->gfx_filtershader[i + MAX_FILTERSHADERS]);
cfgfile_write_ext (f, _T("gfx_filter_post"), ext, _T("D3D:%s"), gf->gfx_filtershader[i + MAX_FILTERSHADERS]);
if (gf->gfx_filtermask[i + MAX_FILTERSHADERS][0])
cfgfile_write_str (f, _T("gfx_filtermask_post"), ext, gf->gfx_filtermask[i + MAX_FILTERSHADERS]);
}
@ -1226,7 +1226,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
{
bool d3dfound = false;
if (gf->gfx_filtershader[2 * MAX_FILTERSHADERS][0] && p->gfx_api) {
cfgfile_dwrite (f, _T("gfx_filter"), ext, _T("D3D:%s"), gf->gfx_filtershader[2 * MAX_FILTERSHADERS]);
cfgfile_dwrite_ext (f, _T("gfx_filter"), ext, _T("D3D:%s"), gf->gfx_filtershader[2 * MAX_FILTERSHADERS]);
d3dfound = true;
}
if (!d3dfound) {
@ -1241,35 +1241,35 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
i++;
}
} else {
cfgfile_dwrite (f, _T("gfx_filter"), ext, _T("no"));
cfgfile_dwrite_ext (f, _T("gfx_filter"), ext, _T("no"));
}
}
}
cfgfile_dwrite_str (f, _T("gfx_filter_mode"), ext, filtermode2[gf->gfx_filter_filtermode]);
cfgfile_dwrite (f, _T("gfx_filter_vert_zoomf"), ext, _T("%f"), gf->gfx_filter_vert_zoom);
cfgfile_dwrite (f, _T("gfx_filter_horiz_zoomf"), ext, _T("%f"), gf->gfx_filter_horiz_zoom);
cfgfile_dwrite (f, _T("gfx_filter_vert_zoom_multf"), ext, _T("%f"), gf->gfx_filter_vert_zoom_mult);
cfgfile_dwrite (f, _T("gfx_filter_horiz_zoom_multf"), ext, _T("%f"), gf->gfx_filter_horiz_zoom_mult);
cfgfile_dwrite (f, _T("gfx_filter_vert_offsetf"), ext, _T("%f"), gf->gfx_filter_vert_offset);
cfgfile_dwrite (f, _T("gfx_filter_horiz_offsetf"), ext, _T("%f"), gf->gfx_filter_horiz_offset);
cfgfile_dwrite (f, _T("gfx_filter_scanlines"), ext, _T("%d"), gf->gfx_filter_scanlines);
cfgfile_dwrite (f, _T("gfx_filter_scanlinelevel"), ext, _T("%d"), gf->gfx_filter_scanlinelevel);
cfgfile_dwrite (f, _T("gfx_filter_scanlineratio"), ext, _T("%d"), gf->gfx_filter_scanlineratio);
cfgfile_dwrite (f, _T("gfx_filter_luminance"), ext, _T("%d"), gf->gfx_filter_luminance);
cfgfile_dwrite (f, _T("gfx_filter_contrast"), ext, _T("%d"), gf->gfx_filter_contrast);
cfgfile_dwrite (f, _T("gfx_filter_saturation"), ext, _T("%d"), gf->gfx_filter_saturation);
cfgfile_dwrite (f, _T("gfx_filter_gamma"), ext, _T("%d"), gf->gfx_filter_gamma);
cfgfile_dwrite (f, _T("gfx_filter_blur"), ext, _T("%d"), gf->gfx_filter_blur);
cfgfile_dwrite (f, _T("gfx_filter_noise"), ext, _T("%d"), gf->gfx_filter_noise);
cfgfile_dwrite_ext (f, _T("gfx_filter_vert_zoomf"), ext, _T("%f"), gf->gfx_filter_vert_zoom);
cfgfile_dwrite_ext (f, _T("gfx_filter_horiz_zoomf"), ext, _T("%f"), gf->gfx_filter_horiz_zoom);
cfgfile_dwrite_ext (f, _T("gfx_filter_vert_zoom_multf"), ext, _T("%f"), gf->gfx_filter_vert_zoom_mult);
cfgfile_dwrite_ext (f, _T("gfx_filter_horiz_zoom_multf"), ext, _T("%f"), gf->gfx_filter_horiz_zoom_mult);
cfgfile_dwrite_ext (f, _T("gfx_filter_vert_offsetf"), ext, _T("%f"), gf->gfx_filter_vert_offset);
cfgfile_dwrite_ext (f, _T("gfx_filter_horiz_offsetf"), ext, _T("%f"), gf->gfx_filter_horiz_offset);
cfgfile_dwrite_ext (f, _T("gfx_filter_scanlines"), ext, _T("%d"), gf->gfx_filter_scanlines);
cfgfile_dwrite_ext (f, _T("gfx_filter_scanlinelevel"), ext, _T("%d"), gf->gfx_filter_scanlinelevel);
cfgfile_dwrite_ext (f, _T("gfx_filter_scanlineratio"), ext, _T("%d"), gf->gfx_filter_scanlineratio);
cfgfile_dwrite_ext (f, _T("gfx_filter_luminance"), ext, _T("%d"), gf->gfx_filter_luminance);
cfgfile_dwrite_ext (f, _T("gfx_filter_contrast"), ext, _T("%d"), gf->gfx_filter_contrast);
cfgfile_dwrite_ext (f, _T("gfx_filter_saturation"), ext, _T("%d"), gf->gfx_filter_saturation);
cfgfile_dwrite_ext (f, _T("gfx_filter_gamma"), ext, _T("%d"), gf->gfx_filter_gamma);
cfgfile_dwrite_ext (f, _T("gfx_filter_blur"), ext, _T("%d"), gf->gfx_filter_blur);
cfgfile_dwrite_ext (f, _T("gfx_filter_noise"), ext, _T("%d"), gf->gfx_filter_noise);
cfgfile_dwrite_bool (f, _T("gfx_filter_bilinear"), ext, gf->gfx_filter_bilinear != 0);
cfgfile_dwrite (f, _T("gfx_filter_keep_autoscale_aspect"), ext, _T("%d"), gf->gfx_filter_keep_autoscale_aspect);
cfgfile_dwrite_ext (f, _T("gfx_filter_keep_autoscale_aspect"), ext, _T("%d"), gf->gfx_filter_keep_autoscale_aspect);
cfgfile_dwrite_str (f, _T("gfx_filter_keep_aspect"), ext, aspects[gf->gfx_filter_keep_aspect]);
cfgfile_dwrite_str (f, _T("gfx_filter_autoscale"), ext, autoscale[gf->gfx_filter_autoscale]);
cfgfile_dwrite (f, _T("gfx_filter_aspect_ratio"), ext, _T("%d:%d"),
cfgfile_dwrite_ext (f, _T("gfx_filter_aspect_ratio"), ext, _T("%d:%d"),
gf->gfx_filter_aspect >= 0 ? (gf->gfx_filter_aspect / ASPECTMULT) : -1,
gf->gfx_filter_aspect >= 0 ? (gf->gfx_filter_aspect & (ASPECTMULT - 1)) : -1);
if (gf->gfx_filteroverlay[0]) {
cfgfile_dwrite (f, _T("gfx_filter_overlay"), ext, _T("%s%s"),
cfgfile_dwrite_ext(f, _T("gfx_filter_overlay"), ext, _T("%s%s"),
gf->gfx_filteroverlay, _tcschr (gf->gfx_filteroverlay, ',') ? _T(",") : _T(""));
}
}

View File

@ -2624,10 +2624,10 @@ STATIC_INLINE void decide_line (int hpos)
}
if (dmaecs) {
// did we just match ddfstop but missed ddfstrt? DMA starts from passed plfstop state.
// did we just match ddfstop - 3 but missed ddfstrt? DMA starts from passed plfstop state.
if (last_decide_line_hpos > plfstrt && (plf_state == plf_active || plf_state == plf_wait_stop) && diwstate == DIW_waiting_stop) {
int stop = get_ddfstop_to_test (last_decide_line_hpos);
if (last_decide_line_hpos < stop && hpos >= stop) {
if (last_decide_line_hpos < stop && hpos >= stop - 3) {
if (dma) {
// we did, fetches start!
bplstart = plfstop;

View File

@ -168,6 +168,7 @@ typedef struct {
uae_u16 bigmfmbuf[0x4000 * DDHDMULT];
uae_u16 tracktiming[0x4000 * DDHDMULT];
int multi_revolution;
int revolution_check;
int skipoffset;
int mfmpos;
int indexoffset;
@ -205,6 +206,7 @@ typedef struct {
int amax;
int lastdataacesstrack;
int lastrev;
bool track_access_done;
#endif
} drive;
@ -772,8 +774,11 @@ int DISK_validate_filename (struct uae_prefs *p, const TCHAR *fname, int leave_o
static void updatemfmpos (drive *drv)
{
if (drv->prevtracklen)
if (drv->prevtracklen) {
drv->mfmpos = drv->mfmpos * (drv->tracklen * 1000 / drv->prevtracklen) / 1000;
if (drv->mfmpos >= drv->tracklen)
drv->mfmpos = drv->tracklen - 1;
}
drv->mfmpos %= drv->tracklen;
drv->prevtracklen = drv->tracklen;
}
@ -1750,8 +1755,9 @@ static void drive_fill_bigbuf (drive * drv, int force)
drv->tracktiming[0] = 0;
drv->skipoffset = -1;
drv->revolutions = 1;
retrytrack = drv->lastdataacesstrack == drv->cyl * 2 + side;
if (!dskdmaen && !retrytrack)
drv->track_access_done = false;
//write_log (_T("%d:%d %d\n"), drv->cyl, side, retrytrack);
if (drv->writediskfile && drv->writetrackdata[tr].bitlen > 0) {
@ -2649,6 +2655,8 @@ static void DISK_check_change (void)
{
if (currprefs.floppy_speed != changed_prefs.floppy_speed)
currprefs.floppy_speed = changed_prefs.floppy_speed;
if (currprefs.floppy_read_only != changed_prefs.floppy_read_only)
currprefs.floppy_read_only = changed_prefs.floppy_read_only;
for (int i = 0; i < MAX_FLOPPY_DRIVES; i++) {
drive *drv = floppy + i;
if (currprefs.floppyslots[i].dfxtype != changed_prefs.floppyslots[i].dfxtype) {
@ -2918,7 +2926,7 @@ static void disk_dmafinished (void)
dskdmaen = DSKDMA_OFF;
dsklength = 0;
if (disk_debug_logging > 0) {
int dr, mfmpos = -1;
int dr;
write_log (_T("disk dma finished %08X MFMpos="), dskpt);
for (dr = 0; dr < MAX_FLOPPY_DRIVES; dr++)
write_log (_T("%d%s"), floppy[dr].mfmpos, dr < MAX_FLOPPY_DRIVES - 1 ? _T(",") : _T(""));
@ -2928,19 +2936,22 @@ static void disk_dmafinished (void)
static void fetchnextrevolution (drive *drv)
{
if (drv->revolution_check)
return;
drv->trackspeed = get_floppy_speed2 (drv);
#if 0
if (1 || drv->mfmpos != 0) {
write_log (_T("REVOLUTION: %d %d/%d %d %d\n"), drv->trackspeed, drv->mfmpos, drv->tracklen, drv->floppybitcounter);
write_log (_T("REVOLUTION: DMA=%d %d %d/%d %d %d %d\n"), dskdmaen, drv->trackspeed, drv->mfmpos, drv->tracklen, drv->indexoffset, drv->floppybitcounter);
}
#endif
drv->revolution_check = 2;
if (!drv->multi_revolution)
return;
switch (drv->filetype)
{
case ADF_IPF:
#ifdef CAPS
caps_loadrevolution (drv->bigmfmbuf, drv->tracktiming, drv - floppy, drv->cyl * 2 + side, &drv->tracklen, &drv->lastrev);
caps_loadrevolution (drv->bigmfmbuf, drv->tracktiming, drv - floppy, drv->cyl * 2 + side, &drv->tracklen, &drv->lastrev, drv->track_access_done);
#endif
break;
case ADF_SCP:
@ -2950,12 +2961,23 @@ static void fetchnextrevolution (drive *drv)
break;
case ADF_FDI:
#ifdef FDI2RAW
fdi2raw_loadrevolution (drv->fdi, drv->bigmfmbuf, drv->tracktiming, drv->cyl * 2 + side, &drv->tracklen, 1);
fdi2raw_loadrevolution(drv->fdi, drv->bigmfmbuf, drv->tracktiming, drv->cyl * 2 + side, &drv->tracklen, 1);
#endif
break;
}
}
static void do_disk_index (void)
{
#if 0
write_log(_T("INDEX %d\n"), indexdecay);
#endif
if (!indexdecay) {
indexdecay = 2;
cia_diskindex ();
}
}
void DISK_handler (uae_u32 data)
{
int flag = data & 255;
@ -2976,12 +2998,8 @@ void DISK_handler (uae_u32 data)
}
if (flag & DISK_WORDSYNC)
INTREQ (0x8000 | 0x1000);
if (flag & DISK_INDEXSYNC) {
if (!indexdecay) {
indexdecay = 2;
cia_diskindex ();
}
}
if (flag & DISK_INDEXSYNC)
do_disk_index ();
}
static void disk_doupdate_write (drive * drv, int floppybits)
@ -3085,7 +3103,7 @@ static void disk_doupdate_predict (int startcycle)
drive *drv = &floppy[dr];
if (drv->motoroff)
continue;
if (drv->motoroff || !drv->trackspeed)
if (!drv->trackspeed)
continue;
if (selected & (1 << dr))
continue;
@ -3108,25 +3126,29 @@ static void disk_doupdate_predict (int startcycle)
else
tword |= getonebit (drv->bigmfmbuf, mfmpos);
}
if ((tword & 0xffff) == dsksync && dsksync != 0)
if (dskdmaen != DSKDMA_READ && (tword & 0xffff) == dsksync && dsksync != 0)
diskevent_flag |= DISK_WORDSYNC;
}
mfmpos++;
mfmpos %= drv->tracklen;
if (mfmpos == 0 && !dskdmaen)
diskevent_flag |= DISK_REVOLUTION << (drv - floppy);
if (mfmpos == drv->indexoffset)
diskevent_flag |= DISK_INDEXSYNC;
if (!dskdmaen) {
if (mfmpos == 0)
diskevent_flag |= DISK_REVOLUTION << (drv - floppy);
if (mfmpos == drv->indexoffset)
diskevent_flag |= DISK_INDEXSYNC;
}
if (dskdmaen != DSKDMA_WRITE && mfmpos == drv->skipoffset) {
update_jitter ();
int skipcnt = disk_jitter;
while (skipcnt-- > 0) {
mfmpos++;
mfmpos %= drv->tracklen;
if (mfmpos == 0)
diskevent_flag |= DISK_REVOLUTION << (drv - floppy);
if (mfmpos == drv->indexoffset)
diskevent_flag |= DISK_INDEXSYNC;
if (!dskdmaen) {
if (mfmpos == 0)
diskevent_flag |= DISK_REVOLUTION << (drv - floppy);
if (mfmpos == drv->indexoffset)
diskevent_flag |= DISK_INDEXSYNC;
}
}
}
if (diskevent_flag)
@ -3139,6 +3161,7 @@ static void disk_doupdate_predict (int startcycle)
finaleventflag = diskevent_flag;
}
}
if (finaleventflag && (finaleventcycle >> 8) < maxhpos) {
event2_newevent (ev2_disk, (finaleventcycle - startcycle) >> 8, ((finaleventcycle >> 8) << 8) | finaleventflag);
}
@ -3243,17 +3266,32 @@ static void disk_doupdate_read (drive * drv, int floppybits)
if (disk_debug_logging > 1 && drv->indexhack)
write_log (_T("indexhack cleared\n"));
drv->indexhack = 0;
}
if (drv->mfmpos == drv->skipoffset) {
update_jitter ();
drv->mfmpos += disk_jitter;
drv->mfmpos %= drv->tracklen;
do_disk_index ();
}
if (drv->mfmpos == 0) {
fetchnextrevolution (drv);
if (drv->tracktiming[0])
updatetrackspeed (drv, drv->mfmpos);
}
if (drv->mfmpos == drv->skipoffset) {
update_jitter ();
int skipcnt = disk_jitter;
while (skipcnt-- > 0) {
drv->mfmpos++;
drv->mfmpos %= drv->tracklen;
if (drv->mfmpos == drv->indexoffset) {
if (disk_debug_logging > 1 && drv->indexhack)
write_log (_T("indexhack cleared\n"));
drv->indexhack = 0;
do_disk_index ();
}
if (drv->mfmpos == 0) {
fetchnextrevolution (drv);
if (drv->tracktiming[0])
updatetrackspeed (drv, drv->mfmpos);
}
}
}
if ((bitoffset & 7) == 7) {
dskbytr_val = word & 0xff;
dskbytr_val |= 0x8000;
@ -3264,6 +3302,7 @@ static void disk_doupdate_read (drive * drv, int floppybits)
if (disk_debug_logging && dma_enable == 0)
write_log (_T("Sync match, DMA started at %d PC=%08x\n"), drv->mfmpos, M68K_GETPC);
dma_enable = 1;
INTREQ (0x8000 | 0x1000);
}
if (adkcon & 0x400) {
bitoffset = 15;
@ -3305,6 +3344,7 @@ uae_u16 DSKBYTR (int hpos)
continue;
if (!(selected & (1 << dr))) {
drv->lastdataacesstrack = drv->cyl * 2 + side;
drv->track_access_done = true;
if (disk_debug_mode & DISK_DEBUG_PIO) {
if (disk_debug_track < 0 || disk_debug_track == 2 * drv->cyl + side) {
disk_dma_debugmsg ();
@ -3333,6 +3373,7 @@ static void DISK_start (void)
if (dskdmaen == DSKDMA_READ) {
drv->lastdataacesstrack = drv->cyl * 2 + side;
drv->track_access_done = true;
}
if (dskdmaen == DSKDMA_WRITE) {
@ -3365,6 +3406,8 @@ void DISK_hsync (void)
drive *drv = &floppy[dr];
if (drv->steplimit)
drv->steplimit--;
if (drv->revolution_check)
drv->revolution_check--;
}
if (indexdecay)
indexdecay--;

View File

@ -3152,8 +3152,8 @@ bool vsync_handle_check (void)
notice_screen_contents_lost ();
notice_new_xcolors ();
}
check_prefs_changed_audio ();
check_prefs_changed_cd ();
check_prefs_changed_audio ();
check_prefs_changed_custom ();
check_prefs_changed_cpu ();
check_picasso ();

View File

@ -1063,7 +1063,10 @@ static int lastmx, lastmy;
static uaecptr magicmouse_ibase, magicmouse_gfxbase;
static int dimensioninfo_width, dimensioninfo_height, dimensioninfo_dbl;
static int vp_xoffset, vp_yoffset, mouseoffset_x, mouseoffset_y;
static int tablet_maxx, tablet_maxy, tablet_data;
static int tablet_maxx, tablet_maxy, tablet_maxz;
static int tablet_resx, tablet_resy;
static int tablet_maxax, tablet_maxay, tablet_maxaz;
static int tablet_data;
int mousehack_alive (void)
{
@ -1207,6 +1210,33 @@ static bool mousehack_enable (void)
return true;
}
static void inputdevice_update_tablet_params(void)
{
uae_u8 *p;
if (inputdevice_is_tablet() <= 0 || !mousehack_address)
return;
p = get_real_address(mousehack_address);
p[MH_MAXX] = tablet_maxx >> 8;
p[MH_MAXX + 1] = tablet_maxx;
p[MH_MAXY] = tablet_maxy >> 8;
p[MH_MAXY + 1] = tablet_maxy;
p[MH_MAXZ] = tablet_maxz >> 8;
p[MH_MAXZ + 1] = tablet_maxz;
p[MH_RESX] = tablet_resx >> 8;
p[MH_RESX + 1] = tablet_resx;
p[MH_RESY] = tablet_resy >> 8;
p[MH_RESY + 1] = tablet_resy;
p[MH_MAXAX] = tablet_maxax >> 8;
p[MH_MAXAX + 1] = tablet_maxax;
p[MH_MAXAY] = tablet_maxay >> 8;
p[MH_MAXAY + 1] = tablet_maxay;
p[MH_MAXAZ] = tablet_maxaz >> 8;
p[MH_MAXAZ + 1] = tablet_maxaz;
}
void input_mousehack_mouseoffset (uaecptr pointerprefs)
{
mouseoffset_x = (uae_s16)get_word (pointerprefs + 28);
@ -1220,6 +1250,7 @@ int input_mousehack_status (int mode, uaecptr diminfo, uaecptr dispinfo, uaecptr
} else if (mode == 5) {
mousehack_address = m68k_dreg (regs, 0);
mousehack_enable ();
inputdevice_update_tablet_params ();
} else if (mode == 0) {
if (mousehack_address) {
uae_u8 v = get_byte (mousehack_address + MH_E);
@ -1340,11 +1371,6 @@ void inputdevice_tablet (int x, int y, int z, int pressure, uae_u32 buttonbits,
p[MH_AZ] = az >> 8;
p[MH_AZ + 1] = az;
p[MH_MAXX] = tablet_maxx >> 8;
p[MH_MAXX + 1] = tablet_maxx;
p[MH_MAXY] = tablet_maxy >> 8;
p[MH_MAXY + 1] = tablet_maxy;
p[MH_PRESSURE] = pressure >> 8;
p[MH_PRESSURE + 1] = pressure;
@ -1381,32 +1407,16 @@ void inputdevice_tablet (int x, int y, int z, int pressure, uae_u32 buttonbits,
void inputdevice_tablet_info (int maxx, int maxy, int maxz, int maxax, int maxay, int maxaz, int xres, int yres)
{
uae_u8 *p;
if (!uae_boot_rom || !mousehack_address)
return;
p = get_real_address (mousehack_address);
tablet_maxx = maxx;
tablet_maxy = maxy;
p[MH_MAXX] = maxx >> 8;
p[MH_MAXX + 1] = maxx;
p[MH_MAXY] = maxy >> 8;
p[MH_MAXY + 1] = maxy;
p[MH_MAXZ] = maxz >> 8;
p[MH_MAXZ + 1] = maxz;
tablet_maxz = maxz;
p[MH_RESX] = xres >> 8;
p[MH_RESX + 1] = xres;
p[MH_RESY] = yres >> 8;
p[MH_RESY + 1] = yres;
p[MH_MAXAX] = maxax >> 8;
p[MH_MAXAX + 1] = maxax;
p[MH_MAXAY] = maxay >> 8;
p[MH_MAXAY + 1] = maxay;
p[MH_MAXAZ] = maxaz >> 8;
p[MH_MAXAZ + 1] = maxaz;
tablet_resx = xres;
tablet_resy = yres;
tablet_maxax = maxax;
tablet_maxay = maxay;
tablet_maxaz = maxaz;
inputdevice_update_tablet_params();
}
@ -1446,11 +1456,12 @@ static void inputdevice_mh_abs (int x, int y, uae_u32 buttonbits)
p[MH_CNT]++;
tablet_data = 1;
#if 0
if (inputdevice_is_tablet () <= 0) {
tabletlib_tablet_info (1000, 1000, 0, 0, 0, 0, 1000, 1000);
tabletlib_tablet (x, y, 0, 0, buttonbits, -1, 0, 0, 0);
}
#endif
}
#if 0

File diff suppressed because it is too large Load Diff

View File

@ -236,6 +236,16 @@ enum {
cgiitRevolution // CapsRevolutionInfo
};
// recognized image types
enum {
citError=0, // error preventing the type identification
citUnknown, // unknown image type
citIPF, // IPF image
citCTRaw, // CT Raw image
citKFStream, // KryoFlux stream files
citDraft // Draft image
};
// image error status
enum {
imgeOk=0,

View File

@ -31,5 +31,7 @@ ExtSub SDWORD __cdecl CAPSFdcInvalidateTrack(PCAPSFDC pc, SDWORD drive);
ExtSub SDWORD __cdecl CAPSFormatDataToMFM(PVOID pformattrack, UDWORD flag);
ExtSub SDWORD __cdecl CAPSGetInfo(PVOID pinfo, SDWORD id, UDWORD cylinder, UDWORD head, UDWORD inftype, UDWORD infid);
ExtSub SDWORD __cdecl CAPSSetRevolution(SDWORD id, UDWORD value);
ExtSub SDWORD __cdecl CAPSGetImageType(PCHAR name);
ExtSub SDWORD __cdecl CAPSGetImageTypeMemory(PUBYTE buffer, UDWORD length);
#endif

View File

@ -16,8 +16,10 @@
#include "CapsAPI.h"
#define CAPS_TRACKTIMING 1
#define LOG_REVOLUTION 0
static SDWORD caps_cont[4]= {-1, -1, -1, -1};
static bool caps_revolution_hack[4];
static int caps_locked[4];
static int caps_flags = DI_LOCK_DENVAR|DI_LOCK_DENNOISE|DI_LOCK_NOISE|DI_LOCK_UPDATEFD|DI_LOCK_TYPE|DI_LOCK_OVLBIT;
static struct CapsVersionInfo cvi;
@ -47,6 +49,8 @@ typedef SDWORD (__cdecl* CAPSGETINFO)(PVOID pinfo, SDWORD id, UDWORD cylinder, U
static CAPSGETINFO pCAPSGetInfo;
typedef SDWORD (__cdecl* CAPSSETREVOLUTION)(SDWORD id, UDWORD value);
static CAPSSETREVOLUTION pCAPSSetRevolution;
typedef SDWORD (__cdecl* CAPSGETIMAGETYPEMEMORY)(PUBYTE buffer, UDWORD length);
static CAPSGETIMAGETYPEMEMORY pCAPSGetImageTypeMemory;
int caps_init (void)
{
@ -91,7 +95,8 @@ int caps_init (void)
pCAPSUnlockAllTracks = (CAPSUNLOCKALLTRACKS)GetProcAddress (h, "CAPSUnlockAllTracks");
pCAPSGetVersionInfo = (CAPSGETVERSIONINFO)GetProcAddress (h, "CAPSGetVersionInfo");
pCAPSGetInfo = (CAPSGETINFO)GetProcAddress (h, "CAPSGetInfo");
pCAPSSetRevolution = (CAPSSETREVOLUTION)GetProcAddress (h, "CAPSSetRevolution");
pCAPSSetRevolution = (CAPSSETREVOLUTION)GetProcAddress(h, "CAPSSetRevolution");
pCAPSGetImageTypeMemory = (CAPSGETIMAGETYPEMEMORY)GetProcAddress(h, "CAPSGetImageTypeMemory");
init = 1;
cvi.type = 1;
@ -123,6 +128,7 @@ int caps_loadimage (struct zfile *zf, int drv, int *num_tracks)
uae_u8 *buf;
TCHAR s1[100];
struct CapsDateTimeExt *cdt;
int type;
if (!caps_init ())
return 0;
@ -130,11 +136,25 @@ int caps_loadimage (struct zfile *zf, int drv, int *num_tracks)
zfile_fseek (zf, 0, SEEK_END);
len = zfile_ftell (zf);
zfile_fseek (zf, 0, SEEK_SET);
if (len <= 0)
return 0;
buf = xmalloc (uae_u8, len);
if (!buf)
return 0;
if (zfile_fread (buf, len, 1, zf) == 0)
return 0;
type = -1;
if (pCAPSGetImageTypeMemory) {
type = pCAPSGetImageTypeMemory(buf, len);
if (type == citError || type == citUnknown) {
write_log(_T("caps: CAPSGetImageTypeMemory() returned %d\n"), type);
return 0;
}
if (type == citKFStream || type == citDraft) {
write_log(_T("caps: CAPSGetImageTypeMemory() returned unsupported image type %d\n"), type);
return 0;
}
}
ret = pCAPSLockImageMemory (caps_cont[drv], buf, len, 0);
xfree (buf);
if (ret != imgeOk) {
@ -164,10 +184,10 @@ int caps_loadimage (struct zfile *zf, int drv, int *num_tracks)
}
ret = pCAPSLoadImage(caps_cont[drv], caps_flags);
caps_revolution_hack[drv] = type == citCTRaw;
cdt = &ci.crdt;
_stprintf (s1, _T("%d.%d.%d %d:%d:%d"), cdt->day, cdt->month, cdt->year, cdt->hour, cdt->min, cdt->sec);
write_log (_T("caps: type:%d date:%s rel:%d rev:%d\n"),
ci.type, s1, ci.release, ci.revision);
write_log (_T("caps: type:%d imagetype:%d date:%s rel:%d rev:%d\n"), ci.type, type, s1, ci.release, ci.revision);
return 1;
}
@ -228,11 +248,17 @@ static int load (struct CapsTrackInfoT2 *ci, int drv, int track, bool seed, bool
return 1;
}
int caps_loadrevolution (uae_u16 *mfmbuf, uae_u16 *tracktiming, int drv, int track, int *tracklength, int *nextrev)
int caps_loadrevolution (uae_u16 *mfmbuf, uae_u16 *tracktiming, int drv, int track, int *tracklength, int *nextrev, bool track_access_done)
{
int len;
struct CapsTrackInfoT2 ci;
if (!track_access_done && caps_revolution_hack[drv]) {
#if LOG_REVOLUTION
write_log(_T("%03d skipped revolution increase\n"), track);
#endif
return 1;
}
if (!load (&ci, drv, track, false, false))
return 0;
if (oldlib)
@ -251,7 +277,9 @@ int caps_loadrevolution (uae_u16 *mfmbuf, uae_u16 *tracktiming, int drv, int tra
CapsRevolutionInfo pinfo;
*nextrev = 0;
pCAPSGetInfo(&pinfo, caps_cont[drv], track / 2, track & 1, cgiitRevolution, 0);
//write_log (_T("get next rev = %d\n"), pinfo.next);
#if LOG_REVOLUTION
write_log (_T("%03d load next rev = %d\n"), track, pinfo.next);
#endif
if (pinfo.max > 0)
*nextrev = pinfo.next;
}
@ -270,20 +298,28 @@ int caps_loadtrack (uae_u16 *mfmbuf, uae_u16 *tracktiming, int drv, int track, i
if (nextrev && pCAPSSetRevolution) {
if (sametrack) {
pCAPSSetRevolution(caps_cont[drv], *nextrev);
//write_log (_T("set rev = %d\n"), *nextrev);
#if LOG_REVOLUTION
write_log(_T("%03d set rev = %d\n"), track, *nextrev);
#endif
} else {
pCAPSSetRevolution(caps_cont[drv], 0);
#if LOG_REVOLUTION
write_log(_T("%03d clear rev\n"), track, *nextrev);
#endif
}
}
if (!load (&ci, drv, track, true, sametrack != true))
return 0;
if (nextrev && sametrack && pCAPSGetInfo) {
*nextrev = 0;
if (pCAPSGetInfo) {
if (nextrev)
*nextrev = 0;
pCAPSGetInfo(&pinfo, caps_cont[drv], track / 2, track & 1, cgiitRevolution, 0);
//write_log (_T("get next rev = %d\n"), pinfo.next);
if (pinfo.max > 0)
#if LOG_REVOLUTION
write_log(_T("%03d get next rev = %d\n"), track, pinfo.next);
#endif
if (nextrev && sametrack && pinfo.max > 0)
*nextrev = pinfo.next;
}

View File

@ -2,5 +2,5 @@ int caps_init (void);
void caps_unloadimage (int drv);
int caps_loadimage (struct zfile *zf, int drv, int *num_tracks);
int caps_loadtrack (uae_u16 *mfmbuf, uae_u16 *tracktiming, int drv, int track, int *tracklength, int *multirev, int *gapoffset, int *nextrev, bool setrev);
int caps_loadrevolution (uae_u16 *mfmbuf, uae_u16 *tracktiming, int drv, int track, int *tracklength, int *nextrev);
int caps_loadrevolution (uae_u16 *mfmbuf, uae_u16 *tracktiming, int drv, int track, int *tracklength, int *nextrev, bool track_access_done);

View File

@ -1569,7 +1569,7 @@ static LRESULT CALLBACK AmigaWindowProc (HWND hWnd, UINT message, WPARAM wParam,
case WT_PACKET:
{
PACKET pkt;
if (inputdevice_is_tablet () <= 0) {
if (inputdevice_is_tablet () <= 0 && !currprefs.tablet_library) {
close_tablet (tablet);
tablet = NULL;
return 0;

View File

@ -19,11 +19,11 @@
#define LANG_DLL 1
#if WINUAEPUBLICBETA
#define WINUAEBETA _T("11")
#define WINUAEBETA _T("12")
#else
#define WINUAEBETA _T("")
#endif
#define WINUAEDATE MAKEBD(2014, 3, 18)
#define WINUAEDATE MAKEBD(2014, 3, 22)
#define WINUAEEXTRA _T("")
//#define WINUAEEXTRA _T("AmiKit Preview")
//#define WINUAEEXTRA _T("Amiga Forever Edition")

View File

@ -11,6 +11,59 @@
- restore only single input target to default.
Beta 12:
- Config file writing created corrupted (and harmless) config file lines, most common being
uaehf line which fortunately isn't important config line entry. (b11)
- BCHG/BCLR/BSET allowed PC-relative addressing modes, broken since the beginning. (from Hatari)
- If program read disk by polling DSKBYTR (not using DMA), index emulation was unstable.
- Switching bitplane DMA on few cycles (not yet confirmed, I assume range that makes sense is 1 to 3)
cycles before DDFSTOP will also trigger ECS/AGA "passed plfstop" state change. (Death Trap)
- Full tablet emulation boot division by zero guru fix.
- Tablet.library emulation now works but at least dpaint5 does not seem to do anything with pressure
data. It reads pressure tag contents but nothing seems to happen.
Beta 11:
- Borderblank + bordersprite caused border glitches in some situations.
- CDTV front panel buttons' default state after reset should be enabled, not disabled.
- Added new double options to non-lace modes. Not really useful, maybe be moved somewhere else later..
- 68040 MOVE16 write access error stack frame is now correct.
- Editing non-existing new style real harddrive config entry opened hardfile properties dialog.
- Separate filter options for native and RTG modes. Currently only following settings are RTG compatible:
Direct3D shader filters (no software filter support and never will be), masks, overlays, scanlines.
- New automatic resolution option was unreliable in some situations.
- Do not detect modes with VTOTAL=350 or less as scandoubled to fix Super72 halved height.
- tablet.library emulation, totally untested, do not enable.
- After long field to short field change last line still showed old background color(s) if line had any
background color changes before field mode was changed.
- Master floppy write protection config option was not loaded from config. (wrong config entry name..)
- Disk emulation multirevolution support was unstable, disk revolution data stream change was not always bit perfect.
- Added Super Card Pro (scp) image file support. (Don't ask me if images don't work, I didn't implement it originally)
- Added support for raw dumps from Softpres Capture Tool and KryoFlux using new capslib v0.5.
Yes, above two changes in same beta is only a strange coincidence. Note that both are raw dumps which
can't be confirmed easily, don't bother me if there are compatibility problems.
FPU improvements (Mostly low level stuff that only makes difference if unimplemented checkbox is not ticked, much
more important for Previous emulator, NextStep OS requires FPU and uses it heavily):
- 6888x any FPU instruction (except FSAVE/FRESTORE) causes null state to idle state transition but
68040+ conditional FPU instructions won't affect null state.
- 68040 unimplemented FPU instruction emulation was broken, FSAVE exception frame was not emulated, 68040.library
emulation code needs it for proper operation.
- 68040/060 FPU FMOVECR is now unimplemented instruction.
- 68040/060 unimplemented packed-decimal data type exception is now emulated.
- 68060 FMOVEM.X with dynamic list now causes unimplemented effective address exception.
- 68060 F<op>.X #imm,FPn and F<op>.P #imm,FPn now causes unimplemented effective address exception.
- 68060 FMOVEM.L #imm,<more than 1 control register> now causes unimplemented effective address exception.
- FMOVEM.X with dynamic list and -(An) and (An)+ effective address overrides static/dynamic post/pred state.
(for example FMOVEM.X Dn,-(An) uses pre-decrement even if mode bits are set to dynamic post-increment)
- All FPU FPSR register (overflow, div by zero etc..) status bits emulated. (May not be fully reliable)
- 6888x Packed-Decimal Real k-factor support fully implemented. (May still have rounding bugs)
This should complete emulation all FPU features except arithmetic exceptions (that no one seems to use)
Beta 10:
- Programmed display mode positioning bug fixed, should fix remaining problems with clipped left or right edges.

View File

@ -101,15 +101,15 @@
- 0 0 4 fiea
0000 1000 01ss sSSS:000:--Z--:-----:13: BCHG #1,s[Dreg]
- 6 0 6
0000 1000 01ss sSSS:000:--Z--:-----:13: BCHG #1,s[!Areg,Dreg,Immd]
0000 1000 01ss sSSS:000:--Z--:-----:13: BCHG #1,s[!Areg,Dreg,Immd,PC8r,PC16]
- 0 0 6 fiea
0000 1000 10ss sSSS:000:--Z--:-----:13: BCLR #1,s[Dreg]
- 6 0 6
0000 1000 10ss sSSS:000:--Z--:-----:13: BCLR #1,s[!Areg,Dreg,Immd]
0000 1000 10ss sSSS:000:--Z--:-----:13: BCLR #1,s[!Areg,Dreg,Immd,PC8r,PC16]
- 0 0 6 fiea
0000 1000 11ss sSSS:000:--Z--:-----:13: BSET #1,s[Dreg]
- 6 0 6
0000 1000 11ss sSSS:000:--Z--:-----:13: BSET #1,s[!Areg,Dreg,Immd]
0000 1000 11ss sSSS:000:--Z--:-----:13: BSET #1,s[!Areg,Dreg,Immd,PC8r,PC16]
- 0 0 6 fiea
0000 1010 0011 1100:000:XNZVC:XNZVC:10: EORSR.B #1
@ -144,15 +144,15 @@
- 0 0 4 fea
0000 rrr1 01ss sSSS:000:--Z--:-----:13: BCHG Dr,s[Dreg]
- 6 0 6
0000 rrr1 01ss sSSS:000:--Z--:-----:13: BCHG Dr,s[!Areg,Dreg,Immd]
0000 rrr1 01ss sSSS:000:--Z--:-----:13: BCHG Dr,s[!Areg,Dreg,Immd,PC8r,PC16]
- 0 0 6 fea
0000 rrr1 10ss sSSS:000:--Z--:-----:13: BCLR Dr,s[Dreg]
- 6 0 6
0000 rrr1 10ss sSSS:000:--Z--:-----:13: BCLR Dr,s[!Areg,Dreg,Immd]
0000 rrr1 10ss sSSS:000:--Z--:-----:13: BCLR Dr,s[!Areg,Dreg,Immd,PC8r,PC16]
- 0 0 6 fea
0000 rrr1 11ss sSSS:000:--Z--:-----:13: BSET Dr,s[Dreg]
- 6 0 6
0000 rrr1 11ss sSSS:000:--Z--:-----:13: BSET Dr,s[!Areg,Dreg,Immd]
0000 rrr1 11ss sSSS:000:--Z--:-----:13: BSET Dr,s[!Areg,Dreg,Immd,PC8r,PC16]
- 0 0 6 fea
% Move cycles are special cased in gencpu.c

View File

@ -55,6 +55,8 @@ static void filltags (uaecptr tabletdata)
put_long (tabletdata + 12, tablet_maxx);
put_long (tabletdata + 16, tablet_maxy);
//write_log(_T("P=%d BUT=%08X\n"), tablet_pressure, tablet_buttonbits);
// pressure
put_long (p, 0x8003a000 + 6);
p += 4;
@ -135,10 +137,10 @@ static uae_u32 REGPARAM2 lib_dofunc (TrapContext *context)
uaecptr td = m68k_areg (regs, 1);
filltags (td);
if (ksversion < 39)
return 1;
return 0;
td = get_long (im + 52);
if (!td)
return 1;
return 0;
return 1;
}
static uae_u32 REGPARAM2 lib_unkfunc (TrapContext *context)