Package: mgtdisklib
mgtdisklibA Python library to give file-level access to the contents of SAM Coupé and MGT +D disk images.NOTE: the library is currently a work in progress and the API is still subject to change.Homepage:https://github.com/simonowen/mgtdisklibModule:https://pypi.org/project/mgtdisklib/Using the libraryInstalling the modulepip -m install mgtdisklibImporting the modulefrommgtdisklibimportDisk,Image,FileOpening a disk image:disk=Disk.open('image.mgt')MGT/SAD/EDSK container files are supported, but only those containing a regular 80/2/10/512 or 80/2/9/512 format. The image file may be optionally compressed with gzip.Saving the Disk contents to a new MGT image filedisk.save('image2.mgt')DiskRepresents a logical SAM disk plus all its contents.Class Functionsdefopen(path:str)->Disk:"""Load disk from disk image file"""deffrom_image(image:Image)->Disk:"""Construct a Disk object from a disk image"""Instance Functionsdefsave(self,path:str,*,compressed:bool=False,spt:int=10)->None:"""Save disk content to disk image"""defto_image(self,*,spt:int=10)->Image:"""Generate MGT disk image from current contents"""defadd_code_file(self,path:str,*,filename:str=None,at_index:int=None)->None:"""Add CODE file from path"""defdelete(self,pattern:str)->int:"""Delete files matching filename pattern"""defbam(self)->bitarray:"""Combined Bitmap Address Map for all files"""defdir(self,*,spt:int=10)->str:"""Return directory listing"""Instance Variablestype- detected type:DiskType.SAMDOS(default),DiskType.MASTERDOSorDiskType.BDOS.files- list ofFileobjects in directory order.dir_tracks- number of directory tracks (usually 4).label- disk volume label string, or None.serial- MasterDOS unique disk number, or None.compressed-Trueif the source disk was gzipped.FileTypesFileTypeis one of the following values:FileType.NONE# unused or deleted entryFileType.ZX_BASIC# ZX Spectrum BASICFileType.ZX_DATA# ZX Spectrum numeric arrayFileType.ZX_DATA_STR# ZX Spectum string arrayFileType.ZX_CODE# ZX Spectrum codeFileType.ZX_SNP_48K# ZX Spectrum 48K snapshotFileType.ZX_MDRV# ZX Spectrum microdrive fileFileType.ZX_SCREEN# ZX Spectrum SCREEN$FileType.SPECIAL# Custom file entryFileType.ZX_SNP_128K# ZX Spectrum 128K snapshotFileType.OPENTYPE# ZX/SAM file streamFileType.ZX_EXECUTE# ZX interface executableFileType.UNIDOS_DIRFileType.UNIDOS_CREATEFileType.BASIC# SAM Coupé BASICFileType.DATA# SAM Coupé numeric arrayFileType.DATA_STR# SAM Coupé string arrayFileType.CODE# SAM Coupé codeFileType.SCREEN# SAM Coupé SCREEN (mode 1-4)FileType.DIR# SAM Coupé MasterDOS directoryFileType.DRIVER_APP# Driver applicationFileType.DRIVER_BOOT# Driver boot fileFileType.EDOS_NOMEN# Entropy IDE DOS (abandoned)FileType.EDOS_SYSTEMFileType.EDOS_OVERLAYFileType.HDOS_DOS# SD IDE DOSFileType.HDOS_DIRFileType.HDOS_DISKFileType.HDOS_TEMPTimeFormatis one of the following values:TimeFormat.MASTERDOS# Format used by MasterDOS.TimeFormat.BDOS# Format used by most BDOS and AL-BDOS versions.TimeFormat.BDOS17# Packed format for used by BDOS 1.7 or later.Class Functionsdeffrom_code_path(path:str,*,filename:str=None,start:int=0x8000,execute:int=None)->File:"""Create CODE file from path"""deffrom_code_bytes(data:bytes,filename:str,*,start:int=0x8000,execute:int=None)->File:"""Create CODE file from bytes"""deffrom_dir(data:bytes)->File:"""Create from 256-byte directory entry data"""deffrom_path(path:str)->File:"""Import file entry exported using save()"""Instance Functionsdefsave(self,path:str)->None:"""Export directory entry and file content for later"""defto_dir(self,start_track:int=4,start_sector:int=1,*,spt:int=10,timefmt:TimeFormat=TimeFormat.BDOS)->bytes:"""Create directory entry from current file data"""defis_bootable(self)->bool:"""Check whether the file would be bootable in the first directory slot"""Instance Variablestype- FileType (see above) [read-only]hidden- True if file is hidden from SAM directory listingprotected- True is file is protected from deletionname- file name in ASCII without trailing spacesname_raw- original 10-byte name, which could contain special characterssectors- count of data sectors used (from sector bitmap) [read-only]start_track- first track of file data [read-only]start_sector- first sector of file data [read-only]sector_map- bitarray of sectors used by this file (starting track 4 sector 1) [read-only]start- file start addresslength- file lengthexecute- auto-execute line/address, or Nonetime- file time or Nonedata_var- variable name for numeric/string DATA types [read-only]entry- original 256-byte directory entrydata- raw file data, including 9-byte header and final sector paddingSome properties are read-only, reflecting the state as read from disk. Some of
them (includingstart_track,start_sectorandsector_map) will be updated
as needed when a disk image is created containing them.ImageRepresents a disk image container in MGT/SAD/EDSK format.Class Functionsdefopen(path):"""Create Image object from disk image file"""Creating anImage()object will give a standard 80/2/10/512 MGT disk image.Instance Functionsdefsave(self,path:str,*,compressed:bool=False)->None:"""Save disk data to image file"""defread_sector(self,track:int,sector:int)->bytes:"""Read sector data for given sector location"""defwrite_sector(self,track:int,sector:int,data:bytes)->None:"""Write sector data to given sector location"""defsector_offset(self,track:int,sector:int)->int:"""Calculate sector data offset in image data"""MGT tracks are numbered are 0-79 for the first side and 128-207 for the second.
Sectors are numbered 1-10 for normal format disks, each being 512 bytes.The first 4 tracks of the first side contain the disk directory, and the
remainder of the disk holds data. The second side of the disk is only used once
the first side is full. Track 4 sector 1 holds the boot sector.Instance Variablespath- full path of the disk image.spt- sectors per track, usually 10.compressed-Trueif the source image was gzipped.data- raw disk data from image file.