'*****************************************************************************
'* 
'* VARIOUS TOOLS, USEFUL IN EMULATION (EmuLib.*)
'*
'* Version history:
'*  2008 - initial code (by WadiM)
'* 
'*****************************************************************************

//DEBUG.ON 'uncomment to enable debug messages (can be slow for hi-freq events)

////////////////////////////// DISK IMAGES ////////////////////////////////////

//Detect floppy disk format (only plain unpacked disk images supported)
public function DetectFloppyDisk(disk as object) as boolean
 disk.Detected=false 'mark disk as not detected
 disk.StartOffset=0 'disk image offset from beginning of file
 disk.Flags=0 'various flags (not used)
 disk.SectorSize=0 'can be forced or calculated
 if not disk.Ready then exit(false)
 disk.Accessed=true

 //FDD disks (CHS = Cylinders, Heads, Sectors = Tracks, Sides, Sectors)
 Select Case disk.Size
   Case 163840 	: disk.SetCHS(40,1,8)  	'FDD 160 Kb
   Case 184320 	: disk.SetCHS(40,1,9)  	'FDD 180 Kb
   Case 204800	: disk.SetCHS(40,1,10) 	'FDD 200 Kb
   Case 327680	: disk.SetCHS(40,2,8)  	'FDD 320 Kb
   Case 368640	: disk.SetCHS(40,2,9) 	'FDD 360 Kb
   Case 409600	: disk.SetCHS(40,2,10)	'FDD 400 Kb
   Case 655360	: disk.SetCHS(80,2,8)	'FDD 640 Kb
   Case 737280	: disk.SetCHS(80,2,9)	'FDD 720 Kb
   Case 819200	: disk.SetCHS(80,2,10)	'FDD 800 Kb
   Case 1228800	: disk.SetCHS(80,2,15)	'FDD 1,2 Mb
   Case 1474560 : disk.SetCHS(80,2,18)  'FDD 1,44 Mb
   Case 2949120	: disk.SetCHS(80,2,36)	'FDD 2,88 Mb
   Case 4194304	: disk.SetCHS(227,2,18) 'FDD 4 Mb (SPC large floppy)
                  disk.SectorSize=512 'forced to be compatible
   Case Else      'not detected
     ?? "Floppy Disk";disk.Index;" not detected"
     exit(false) 
 End Select

 //calculate size of sector
 if disk.SectorSize=0 then
    disk.SectorSize=disk.Size/(disk.HeadCount*disk.CylinderCount*disk.SectorCount)
 end if

 ?? "Floppy Disk";disk.Index;" detected (";disk.Size;",";disk.HeadCount;",";
 ?? disk.CylinderCount;",";disk.SectorCount;",";disk.SectorSize;")"
 disk.Detected=true : result=true 'successfully detected

end

//Detect hard disk format (only plain unpacked disk images supported)
public function DetectHardDisk(disk as object) as boolean
 disk.Detected=false 'mark disk as not detected
 disk.StartOffset=0 'disk image offset from beginning of file
 disk.Flags=0 'various flags (not used)
 disk.SectorSize=0 'can be forced or calculated
 if not disk.Ready then exit(false)
 disk.Accessed=true

 //HDD disks (CHS = Cylinders, Heads, Sectors = Tracks, Sides, Sectors)
 Select Case disk.Size 
   Case 10653696  : disk.SetCHS(306,4,17)   'HDD ~10 Mb
   Case 21307392  : disk.SetCHS(306,8,17)   'HDD ~20 Mb
   Case 21411840  : disk.SetCHS(615,4,17)   'HDD ~20 Mb
   Case 31900160  : disk.SetCHS(733,5,17)   'HDD ~30 Mb
   Case 32117760  : disk.SetCHS(615,6,17)   'HDD ~31 Mb
   Case 32169984  : disk.SetCHS(462,8,17)   'HDD ~31 Mb
   Case 37209600  : disk.SetCHS(855,5,17)   'HDD ~35 Mb
   Case 49090560  : disk.SetCHS(940,6,17)   'HDD ~47 Mb
   Case 52093440  : disk.SetCHS(855,7,17)   'HDD ~50 Mb
   Case 65454080  : disk.SetCHS(940,8,17)   'HDD ~62 Mb
   Case 117504000 : disk.SetCHS(900,15,17)  'HDD ~112 Mb

   Case 64339968  : disk.SetCHS(924,8,17)   'HDD ~64 Mb
   Case 101941248 : disk.SetCHS(732,16,17)  'HDD ~100 Mb
   Case 268369920 : disk.SetCHS(520,16,63)  'HDD ~256 Mb
   Case 314302464 : disk.SetCHS(609,16,63)  'HDD ~300 Mb
   Case 528482304 : disk.SetCHS(1024,16,63) 'HDD ~504 Mb
   Case Else      'not detected
     ?? "Hard Disk";disk.Index;" not detected"
     exit(false) 
 End Select

 //calculate size of sector
 if disk.SectorSize=0 then
    disk.SectorSize=disk.Size/(disk.HeadCount*disk.CylinderCount*disk.SectorCount)
 end if

 ?? "Hard Disk";disk.Index;" detected (";disk.Size;",";disk.HeadCount;",";
 ?? disk.CylinderCount;",";disk.SectorCount;",";disk.SectorSize;")"
 disk.Detected=true : result=true 'successfully detected

end


