我目前正在为Apple IIe编写一个程序,需要从磁盘阅读/写入文件。在阅读我在网上找到的有关Apple II汇编语言的书籍时,我遇到了用于访问磁带端口的$C060子例程,但我似乎找不到访问磁盘驱动器的子例程。是否有这样的监视命令?如果没有,在这个程序中,我应该怎么做来读/写一个文件到/从磁盘?
$C060
wmomyfyw1#
在DOS下读写软盘而不加载是可能的。如果你想读写其他程序可用的磁盘,DOS是很有用的,而且使用DOS使事情可靠地工作往往比使用原始I/O更容易,但是原始I/O比DOS更快,并且允许在磁盘上存储更多的信息,特别是如果你一次读写的磁道永远不会少于一个磁道。使用一次磁道I/O时,写入和阅读磁盘在概念上很简单:1.要写入磁盘磁道,请构建一个缓冲区,其中包含约6 K的适当格式化数据,打开电机,将磁头移动到所需磁道,打开写入信号,写入模式0x 92 $A4约500次[如果缓冲区远小于4,000字节,则可能需要增加该计数,以便写入总计至少~ 5,000字节],然后输出缓冲区的内容并关闭写入信号。字节必须每32个时钟周期精确地发送到驱动器控制器一次。即使滑动一个周期也会导致控制器输出垃圾。1.要读取磁盘磁道,打开电机,将磁头移动到所需磁道,从磁盘读取数据字节,直到看到字节序列$92 $A4 $9F,然后读取其余数据。数据将以大约32周期/字节的速率到达,每个字节必须在7周期窗口内读取。如果缓冲区中的每个字节都满足以下三个限制,则回读的数据应与写入的数据精确匹配:1.每个字节必须设置最高有效位。1.任何字节都不能包含两个以上连续的0位。1.每个字节必须包含至少一对连续的1位。有64个可能的字节值符合这些标准。在存储数据之前对任意数据进行编码以满足限制,并对以这种方式写入的信息进行解码可能是一件麻烦事,但这是编写自己的磁盘例程的“乐趣”的一部分。许多磁盘例程将数据读入缓冲区而不对其进行解码,然后再对其进行解码。但如果选择合适的编码,就有可能在从磁盘接收信息时真实的解码信息。我忘了提到如何移动驱动器上的转弯,选择驱动器1或2,移动磁头,从插槽6中的控制器读取和写入字节:1.要打开驱动器,请访问$C0E9。要关闭驱动器,请访问$C0E8。关闭驱动器的效果将延迟约1秒。1.要切换到驱动器2,访问$C0EB。要切换到驱动器1,访问$C0EA。1.要移动磁头,可以把它想象成一个与钟面上的指针相连的轮子。当磁头位于任何偶数轨道时,指针指向12:00,当磁头位于任何奇数轨道时,指针指向6:00。阅读$C0E1、$C0E3、$C0E5或$C0E7将打开一个线圈,将指针拉向12:00、3:00、6:00或9:00。访问下一个较低的地址将关闭线圈。通过打开与轮子当前位置成90度角的线圈,等待一段时间,关闭该线圈并打开下一个线圈,等等来移动磁头。1.要查看是否连接了驱动器,读取$C0EC几次,查看值是否改变。如果没有,则没有连接驱动器。如果已知存在驱动器,则使用双指令循环读取$C0EC,直到高位被设置。如果使用四周期指令读取,并且一旦高位变为置位则两周期不采取分支(例如wait293: LDX $C0EC / BPL wait293)。为了确保读取每个字节,确保CPU在下一次执行序列之前至少执行12个周期,最多执行24个周期。少于12个周期可能会产生重复读取。超过24可能会导致跳过字节。1.要开始写入数据,将任意值写入$C0ED,然后将第一个字节值写入$C0EF,并立即读取$C0EC(忽略写入的值)。然后必须执行其他代码的24个周期,将下一个字节写入$C0ED,立即读取$C0EC等。完成后,读取$C0EE。
wait293: LDX $C0EC / BPL wait293
1条答案
按热度按时间wmomyfyw1#
在DOS下读写软盘而不加载是可能的。如果你想读写其他程序可用的磁盘,DOS是很有用的,而且使用DOS使事情可靠地工作往往比使用原始I/O更容易,但是原始I/O比DOS更快,并且允许在磁盘上存储更多的信息,特别是如果你一次读写的磁道永远不会少于一个磁道。
使用一次磁道I/O时,写入和阅读磁盘在概念上很简单:
1.要写入磁盘磁道,请构建一个缓冲区,其中包含约6 K的适当格式化数据,打开电机,将磁头移动到所需磁道,打开写入信号,写入模式0x 92 $A4约500次[如果缓冲区远小于4,000字节,则可能需要增加该计数,以便写入总计至少~ 5,000字节],然后输出缓冲区的内容并关闭写入信号。字节必须每32个时钟周期精确地发送到驱动器控制器一次。即使滑动一个周期也会导致控制器输出垃圾。
1.要读取磁盘磁道,打开电机,将磁头移动到所需磁道,从磁盘读取数据字节,直到看到字节序列$92 $A4 $9F,然后读取其余数据。数据将以大约32周期/字节的速率到达,每个字节必须在7周期窗口内读取。
如果缓冲区中的每个字节都满足以下三个限制,则回读的数据应与写入的数据精确匹配:
1.每个字节必须设置最高有效位。
1.任何字节都不能包含两个以上连续的0位。
1.每个字节必须包含至少一对连续的1位。
有64个可能的字节值符合这些标准。在存储数据之前对任意数据进行编码以满足限制,并对以这种方式写入的信息进行解码可能是一件麻烦事,但这是编写自己的磁盘例程的“乐趣”的一部分。许多磁盘例程将数据读入缓冲区而不对其进行解码,然后再对其进行解码。但如果选择合适的编码,就有可能在从磁盘接收信息时真实的解码信息。
我忘了提到如何移动驱动器上的转弯,选择驱动器1或2,移动磁头,从插槽6中的控制器读取和写入字节:
1.要打开驱动器,请访问$C0E9。要关闭驱动器,请访问$C0E8。关闭驱动器的效果将延迟约1秒。
1.要切换到驱动器2,访问$C0EB。要切换到驱动器1,访问$C0EA。
1.要移动磁头,可以把它想象成一个与钟面上的指针相连的轮子。当磁头位于任何偶数轨道时,指针指向12:00,当磁头位于任何奇数轨道时,指针指向6:00。阅读$C0E1、$C0E3、$C0E5或$C0E7将打开一个线圈,将指针拉向12:00、3:00、6:00或9:00。访问下一个较低的地址将关闭线圈。通过打开与轮子当前位置成90度角的线圈,等待一段时间,关闭该线圈并打开下一个线圈,等等来移动磁头。
1.要查看是否连接了驱动器,读取$C0EC几次,查看值是否改变。如果没有,则没有连接驱动器。如果已知存在驱动器,则使用双指令循环读取$C0EC,直到高位被设置。如果使用四周期指令读取,并且一旦高位变为置位则两周期不采取分支(例如
wait293: LDX $C0EC / BPL wait293
)。为了确保读取每个字节,确保CPU在下一次执行序列之前至少执行12个周期,最多执行24个周期。少于12个周期可能会产生重复读取。超过24可能会导致跳过字节。1.要开始写入数据,将任意值写入$C0ED,然后将第一个字节值写入$C0EF,并立即读取$C0EC(忽略写入的值)。然后必须执行其他代码的24个周期,将下一个字节写入$C0ED,立即读取$C0EC等。完成后,读取$C0EE。