homelan / acorn-disk
提供用于读取8位Acorn机器(dfs/adfs)磁盘镜像的类
Requires
- php: >=7.1
This package is auto-updated.
Last update: 2024-09-05 11:19:53 UTC
README
此软件包允许读取DFS和ADFS磁盘镜像。
功能
- PSR-4自动加载兼容结构
- 使用PHPUnit进行单元测试
- 磁盘镜像可以从文件读取,也可以作为字符串传入
安装
composer requre homelan/acorn-disk
概述
DfsReader类允许从以.ssd格式存储的DFS磁盘镜像中读取文件和元数据。在DFS中,目录不是像现代文件系统那样的分层结构,而是只能存在于顶级,目录名长度只能为1个字符。DFS的另一个特点是默认目录是'$',尽管在8位Acorn系列的后续文件系统中'$'是文件系统的根,但在DFS目录中'$'更像是一个文件名前缀,默认情况下为'$'。
DfsReader类可以以两种方式工作,它可以直接读取磁盘镜像的比特,按需打开文件句柄,或者整个磁盘可以作为一个字符串读取并传递给DfsReader。前者对于大量文件访问更有效,而后者更节省内存。
AdfsReader类允许从以.adl格式存储的ADFS软盘镜像中读取文件和元数据。ADFS文件系统类似于现代文件系统,具有分层目录结构,'$'是文件系统的根。ADFS中每个目录的文件数量有限制。
AdfsReaderHD类与AdfsReader类功能相同,只是读取存储在Beebem使用的scsi.dat格式中的硬盘镜像。
DfsReader使用方法
创建一个DfsReader对象以直接打开磁盘上的文件
$oDfs = new \HomeLan\Retro\Acorn\Disk\DfsReader('disk_image.ssd');
创建一个DfsReader对象以从二进制字符串中读取磁盘镜像
$sDiskImage = file_get_contents('disk_image.ssd');
$oDfs = new \HomeLan\Retro\Acorn\Disk\DfsReader(null,$sDiskImage);
一旦创建了DfsReader对象,可以使用一些简单的方法从其中读取数据。
$oDfs->getTitle()
读取磁盘标题
$aCatalogue = $oDfs->getCatalogue();
获取磁盘上的内容目录 *CAT
例如:
$aCatalogue = $oDfs->getCatalogue(); foreach($aCatalogue as $sDirectoy=>$aDir) { echo $sDirectoy."\n==============\n"; foreach($aDir as $sFileName=>$aEntryMetadata){ echo $sFileName." [".$aEntryMetadata['loadaddr'].' '.$aEntryMetadata['execaddr'].' '.$aEntryMetadata['size'].' '.$aEntryMetadata['startsector']."\n";
}
}
.!BOOT');
读取指定文件的全部内容
例如:
$sFileContents = .!BOOT');
.!BOOT');
获取文件统计信息
.!BOOT');
检查指定路径是否为文件
例如:
$bFile = .!BOOT'); if($bFile){ echo "!BOOT is file.\n" }
$oDfs->isDir('A');
检查指定路径是否为文件
$bDir = $oDfs->isDir('D'); if($bDir){ echo "D is a dir.\n" }
AdfsReader使用方法
创建一个AdfsReader对象以直接打开磁盘上的文件
$oDfs = new \HomeLan\Retro\Acorn\Disk\AdfsReader('disk_image.adl');
创建一个AdfsReader对象以从二进制字符串中读取磁盘镜像
$sDiskImage = file_get_contents('disk_image.adl');
$oDfs = new \HomeLan\Retro\Acorn\Disk\AdfsReader(null,$sDiskImage);
一旦创建了AdfsReader对象,可以使用一些简单的方法从其中读取数据。
$oAdfs->getTitle()
读取磁盘标题
$aCatalogue = $oAdfs->getCatalogue();
获取磁盘上的内容目录 *CAT
例如:
$aCatalogue = $oAdfs->getCatalogue(); foreach($aCatalogue as $sDirectoy=> $aDir) { echo $sDirectoy."\n==============\n"; foreach($aDir as $sFileName=> $aEntryMetadata){ echo $sFileName." [".$aEntryMetadata['loadaddr'].' '.$aEntryMetadata['execaddr'].' '.$aEntryMetadata['size'].' '.$aEntryMetadata['startsector'].' '$aEntryMetadata['type']."\n";
}
}
.!BOOT');
读取指定文件的全部内容
例如:
$sFileContents = .!BOOT');
.!BOOT');
获取文件统计信息
.!BOOT');
检查指定路径是否为文件
例如:
$bFile = .!BOOT'); if($bFile){ echo "!BOOT is file.\n" }
$oDfs->isDir('A');
检查指定路径是否为文件
$bDir = $oAdfs->isDir('D'); if($bDir){ echo "D 是一个目录。\n" }
AdfsReaderHD 使用说明
这与 AdfsReader 类完全相同,只是构造函数不同,因为它不支持从二进制字符串中读取磁盘镜像。
这是因为涉及到的磁盘镜像大小显著更大,这是一个相对负面的特性。
$oDfs = new \HomeLan\Retro\Acorn\Disk\AdfsReaderHD('scsi0.dat');