70 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
72 19, 19, 19, 19, 19, 19, 19,
74 18, 18, 18, 18, 18, 18,
86 0x00000, 0x01500, 0x02A00, 0x03F00, 0x05400, 0x06900, 0x07E00, 0x09300,
88 0x0A800, 0x0BD00, 0x0D200, 0x0E700, 0x0FC00, 0x11100, 0x12600, 0x13B00,
90 0x15000, 0x16500, 0x17800, 0x18B00, 0x19E00, 0x1B100, 0x1C400, 0x1D700,
92 0x1EA00, 0x1FC00, 0x20E00, 0x22000, 0x23200, 0x24400, 0x25600, 0x26700,
94 0x27800, 0x28900, 0x29A00, 0x2AB00, 0x2BC00, 0x2CD00, 0x2DE00, 0x2EF00,
107static void d64_start_transaction(
D64Handle * _handle ) {
115static void d64_commit_transaction(
D64Handle * _handle ) {
122static void d64_rollback_transaction(
D64Handle * _handle ) {
165 for(
int i=0; i<(_track-1); ++i ) {
188 int offset = d64_calculate_offset( _track, _sector );
213 for(
int i=0; i<_sectors; ++i ) {
214 d64_free_sector_on_bam( _entry, i );
228 int offset = _sector >> 3;
229 int bitmap = 1 << ( _sector & 0x07 );
265 int offset = _sector >> 3;
266 int bitmap = 1 << ( _sector & 0x07 );
296 for(
int i=0; i<35; ++i ) {
324 switch( _handle->
format ) {
326 d64_allocate_sector_on_bam( &bam->
entriesSpeedDOS[_track-36], _sector );
331 d64_allocate_sector_on_bam( &bam->
entriesSpeedDOS[_track-36], _sector );
343 d64_allocate_sector_on_bam( &bam->
entriesSpeedDOS[_track-36], _sector );
353 d64_allocate_sector_on_bam( &bam->
entries[_track-1], _sector );
388 switch( _handle->
format ) {
424 int bitmap = 1 << ( sector & 0x07 );
469 int directoryIndex = 0;
474 value = &directory->
entries[directoryIndex];
487 if ( directoryIndex == 8 ) {
500 d64_find_free_sector( _handle, &track, §or );
502 if ( track == 0 && sector == 0 ) {
507 d64_allocate_sector( _handle, track, sector );
519 }
while( value == NULL );
545 int offsetAsSectors = d64_calculate_sectors( _track, _sector );
548 _handle->
errors[offsetAsSectors] = _error_code;
580 memset( _entry->
filename, 0xa0, 16 );
581 for(
int i=0,c=strlen( _filename ) > 16 ? 16 : strlen( _filename ); i<c; ++i ) {
582 _entry->
filename[i] = toupper(_filename[i]);
602static void d64_format(
D64Handle * _handle ) {
611 switch( _handle->
format ) {
648 _handle->
sectors = d64_calculate_sectors( _handle->
tracks + 1, 1 );
669 for(
int i=0; i<_handle->
tracks; ++i ) {
720 switch( _handle->
format ) {
726 memcpy( bam->
standard.
diskName, _disk_name, strlen( _disk_name ) > 16 ? 16 : strlen( _disk_name ) );
746 switch( _handle->
format ) {
769 memcpy( bam->
dosType, _dos_type, 2 );
783 memset( handle, 0,
sizeof(
D64Handle ) );
787 d64_format( handle );
806 d64_start_transaction( _handle );
820 unsigned char * buffer = _buffer;
835 previous->
track = track;
836 previous->
sector = sector;
841 d64_find_free_sector( _handle, &track, §or );
843 if ( track == 0 && sector == 0 ) {
844 d64_rollback_transaction( _handle );
849 d64_allocate_sector( _handle, track, sector );
853 if ( firstTrack == 0 ) {
855 firstSector = sector;
860 previous = sectorData;
863 sectorData = (
D64SectorData *) d64_get_sector( _handle, track, sector );
869 if ( _size <= 254 ) {
874 sectorData->
track = 0;
875 sectorData->
sector = (_size + 1);
878 memcpy( §orData->
data[0], buffer, _size );
887 memcpy( §orData->
data[0], buffer, 254 );
899 previous->
track = track;
900 previous->
sector = sector;
909 d64_write_directory_entry( entry, _filename, _type, firstTrack, firstSector, sectors );
910 d64_commit_transaction( _handle );
913 d64_rollback_transaction( _handle );
936 FILE * fHandle = fopen( _filename,
"wb" );
void d64_set_disk_name(D64Handle *_handle, unsigned char *_disk_name)
Set the disk name for the given disk image.
D64DosVersion versionByFormat[]
D64Handle * d64_create(D64Format _format)
Create a new D64 disk image.
void d64_set_disk_id(D64Handle *_handle, D64DiskId _disk_id)
Set the disk id for the given disk image.
void d64_output(D64Handle *_handle, unsigned char *_filename)
unsigned char dosTypeByFormat[][3]
void d64_set_dos_version(D64Handle *_handle, D64DosVersion _version)
Set the DOS version for the given disk image.
void d64_free(D64Handle *_handle)
Free the disk image resources.
int d64_write_file(D64Handle *_handle, unsigned char *_filename, D64FileType _type, unsigned char *_buffer, int _size)
Write a block of memory on a file on the D64 disk image.
void d64_set_dos_type(D64Handle *_handle, unsigned char *_dos_type)
Set the DOS Type for the given disk image.
int d64_get_free_sectors(D64Handle *_handle)
struct _D64BAMEntry D64BAMEntry
#define D64_DIRECTORY_TRACK
struct _D64BAM D64SectorBAM
unsigned char D64DosVersion
struct _D64SectorData D64SectorData
enum _D64FileType D64FileType
unsigned short D64WordLength
#define D64_DIRECTORY_SECTOR
enum _D64ErrorCode D64ErrorCode
struct _D64DirectoryEntry D64DirectoryEntry
enum _D64Format D64Format
struct _D64Handle D64Handle
struct _D64Directory D64SectorDirectory
unsigned char saveReplacement
D64ByteLength freeSectors
unsigned char bitmappedFree[3]
struct _D64BAM::@256036255133227046226271146257246372060017123336::@271123314305046123343155131234272165152237056144 prologic
struct _D64BAM::@256036255133227046226271146257246372060017123336::@324076120047031363306223216253037144316004175331 standard
D64BAMEntry entriesSpeedDOS[5]
D64BAMEntry entriesPrologicDOS[5]
unsigned char diskName[16]
D64BAMEntry entriesDolphinDOS[5]
D64Track firstDirectoryTrack
D64Sector firstDirectorySector
D64WordLength sizeSectors
D64Track trackFirstSector
unsigned char filename[16]
D64Sector sectorFirstSector
D64Sector sectorFirstSectorREL
D64Track trackFirstSectorREL
D64DirectoryEntry entries[8]