Amiga Buddha 和 Catweasel IDE 驱动程序

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


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

自动配置的实现方式与 Commodore 在其手册中描述的完全相同,没有使用任何技巧(例如,在方程式中省略某些地址线...)。 如果你想自己配置电路板(例如,让 Linux 内核配置卡),请查看 Commodore 文档。 读取半字节应该会给出这些信息。

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 中消失,并映射到刚刚写入的新地址。 请确保在 $48 之前写入 $4a,否则您找到该板的几率只有 1:16 :-)。

即使映射到 $e8,本地内存映射也处于活动状态

$0-$7e

自动配置空间,请参阅 Z-II 文档。

$80-$7fd

保留

$7fe

速度选择寄存器:读取和写入(描述见下文)

$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 总线。 实现此机制是为了兼容存在缺陷或固件存在错误的硬盘驱动器,这些硬盘驱动器会在启动时将 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 系统。 带有快速内存的 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 进行或运算(这会设置低 5 位)。

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

值 0(复位后的默认值)

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

值 1

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

值 2

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

值 3

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

值 4

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

值 5

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

值 6

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

值 7

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

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

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

所有具有非常短的选择信号(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 上进入数据的 Nirvana。

Jens Schönfeld,1997 年 2 月 19 日

1997 年 5 月 27 日更新

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