aboutsummaryrefslogtreecommitdiff
path: root/jindroush/lib/cfs_boot.cpp
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2024-05-16 01:43:09 -0400
committerB. Watson <urchlay@slackware.uk>2024-05-16 01:43:09 -0400
commita4cc3ad3504d634e379369862c9f9fd8eed379f3 (patch)
tree7b6f55c352a4ca62dddaa1b4a6854799111d2d2f /jindroush/lib/cfs_boot.cpp
parentb33c25d1363110e6e4a714530f460b0ff951f56b (diff)
downloadbw-atari8-tools-a4cc3ad3504d634e379369862c9f9fd8eed379f3.tar.gz
Add Jindrich Kubec's tools.
Diffstat (limited to 'jindroush/lib/cfs_boot.cpp')
-rw-r--r--jindroush/lib/cfs_boot.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/jindroush/lib/cfs_boot.cpp b/jindroush/lib/cfs_boot.cpp
new file mode 100644
index 0000000..b1279ac
--- /dev/null
+++ b/jindroush/lib/cfs_boot.cpp
@@ -0,0 +1,128 @@
+// 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 "cfs_boot.h"
+#include "autil.h"
+#include "adsk_xfd.h"
+
+CBoot::CBoot() : CFs()
+{
+ #ifdef _MEMORY_DUMP_
+ printf( "CBoot constructed: %08X\n", this );
+ #endif
+}
+
+CBoot::~CBoot()
+{
+ Dismount();
+ #ifdef _MEMORY_DUMP_
+ printf( "CBoot destructed: %08X\n", this );
+ #endif
+}
+
+BOOL CBoot::Mount( ADisk* pDisk )
+{
+ m_iFilesValid = 0;
+ m_iFilesInvalid = 0;
+ m_pDisk = pDisk;
+ m_pRoot = NULL;
+
+ m_pRoot = CreateEntry();
+
+ return m_pRoot ? TRUE : FALSE;
+}
+
+void CBoot::Dismount()
+{
+ DeleteList( m_pRoot );
+}
+
+CBootDirEntry* CBoot::CreateEntry()
+{
+ CBootDirEntry* pE = new CBootDirEntry();
+
+ if ( !pE )
+ return NULL;
+
+ pE->m_iSectorCount = m_pDisk->GetBootSectorCount();
+
+ if ( pE->m_iSectorCount > m_pDisk->GetSectorCount() )
+ {
+ sprintf( m_szLastError, "BOOT: Overlaps end of file!" );
+ delete pE;
+ return NULL;
+ }
+
+ sprintf( pE->m_szAscData, "%08X", pE->m_iSectorCount );
+
+ GuessBestFnameFromPC( pE->m_szFname, m_pDisk->GetImageName(), "xfd", "_boot" );
+
+ return pE;
+}
+
+BOOL CBoot::ExportFile( char* szOutFile, CDirEntry* pDirE )
+{
+ if ( !szOutFile )
+ return TRUE;
+
+ CXfd newdisk;
+
+ DISK_GEOMETRY dg;
+
+ int iSecCount = ((CBootDirEntry*)pDirE)->m_iSectorCount;
+
+ dg.iSides = 1;
+ dg.iTracks = 1;
+ dg.iSectorsPerTrack = iSecCount;
+ dg.iBytesPerSector = 0x80;
+
+ if ( !newdisk.Format( &dg ) )
+ {
+ sprintf( m_szLastError, "BOOT: File '%s' can't create because\n%s", szOutFile, newdisk.GetLastError() );
+ return FALSE;
+ }
+
+ int iStartSec = 1;
+ int iCurrSec = 1;
+
+ BYTE abtBuff[ MAX_ATARI_SECTOR_LEN ];
+
+ while( iSecCount )
+ {
+ if( !m_pDisk->ReadSector( abtBuff, iStartSec++ ) )
+ {
+ sprintf( m_szLastError, "BOOT: File '%s' can't create because\n%s", szOutFile, m_pDisk->GetLastError() );
+ return FALSE;
+ }
+
+ if ( !newdisk.WriteSector( iCurrSec++, abtBuff ) )
+ {
+ sprintf( m_szLastError, "BOOT: File '%s' can't create because\n%s", szOutFile, newdisk.GetLastError() );
+ return FALSE;
+ }
+
+ iSecCount--;
+ }
+
+ if ( !newdisk.Save( szOutFile, FALSE ) )
+ {
+ sprintf( m_szLastError, "BOOT: File '%s' can't create because\n%s", szOutFile, newdisk.GetLastError() );
+ return FALSE;
+ }
+
+
+ return TRUE;
+}
+