--- uae/src/disk.c 2018/04/24 16:38:39 1.1 +++ uae/src/disk.c 2018/04/24 16:38:57 1.1.1.2 @@ -1,11 +1,13 @@ - /* + /* * UAE - The Un*x Amiga Emulator - * + * * Floppy disk emulation * * (c) 1995 Bernd Schmidt, Hannu Rummukainen */ +#include + #include "sysconfig.h" #include "sysdeps.h" @@ -18,6 +20,14 @@ #include "disk.h" #include "gui.h" #include "zfile.h" +#include "autoconf.h" +#include "readcpu.h" +#include "newcpu.h" +#include "xwin.h" +#include "osemu.h" +#include "execlib.h" + +#define FLOPPY_GAP_LEN 380 #define FLOPPY_SPEED 5 @@ -35,25 +45,29 @@ typedef struct { ULONG offs; } trackid; +#define MAX_TRACKS 328 + typedef enum { ADF_NORMAL, ADF_EXT1 } drive_filetype; typedef struct { FILE *diskfile; drive_filetype filetype; - trackid trackdata[164]; + trackid trackdata[MAX_TRACKS]; unsigned int track; int motoroff; int wrprot; - UWORD bigmfmbuf[0x2000]; + UWORD bigmfmbuf[0x4000]; int tracklen; unsigned long last_cycles; int mfmpos; + unsigned int num_tracks, num_secs; + int nodskchange; } drive; drive floppy[4]; static void drive_fill_bigbuf(drive *drv); -static void drive_insert(drive *drv, int dnum, char *fname) +static void drive_insert(drive *drv, int dnum, const char *fname) { unsigned char buffer[10]; @@ -73,15 +87,18 @@ static void drive_insert(drive *drv, int case 1: strcpy((char *)df1, fname); break; case 2: strcpy((char *)df2, fname); break; case 3: strcpy((char *)df3, fname); break; - case 4: break; } gui_filename(dnum, fname); + fread(buffer,sizeof(char),8,drv->diskfile); if (strncmp((char *)buffer,"UAE--ADF",8) == 0) { int offs = 160*4+8; int i; drv->filetype = ADF_EXT1; + drv->num_tracks = 160; + drv->num_secs = 11; + drv->wrprot = 1; /* write to adf_ext1 not implemented */ for(i=0; i<160; i++) { fread(buffer, 4, 1, drv->diskfile); @@ -91,23 +108,44 @@ static void drive_insert(drive *drv, int offs += drv->trackdata[i].len; } } else { - int i; + unsigned int i; + drv->filetype = ADF_NORMAL; - for(i=0; i<160; i++) { - drv->trackdata[i].len = 512 * 11; + + fseek(drv->diskfile,0,SEEK_END); + i = ftell(drv->diskfile); + fseek(drv->diskfile,0,SEEK_SET); + + /* High-density disk? */ + if (i >= 160*22*512) + drv->num_tracks = i / (512*(drv->num_secs = 22)); + else + drv->num_tracks = i / (512*(drv->num_secs = 11)); + + if (drv->num_tracks > MAX_TRACKS) + fprintf(stderr, "Your diskfile is too big!\n"); + for(i = 0; i < drv->num_tracks; i++) { + drv->trackdata[i].len = 512 * drv->num_secs; drv->trackdata[i].sync = 0; - drv->trackdata[i].offs = i*512*11; + drv->trackdata[i].offs = i * 512 * drv->num_secs; } } drive_fill_bigbuf(drv); } +static int drive_empty(drive *drv) +{ + return drv->diskfile == 0; +} + static void drive_step(drive *drv) { + if (!drive_empty (drv)) + drv->nodskchange = 1; if (direction) { if (drv->track) drv->track--; } else { - if (drv->track < 85) drv->track++; + if (drv->track < drv->num_tracks/2) drv->track++; } drive_fill_bigbuf(drv); } @@ -123,11 +161,6 @@ static int drive_writeprotected(drive *d return drv->wrprot || drv->diskfile == NULL; } -static int drive_empty(drive *drv) -{ - return drv->diskfile == 0; -} - static int drive_running(drive *drv) { return !drv->motoroff; @@ -155,18 +188,22 @@ static void drive_fill_bigbuf(drive *drv { int tr = drv->track*2 + side; - if (!drv->diskfile) return; + if (!drv->diskfile) { + drv->tracklen = 10; + memset (drv->bigmfmbuf,0xaa,drv->tracklen*2); + return; + } if (drv->trackdata[tr].sync == 0) { /* Normal AmigaDOS format track */ - int sec; - drv->tracklen = 11*544 + 300; - memset(drv->bigmfmbuf,0xaa,300*2); - - for (sec = 0; sec < 11; sec++) { + unsigned int sec; + drv->tracklen = drv->num_secs*544 + FLOPPY_GAP_LEN; + memset(drv->bigmfmbuf,0xaa,FLOPPY_GAP_LEN*2); + + for (sec = 0; sec < drv->num_secs; sec++) { UBYTE secbuf[544]; int i; - UWORD *mfmbuf = drv->bigmfmbuf + 544*sec + 300; + UWORD *mfmbuf = drv->bigmfmbuf + 544*sec + FLOPPY_GAP_LEN; ULONG deven,dodd; ULONG hck=0,dck=0; @@ -175,7 +212,7 @@ static void drive_fill_bigbuf(drive *drv secbuf[4] = 0xff; secbuf[5] = tr; secbuf[6] = sec; - secbuf[7] = 11-sec; + secbuf[7] = drv->num_secs-sec; for(i = 8; i < 24; i++) secbuf[i] = 0; @@ -361,7 +398,7 @@ void disk_eject(int num) drive_eject(floppy + num); } -void disk_insert(int num, char *name) +void disk_insert(int num, const char *name) { /* just to be sure */ drive_eject(floppy + num); @@ -438,7 +475,7 @@ UBYTE DISK_status() if (drive_track0(floppy + dr)) { st &= ~0x10; } if (drive_writeprotected(floppy + dr)) { st &= ~8; } - if (drive_empty(floppy + dr)) { st &= ~0x4; } + if (!floppy[dr].nodskchange) { st &= ~0x4; } } } return st; @@ -474,7 +511,7 @@ int DISK_PrepareReadMFM(int length, UWOR if (need_read) { drive_fill_bigbuf(drv); } - + offset = (cycles - drv->last_cycles) / FLOPPY_SPEED; mfmpos = (drv->mfmpos + offset) % drv->tracklen; drv->last_cycles += offset*FLOPPY_SPEED; @@ -482,13 +519,13 @@ int DISK_PrepareReadMFM(int length, UWOR mfmpos++; mfmpos %= drv->tracklen; while (drv->bigmfmbuf[mfmpos] != sync && mfmpos != drv->mfmpos && use_sync) mfmpos = (mfmpos + 1) % drv->tracklen, time++; - + if (drv->bigmfmbuf[mfmpos] != sync && use_sync) { fprintf(stderr, "warning: sync not found on disk read\n"); return 0; } else mfmpos++; - + mfm_read_length = length; while (length--) { @@ -534,3 +571,7 @@ void DISK_WriteData(int length) } } } + +void trackdisk_install(void) +{ +}