From a4cc3ad3504d634e379369862c9f9fd8eed379f3 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Thu, 16 May 2024 01:43:09 -0400 Subject: Add Jindrich Kubec's tools. --- jindroush/acvt/acvt.cpp | 216 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 jindroush/acvt/acvt.cpp (limited to 'jindroush/acvt/acvt.cpp') diff --git a/jindroush/acvt/acvt.cpp b/jindroush/acvt/acvt.cpp new file mode 100644 index 0000000..857da5b --- /dev/null +++ b/jindroush/acvt/acvt.cpp @@ -0,0 +1,216 @@ +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#include "pub.def" +#include "jintypes.h" +#include "autil.h" +#include "adsk.h" + +BOOL Convert( char* szInFile, char* szOutFile ); + +DISK_TYPE g_dtypeIn = DISK_AUTO; +DISK_TYPE g_dtypeOut = DISK_ATR; + +BOOL g_bVerbose = FALSE; +BOOL g_bBatchMode = FALSE; +BOOL g_bRepairAuto = FALSE; +BOOL g_bRepair = TRUE; +BOOL g_bFirstErrStop = FALSE; +BOOL g_bOverWrite = FALSE; +BOOL g_bTestOnly = FALSE; +BOOL g_bForceClassic = FALSE; + +#define SHEADER PRG_NAME " v" PRG_VERSION " (c) " PRG_COPYRIGHT " " PRG_AUTHOR "\n" + +#define HEADER SHEADER \ + PRG_DESC "\n" \ + " Latest version can be found at " PRG_URL "\n" \ + " Published under GPL. See GPL.TXT.\n\n" + +#define USAGE HEADER "Usage: " PRG_NAME " " PRG_USAGE + +#include "switches.cpp" + +int main(int argc,char *argv[]) +{ + setbuf( stdout, NULL ); + setbuf( stderr, NULL ); + + if ( !SWITCHES_Init( &argc, argv ) ) + return 1; + + if ( argc < 2 ) + { + SWFN_HELP( USAGE ); + return 1; + } + + fprintf( stderr, SHEADER ); + + BOOL bRet = FALSE; + + char szOutFile[ 255 ]; + + if ( g_bBatchMode ) + { + argc--; + argv++; + + while( argc-- ) + { + char* szInFile = *(argv++); + GuessBestFnameFromPC( szOutFile, szInFile, GetDiskTypeExt( g_dtypeOut ) ); + bRet = Convert( szInFile, szOutFile ); + printf( "\n" ); + + if ( !bRet && g_bFirstErrStop ) + break; + } + + } + else + { + char* szInFile = argv[ 1 ]; + + if ( argc >= 3 ) + { + strcpy( szOutFile, argv[ 2 ] ); + } + else + { + GuessBestFnameFromPC( szOutFile, szInFile, GetDiskTypeExt( g_dtypeOut ) ); + } + + bRet = Convert( szInFile, szOutFile ); + } + + if ( bRet && !g_bTestOnly ) + printf ( "Done.\n" ); + + return bRet ? 0 : 1; +} + +BOOL Convert( char* szInFile, char* szOutFile ) +{ + ADisk* pDiskIn = NULL; + ADisk* pDiskOut = NULL; + + DISKINIT_RETCODE ret; + + g_dtypeIn = DISK_ATR; + if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_ATR, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) ) + { + g_dtypeIn = DISK_DI; + if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_DI, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) ) + { + g_dtypeIn = DISK_DCM; + if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_DCM, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) ) + { + g_dtypeIn = DISK_SCP; + if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_SCP, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) ) + { + g_dtypeIn = DISK_XFD; + if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_XFD, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) ) + { + printf( "Unable to determine format of disk image '%s'!\n", szInFile ); + return FALSE; + } + } + } + } + } + + if ( ret == DI_RET_CANT_CONTINUE ) + return FALSE; + + printf( "Input file '%s' (%s)\n", szInFile, GetDiskTypeName( g_dtypeIn ) ); + + if ( g_bVerbose ) + { + DISK_GEOMETRY* pgeo = pDiskIn->GetGeometry(); + printf( "Sides: %d\n", pgeo->iSides ); + printf( "Tracks: %d\n", pgeo->iTracks ); + printf( "SecPerTrack: %d\n", pgeo->iSectorsPerTrack ); + printf( "BytesPerSec: %d\n", pgeo->iBytesPerSector ); + printf( "Sectors: %d\n", pgeo->iSectors ); + } + + if ( g_bTestOnly ) + { + printf( "File loaded OK.\n" ); + delete pDiskIn; + return TRUE; + } + + switch( g_dtypeOut ) + { + case DISK_ATR: + pDiskOut = new CAtr(); + break; + + case DISK_XFD: + pDiskOut = new CXfd(); + break; + + case DISK_DI: + pDiskOut = new CDi(); + break; + + case DISK_SCP: + pDiskOut = new CScp(); + break; + + case DISK_DCM: + pDiskOut = new CDcm(); + break; + + default: + break; + } + + if ( !pDiskOut ) + { + fprintf( stderr, "Can't create such image!\n" ); + return FALSE; + } + + DISK_GEOMETRY* pgeo = pDiskIn->GetGeometry(); + DISK_GEOMETRY forced; + + memcpy( &forced, pgeo, sizeof( DISK_GEOMETRY ) ); + + if ( g_bForceClassic ) + ForceClassicSize( &forced ); + + //duplicating the image + pDiskOut->Duplicate( pDiskIn, &forced ); + + printf( "Output file '%s' (%s)\n", szOutFile, GetDiskTypeName( g_dtypeOut ) ); + + //and save it in new format + if ( !pDiskOut->Save( szOutFile, g_bOverWrite ) ) + { + printf( "Error! %s\n", pDiskOut->GetLastError() ); + delete pDiskIn; + delete pDiskOut; + return FALSE; + } + + delete pDiskIn; + delete pDiskOut; + + return TRUE; +} + -- cgit v1.2.3