Support for SCL/FDI/UDI disk formats(read-only) in TRDOS.

This commit is contained in:
sorgelig
2017-09-01 20:50:45 +08:00
parent e5e7a344a6
commit 1fa8fc4f14
6 changed files with 3330 additions and 5 deletions

3092
DiskImage.cpp Normal file

File diff suppressed because it is too large Load Diff

206
DiskImage.h Normal file
View File

@@ -0,0 +1,206 @@
#ifndef __DISKIMAGE_H
#define __DISKIMAGE_H
//-----------------------------------------------------------------------------
#ifdef __cplusplus
enum TDiskImageType { DIT_UNK, DIT_TRD, DIT_SCL, DIT_FDI, DIT_TD0, DIT_UDI, DIT_HOB, DIT_FDD };
struct VGFIND_TRACK
{
unsigned char *TrackPointer;
unsigned char *ClkPointer;
unsigned int TrackLength;
bool FoundTrack;
};
struct VGFIND_ADM
{
unsigned char* TrackPointer;
unsigned char* ClkPointer;
unsigned int TrackLength;
unsigned char *ADMPointer;
unsigned int ADMLength;
unsigned int MarkedOffsetADM;
unsigned int OffsetADM;
unsigned int OffsetEndADM;
bool FoundADM;
bool CRCOK;
};
struct VGFIND_SECTOR
{
VGFIND_ADM vgfa;
unsigned char *SectorPointer;
unsigned int SectorLength;
unsigned int MarkedOffsetSector;
unsigned int OffsetSector;
unsigned int OffsetEndSector;
bool FoundDATA;
bool CRCOK;
unsigned char DataMarker;
};
class TDiskImage
{
unsigned int FTrackLength[256][256];
unsigned char* FTracksPtr[256][256][2];
unsigned char FFileName[4096];
TDiskImageType FType;
unsigned char Fdefbuf[16384];
unsigned short MakeVGCRC(unsigned char *data, unsigned long length);
public:
bool Changed;
bool ReadOnly;
bool DiskPresent;
unsigned char MaxTrack;
unsigned char MaxSide;
bool AddBOOT;
TDiskImage();
~TDiskImage();
bool FindTrack(unsigned char CYL, unsigned char SIDE, VGFIND_TRACK *vgft);
bool FindADMark(unsigned char CYL, unsigned char SIDE,
unsigned int FromOffset,
VGFIND_ADM *vgfa);
bool FindSector(unsigned char CYL, unsigned char SIDE,
unsigned char SECT,
VGFIND_SECTOR *vgfs, unsigned int FromOffset=0);
void ApplySectorCRC(VGFIND_SECTOR vgfs);
void FlushImage();
void Open(const char *filename, bool ReadOnly);
char* GetDiskFileName() {return (char*)FFileName; }
void readTRD(int hfile, bool readonly);
void writeTRD(int hfile);
void readSCL(int hfile, bool readonly);
void writeSCL(int hfile);
void readFDI(int hfile, bool readonly);
void writeFDI(int hfile);
void readUDI(int hfile, bool readonly);
void writeUDI(int hfile);
void readTD0(int hfile, bool readonly);
void writeTD0(int hfile);
void readFDD(int hfile, bool readonly);
void writeFDD(int hfile);
void readHOB(int hfile);
void formatTRDOS(unsigned int tracks, unsigned int sides);
void ShowError(const char *str);
};
#pragma pack(1)
struct UDI_HEADER // 16 bytes
{
unsigned char ID[4];
unsigned long UnpackedLength;
unsigned char Version;
unsigned char MaxCylinder;
unsigned char MaxSide;
unsigned char _zero;
unsigned long ExtHdrLength;
};
struct TD0_MAIN_HEADER // 12 bytes
{
char ID[2]; // +0: "TD" - 'Normal'; "td" - packed LZH ('New Advanced data compression')
unsigned char __t; // +2: = 0x00
unsigned char __1; // +3: ???
unsigned char Ver; // +4: Source version (1.0 -> 10, ..., 2.1 -> 21)
unsigned char __2; // +5: ???
unsigned char DiskType; // +6: Source disk type
unsigned char Info; // +7: D7-­ «¨ç¨¥ image info
unsigned char DataDOS; // +8: if(=0)'All sectors were copied', else'DOS Allocated sectors were copied'
unsigned char ChkdSides; // +9: if(=1)'One side was checked', else'Both sides were checked'
unsigned short CRC; // +A: CRC 娤¥à  TD0_MAIN_HEADER (ªà®¬¥ ¡ ©â á CRC)
};
struct TD0_INFO_DATA // 10 ¡ ©â ¡¥§ áâப¨ ª®¬¥­â à¨ï...
{
unsigned short CRC; // +0: CRC ¤«ï áâàãªâãàë COMMENT_DATA (¡¥§ ¡ ©â®¢ CRC)
unsigned short strLen; // +2: „«¨­  áâப¨ ª®¬¥­â à¨ï
unsigned char Year; // +4: „ â  á®§¤ ­¨ï - £®¤ (1900 + X)
unsigned char Month; // +5: „ â  á®§¤ ­¨ï - ¬¥áïæ (Ÿ­¢ àì=0, ”¥¢à «ì=1,...)
unsigned char Day; // +6: „ â  á®§¤ ­¨ï - ç¨á«®
unsigned char Hours; // +7: ‚६ï á®§¤ ­¨ï - ç áë
unsigned char Minutes; // +8: ‚६ï á®§¤ ­¨ï - ¬¨­ãâë
unsigned char Seconds; // +9: ‚६ï á®§¤ ­¨ï - ᥪ㭤ë
};
struct TD0_TRACK_HEADER // 4 bytes
{
unsigned char SectorCount;
unsigned char Track;
unsigned char Side;
unsigned char CRCL;
};
struct TD0_SECT_HEADER // 8 bytes
{
unsigned char ADRM[6];
unsigned short DataLength;
};
struct FDD_MAIN_HEADER
{
char ID[30]; /* ᨣ­ âãà  */
unsigned char MaxTracks; /* ç¨á«® â४®¢ (樫¨­¤à®¢) */
unsigned char MaxHeads; /* ç¨á«® £®«®¢®ª (1 ¨«¨ 2) */
long diskIndex; /* unused */
long DataOffset[512*2]; /* ᬥ饭¨¥ ¢ ä ©«¥ ª áâàãªâãà ¬ § £®«®¢ª®¢ */
/* â४®¢ */
};
struct FDD_TRACK_HEADER
{
unsigned char trkType; /* unused */
unsigned char SectNum; /* ç¨á«® ᥪâ®à®¢ ­  â४¥ */
struct
{
/* § £®«®¢®ª ᥪâ®à  */
unsigned char trk; /* ­®¬¥à â४  */
unsigned char side; /* ­®¬¥à áâ®à®­ë */
/* 7 ¡¨â í⮣® ¡ ©â  㪠§ë¢ ¥â ¡¨â a */
unsigned char sect; /* ­®¬¥à ᥪâ®à  */
unsigned char size; /* à §¬¥à ᥪâ®à  (ª®¤) */
long SectPos; /* ᬥ饭¨¥ ¢ ä ©«¥ ª ¤ ­­ë¬ ᥪâ®à  */
} sect[256];
};
struct TRDOS_DIR_ELEMENT // 16 bytes
{
char FileName[8];
char Type;
unsigned short Start;
unsigned short Length;
unsigned char SecLen;
unsigned char FirstSec;
unsigned char FirstTrk;
};
#pragma pack()
#else
int x2trd(char *name, fileTYPE *f);
int x2trd_ext_supp(char *name);
#endif
//-----------------------------------------------------------------------------
#endif

View File

@@ -11,16 +11,18 @@ STRIP = $(BASE)-strip
PRJ = MiSTer
SRC = $(wildcard *.c)
SRC2 = $(wildcard *.cpp)
OBJ = $(SRC:.c=.o)
DEP = $(SRC:.c=.d)
OBJ = $(SRC:.c=.o) $(SRC2:.cpp=.o)
DEP = $(SRC:.c=.d) $(SRC2:.cpp=.d)
CFLAGS = $(DFLAGS) -c -O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DVDATE=\"`date +"%y%m%d"`\"
LFLAGS = -lc
LFLAGS = -lc -lstdc++ -lrt
$(PRJ): $(OBJ)
@$(info $@)
@$(LD) $(LFLAGS) -o $@ $+
@cp $@ $@.elf
@$(STRIP) $@
clean:
@@ -31,9 +33,16 @@ clean:
@$(info $<)
@$(CC) $(CFLAGS) -o $@ -c $< 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g'
%.o: %.cpp
@$(info $<)
@$(CC) $(CFLAGS) -o $@ -c $< 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g'
-include $(DEP)
%.d: %.c
@$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g'
%.d: %.cpp
@$(CC) $(DFLAGS) -MM $< -MT $@ -MT $*.o -MF $@ 2>&1 | sed -e 's/\(.[a-zA-Z]\+\):\([0-9]\+\):\([0-9]\+\):/\1(\2,\ \3):/g'
# Ensure correct time stamp
main.o: $(filter-out main.o, $(OBJ))

View File

@@ -42,6 +42,7 @@
<ClCompile Include="archie.c" />
<ClCompile Include="boot.c" />
<ClCompile Include="config.c" />
<ClCompile Include="DiskImage.cpp" />
<ClCompile Include="file_io.c" />
<ClCompile Include="fdd.c" />
<ClCompile Include="fpga_io.c" />
@@ -66,6 +67,7 @@
<ClInclude Include="charrom.h" />
<ClInclude Include="config.h" />
<ClInclude Include="debug.h" />
<ClInclude Include="DiskImage.h" />
<ClInclude Include="file_io.h" />
<ClInclude Include="fdd.h" />
<ClInclude Include="fpga_base_addr_ac5.h" />

View File

@@ -71,6 +71,9 @@
<ClCompile Include="tzx2wav.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DiskImage.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="archie.h">
@@ -157,6 +160,9 @@
<ClInclude Include="tzx2wav.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="DiskImage.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="build.sh" />

View File

@@ -21,6 +21,7 @@
#include "menu.h"
#include "x86.h"
#include "tzx2wav.h"
#include "DiskImage.h"
#define BREAK 0x8000
@@ -591,9 +592,18 @@ void user_io_set_index(unsigned char index)
int user_io_file_mount(int num, char *name)
{
int writable = FileCanWrite(name);
int writable = 0;
int ret = 0;
if (x2trd_ext_supp(name))
{
ret = x2trd(name, sd_image+num);
}
else
{
writable = FileCanWrite(name);
ret = FileOpenEx(&sd_image[num], name, writable ? (O_RDWR | O_SYNC) : O_RDONLY);
}
int ret = FileOpenEx(&sd_image[num], name, writable ? (O_RDWR | O_SYNC) : O_RDONLY);
if (!ret)
{
writable = 0;