Support for SCL/FDI/UDI disk formats(read-only) in TRDOS.
This commit is contained in:
3092
DiskImage.cpp
Normal file
3092
DiskImage.cpp
Normal file
File diff suppressed because it is too large
Load Diff
206
DiskImage.h
Normal file
206
DiskImage.h
Normal 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
|
||||
15
Makefile
15
Makefile
@@ -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))
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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" />
|
||||
|
||||
14
user_io.c
14
user_io.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user