Amiga Buddha and Catweasel IDE 驱动程序

Amiga Buddha 和 Catweasel IDE 驱动程序(ide.c 的一部分)由 Geert Uytterhoeven 根据以下规范编写


Buddha IDE 控制器以及 Catweasel Zorro-II 版本的 Buddha 部分的寄存器映射

自动配置(Autoconfiguration)的实现完全遵照了 Commodore 在其手册中的描述,未使用任何技巧(例如将某些地址线排除在等式之外……)。如果您想自己配置该板卡(例如让 Linux 内核配置该卡),请参阅 Commodore 文档。读取半字节(nibbles)应该能提供此信息

Vendor number: 4626 ($1212)
product number: 0 (42 for Catweasel Z-II)
Serial number: 0
Rom-vector: $1000

该卡应为 Z-II 板卡,大小为 64K,不用于 freemem 列表,Rom-Vektor 有效,同一卡上无第二个自动配置板,无空间偏好,支持“Shutup_forever”。

设置基地址应分两步完成,就像 Amiga Kickstart 所做的那样:将 8 位地址的低半字节写入 $4a,然后将整个字节写入 $48,在此期间,只要不触碰 $48,你写入 $4a 的频率并不重要。写入 $48 后,整张卡将从 $e8 消失,并映射到刚刚写入的新地址。请确保先写入 $4a 再写入 $48,否则你找到该板卡的几率只有 1:16 :-)。

本地内存映射在映射到 $e8 时也是激活的

$0-$7e

Autokonfig 空间,参见 Z-II 文档。

$80-$7fd

保留字段

$7fe

速度选择寄存器:读写(Read & Write,说明见下文)

$800-$8ff

IDE 选择 0(端口 0,寄存器集 0)

$900-$9ff

IDE 选择 1(端口 0,寄存器集 1)

$a00-$aff

IDE 选择 2(端口 1,寄存器集 0)

$b00-$bff

IDE 选择 3(端口 1,寄存器集 1)

$c00-$cff

IDE 选择 4(端口 2,寄存器集 0,仅限 Catweasel!)

$d00-$dff

IDE 选择 5(端口 3,寄存器集 1,仅限 Catweasel!)

$e00-$eff

本地扩展端口,在 Catweasel Z-II 上,Catweasel 寄存器也映射到此处。切勿触碰,请使用 multidisk.device!

$f00

只读,字节访问:位 7 显示 IDE 端口 0 的 IRQ 线电平。

$f01-$f3f

$f00 的镜像

$f40

只读,字节访问:位 7 显示 IDE 端口 1 的 IRQ 线电平。

$f41-$f7f

$f40 的镜像

$f80

只读,字节访问:位 7 显示 IDE 端口 2 的 IRQ 线电平。(仅限 Catweasel!)

$f81-$fbf

$f80 的镜像

$fc0

只写:向该寄存器写入任何值都可以启用将中断请求(IRQ)从 IDE 端口传递到 Zorro 总线的功能。实现该机制是为了兼容那些有缺陷或固件有 bug 且在启动时将 IRQ 拉高的硬盘。如果中断总是被传递到总线,计算机可能无法启动。一旦启用,该标志就无法再次禁用。该标志的电平无法通过软件确定(有什么用?如果有必要,请写信告诉我!)。

$fc1-$fff

$fc0 的镜像

$1000-$ffff

带有 rom 芯片中 $1000 偏移量的 Buddha-Rom。rom 芯片的地址 $0 到 $fff 无法读取。Rom 是字节宽度的并映射到偶数地址。

IDE 端口发出 INT2. 你可以通过读取三个(仅 Buddha 为两个)寄存器 $f00、$f40 和 $f80 来读取 IDE 端口的 IRQ 线电平。通过这种方式,可以处理多个 I/O 请求,并且你可以轻松确定哪个驱动程序必须响应 INT2。Buddha 和 Catweasel 扩展板可以发出 INT6。I/O 模块和 sysop 的 I/O 模块有一个单独的内存映射可用。

IDE 端口由地址线 A2 到 A4 驱动,就像 Amiga 1200 和 Amiga 4000 IDE 端口一样。通过这种方式,现有的驱动程序可以轻松移植到 Buddha。一条 `move.l` 指令从 IDE 端口的同一地址轮询两个字,因为每个字都被镜像了一次。`movem` 是不可能的,但它也不是必需的,因为你只能用这种技术加速 68000 系统。带有 fastmem 的 68020 系统使用 `move.l` 会更快。

如果您使用的是 A6=1 的 IDE 端口镜像寄存器,Buddha 将不关心您在速度寄存器中选择的速度(见下文)。当 A6=1 时(例如端口 0、寄存器集 0 的 $840),将进行 780ns 的访问。这些寄存器应用於对硬盘/CD-Rom 的命令访问,因为命令访问是字节宽度的,并且根据 ATA-X3T9 手册,必须将其变慢。

接下来是速度寄存器:该寄存器是字节宽度的,并且只使用高三位(位 7 到位 5)。位 4 必须始终设置为 1,以便与后续的 Buddha 版本兼容(如果我还会更新这个版本的话)。我推测我永远不会使用低四位,但按照定义它们必须设置为 1。

此表中的值必须向左移动 5 位,并与 `$1f` 进行按位或(OR)操作(这会设置低 5 位)。

所有时序的共同点是:Select 和 IOR/IOW 同时上升。IOR 和 IOW 对 Zorro 总线上的时钟具有大约 30ns 的传播延迟,这就是为什么这些值不是 71 的倍数。一个时钟周期为 71ns 长(在 PAL 系统的 14.18 Mhz 下精确为 70.5)。

值 0(复位后的默认值)

497ns Select(7 个时钟周期),172ns 后 IOR/IOW(2 个时钟周期)(与 Amiga 1200 在没有加速卡的 IDE 端口上的时序相同)

值 1

639ns Select(9 个时钟周期),243ns 后 IOR/IOW(3 个时钟周期)

值 2

781ns Select(11 个时钟周期),314ns 后 IOR/IOW(4 个时钟周期)

值 3

355ns Select(5 个时钟周期),101ns 后 IOR/IOW(1 个时钟周期)

值 4

355ns Select(5 个时钟周期),172ns 后 IOR/IOW(2 个时钟周期)

值 5

355ns Select(5 个时钟周期),243ns 后 IOR/IOW(3 个时钟周期)

值 6

1065ns Select(15 个时钟周期),314ns 后 IOR/IOW(4 个时钟周期)

值 7

355ns Select(5 个时钟周期),101ns 后 IOR/IOW(1 个时钟周期)

当访问 A6=1 的 IDE 寄存器(例如 $84x)时,时序将始终与模式 0 8 位兼容,无论你在速度寄存器中选择了什么

781ns select,在 4 个时钟周期(=314ns)后激活 IOR/IOW。

所有具有非常短的 select 信号的时序(355ns 快速访问)都取决于系统中使用的加速卡:有时总线接口会插入两个以上的时钟周期,使整个访问长达 497ns。这不会影响控制器的可靠性,也不会影响板卡的性能,因为这种情况并不经常发生。

所有时序都是计算得出的,仅通过允许我计算时钟周期的测量结果进行确认。如果系统由非 28.37516 Mhz 的振荡器(例如 NTSC 频率 28.63636 Mhz)提供时钟,则每个时钟周期会缩短至略小于 70ns(不值一提)。你可能会认为通过超频系统可以获得微小的性能提升,但你要么需要一台多频同步显示器,要么需要一块显卡,而且你内部的磁盘驱动器会发疯,这就是为什么你不应该以这种方式调整你的 Amiga。

为了让你能够编写兼容 Buddha 和 Catweasel Z-II 的软件,Buddha 的行为就像是一个没有设备连接到第三个 IDE 端口的 Catweasel Z-II。IRQ 寄存器 `$f80` 在 Buddha 上总是显示“此处无 IRQ”,并且对第三个 IDE 端口的访问在 Buddha 上会进入数据涅槃(Nirwana)。

Jens Schönfeld 1997 年 2 月 19 日

更新于 1997 年 5 月 27 日

电子邮箱:sysop@nostlgic.tng.oche.de