【微机原理与接口技术】学习笔记9 DMA控制器8237A

文章目录

  • 9.1 8237A 的组成与工作原理
    • 9.1.1 DMA传送
    • 9.1.2 8237A的内部结构
    • 9.1.3 8237A的引脚功能
    • 9.1.4 8237A的内部寄存器
  • 9.2 8237A的时序
  • 9.3 8237A的编程和应用举例
    • 9.3.1 DMA系统组成
    • 9.3.2 DMA系统有效地址的生成
      • 1. 74LS670工作原理
      • 2. DMA系统有效地址的生成
      • 3. IBM-PC微机的DMA系统
      • 4. DMA系统的初始化
      • 5. DMA传送的应用


9.1 8237A 的组成与工作原理

9.1.1 DMA传送

DMA 方式传送数据时,传送过程完全由 DMA 控制器(DMAC)控制。其基本功能:

  • DMAC 能向CPU的 HOLD 脚发出 DMA 请求信号。
  • CPU响应 DMA 请求后,DMAC 获得总线控制权,由它控制数据的传送,CPU则暂停工作。
  • 能提供读/写存储器或I/O设备的各种控制命令。
  • 确定数据传输的始址和数据长度(CPU配置的),每传送1个数据便自动修改地址(+1-1),数据长度 -1
  • 传送完毕,能发出结束 DMA 传送的信号。
  • CPU在每个非锁定时钟周期结束后,都会检测 HOLD 脚上有无 DMA 请求?若有,便转入 DMA 传送周期。

8237A 是高性能可编程 DMA 控制器,主要特点:

  • 4 个通道,每通道64K 地址(16位)和字节计数能力(16位)。
  • 4 种传送方式:单字节传送、数据块传送、请求传送、级联传送。
  • 每个通道的 DMA 请求可被允许或禁止。4 个通道的 DMA 请求有不同优先级,优先级可以是固定的,也可以是循环的。
  • 任一通道完成数据传送后,会自动产生过程结束信号 EOPEnd of Process,不常用),结束 DMA 传送;还可从外界输入 EOP 信号,中止正执行的DMA 传送。

8237A 的两种工作状态
1)从态方式
开始 DMA 传送前,8237A系统总线的从属设备,由CPU对它进行编程,如指定通道、传送方式和类型、内存单元起始地址、地址是递增还是递减以及要传送的总字节数等等;CPU也可读取 DMAC 的状态。
2)主态方式
8237A 取得总线控制权后,它就完全控制了系统,使I/O设备和存储器之间或者存储器与存储器之间进行直接的数据传送。

8237A 芯片的内部结构和外部连接与这两种工作状态密切相关。

9.1.2 8237A的内部结构

【微机原理与接口技术】学习笔记9 DMA控制器8237A_第1张图片
  1. 时序与控制逻辑
    从态时接收系统时钟、复位、片选和读/写等信号,完成相应控制操作;主态时, 向系统发控制信号
    其中与设备相连的是 IOR ‾ , IOW ‾ \overline {\text{IOR}},\overline {\text{IOW}} IOR,IOW ,其他的要么和CPU相连,要么和系统总线相连。
    MEMR ‾ , MEMW ‾ \overline {\text {MEMR}},\overline {\text{MEMW}} MEMR,MEMW 是主态时进行内存读写的命令。

  2. 优先级编码电路
    对同时提出 DMA 请求 HRQ(Hold Request) 的多个通道进行排队判优,决定哪个通道优先级最高,然后进行响应 HLDA(Hold Acknowledge)
    可选固定或循环优先级。某个优先级高的设备服务时,禁止其它通道请求。

  3. 数据和地址缓冲器组
    8237A的 A7~A4(单向输出)、A3~A0(双向:从态时 A3-A0 输入有4根线,说明占了 16 个端口地址;主态时:A3-A0A7-A4DB7-DB0 共16根地址线往内存输出,读或写数据) 为地址线;
    DB7~DB0从态时传输(CPU配置或读取DMA的)数据主态时传送地址。它们都与三态缓冲器相连,便于接管或释放。

  4. 命令控制逻辑
    从态时接收CPU送来的寄存器选择信号A3~A0),选择寄存器;主态时译码方式字D1D0 ,以确定操作类型。A3~A0 IOR \text{IOR} IOR IOW \text{IOW} IOW 配合组成各种操作命令。

  5. 内部寄存器组
    每通道有 16 位基址寄存器、基字计数器、当前地址寄存器、当前字计数器以及 6 位工作方式寄存器。
    片内还有命令寄存器、屏蔽寄存器、请求寄存器、状态寄存器和暂存寄存器。
    不可编程的字数暂存器和地址暂存器。

9.1.3 8237A的引脚功能

8237A40 引脚 DIP 封装, 引脚排列:
【微机原理与接口技术】学习笔记9 DMA控制器8237A_第2张图片

  1. CLK 时钟信号,输入
    8237A 时钟频率 3MHz8237A-55MHz
  2. CS ‾ \overline \text{CS} CS 片选信号,输入,低电平有效。
    从态方式下选中 8237A ,接受CPU对它的编程等。
  3. READY 准备好,输入,高电平有效
    慢速 I/O 设备或存储器参与 DMA 传送时,可使 READY 变低,让 8237ADMA 周期中插入等待周期 TW ;当它们准备就绪时 READY 变高。
  4. A3~A04 位地址线
    从态为输入,寻址 8237A 内部寄存器,实现编程;主态时输出要访问内存的低 4 位地址。
  5. A7-A44 位地址线
    始终是输出或浮空,主态时输出 4 位地址信息 A7-A4
  6. DB7-DB0 8 位数据线,与系统数据总线相连。
    • 从态时,CPU经过数据线读取各有关寄存器内容,并对各寄存器编程。
    • 主态时,由它们输出高 8 位地址 A15-A8 ,并由 ADSTB 信号将它们锁存到外部的高 8 位地址寄存器中,与 A7-A0 输出的低 8 位地址构成 16 位地址。
    • 存储器-存储器传送方式下,源存储器读出的数据,经它们送暂存寄存器,暂存器中数据再经它们写到目的存储单元中。
  7. AEN 地址允许信号,输出,高电平有效
    送出锁存的高 8 位地址,与芯片输出的低 8 位地址一起构成 16 位内存偏址。同时使连到CPU的地址锁存器无效,保证地址线上的信号来自 DMAC
  8. ADSTB 地址选通信号,输出,高电平有效
    选通外部地址锁存器,将 DB7~DB0 上的高 8 位地址送到外部的地址锁存器。
  9. IOR ‾ \overline {\text{IOR}} IOR I/O 读信号,双向。
    从态时,控制CPU读取 8237A 内部寄存器
    主态时,与 MEMW ‾ \overline {\text{MEMW}} MEMW 配合,控制数据由外设传到存储器中
  10. DREQ3~DREQ0 通道 3~0DMA 请求信号,输入
    外设
    请求 DMA 服务时,向这些引脚发请求信号,有效极性由编程确定。固定优先级时,DREQ0 的优先级最高,编程可改变优先级。
  11. HRQ 保持请求信号,输出,高电平有效
    向CPU的 HOLD 端发出的 DMA 请求信号,可从 8237A 任一个未被屏蔽的通道发出。
  12. HLDA 保持响应信号,输入,高电平有效
    与CPU的 HLDA 相连,CPU收到 HRQ 信号后,至少经过1个时钟周期后,使 HLDA 变高,表示已让出总线控制权8237A 收到 HLDA 信号后,便开始 DMA 传送。
  13. DACK3~DACK0 通道 3~0DMA 响应信号,输出
    其有效电平极性由编程确定。相应通道开始 DMA 传送后,DACKi 有效,通知外部电路现已进入 DMA 周期
  14. EOP ‾ \overline {\text{EOP}} EOP 传输过程结束信号,双向,低电平有效
    DMA 传送中,任一通道的字计数器减为 0 ,再由 0 减为FFFFH 而终止计数时,会在 EOP ‾ \overline {\text{EOP}} EOP 引脚上输出低电平信号,表示 DMA 传输结束。
    也可在 EOP ‾ \overline {\text{EOP}} EOP 脚上输入低电平信号来终止 DMA 传送。
    若通道设置成自动预置状态,该通道完成一次 DMA 传送,出现 EOP ‾ \overline {\text{EOP}} EOP 信号后,又能自动恢复有关寄存器的初值,继续执行另一次 DMA 传送。

9.1.4 8237A的内部寄存器

8237A的内部可编程寄存器主要有 10 种:

【微机原理与接口技术】学习笔记9 DMA控制器8237A_第3张图片
  1. 当前地址寄存器
    16 位,每通道 1 个,存放 DMA 传送的存储器地址值。每传送 1 个数据,地址值自动 +1-1 ,指向下个单元。
    编程时可写入初值,也可被读出,但每次只能读/写 8 位,所以读/写要两次完成
    自动预置操作方式,在 EOP \text{EOP} EOP 有效时,会重装入基地址值。

  2. 当前字计数寄存器
    16 位,每通道 1 个,编程时置其初值为实际传送字节数少1。每传送 1 字节,自动 -1 。由 0~FFFFH 时,将产生终止计数信号TC
    自动预置操作方式,在 EOP \text{EOP} EOP 有效时,会重装入基字计数寄存器的内容

  3. 基地址寄存器
    16 位,每通道 1 个,存放通道当前地址寄存器初值,与当前地址寄存器地址一样,编程时写入相同值
    其内容不能读出和修改。用在自动预置操作时,使当前地址寄存器恢复到初值

  4. 基字计数寄存器
    16 位,每通道 1 个,存放通道当前字计数器初值,该值也是编程时与当前字计数器一起写入的。
    其内容不能读出和修改,用于自动预置操作时,使当前字计数器恢复到初值

  5. 命令寄存器
    全局,8 位,控制 8237A 的操作。由CPU编程来设置 8327A 操作方式, 复位时清除。
    【微机原理与接口技术】学习笔记9 DMA控制器8237A_第4张图片

    • D0 位:能否进行存储器到存储器传送D0=1 允许。并规定先用通道 0 从源单元读入 1 字节放入暂存器,然后由通道 1 把该字节写到目的单元,接着两通道的地址分别 +1-1 ,通道 1 的字计数器 -1,它减为 0 时产生终止计数信号 TC,并输出 EOP \text{EOP} EOP 信号,终止DMA 服务。
    • D1 位:存储器到存储器传送时,通道 0 地址能否保持不变。D1=1通道 0 在传送中保持同一地址,从而可把该单元中的数写入一组存储单元D1=0 禁止。当 D0=0 时这种方法无效。
    • D2 位:允许或禁止 8237A 工作,D2=0 允许,D2=1 则禁止。
    • D4位 优先权控制。D4=0 为固定优先权,通道 0 优先级最高;D4=1 为循环优先权,刚服务过的通道 i 优先权最低,而通道 i+1 优先权最高。随着 DMA 操作不断进行优先权不断循环,防止某通道长时间占用总线
    • D6 位:决定 DREQ 的有效电平,0 高电平有效,1 则低电平有效。
    • D7 位:决定 DAC K的有效电平,1 高电平有效,0 则低电平有效。
    • D3 位和 D5 位:有关时序的操作,见后面时序讨论。
  6. 工作方式寄存器
    6 位,每通道 1 个,选择 DMA传送方式和类型等,格式:
    【微机原理与接口技术】学习笔记9 DMA控制器8237A_第5张图片

    • D1D0 位:选择通道,并进一步由 D2-D7 指定选定通道的工作方式。这样 4 个通道可合用 1 个方式寄存器。

    • D3D2 位:决定所选通道的 DMA 操作类型。从 3DMA 传送类型中选定一种:
      10:读传送,存储器->I/O设备, 发 MEMR ‾ , IOW ‾ \overline {\text{MEMR}},\overline {\text{IOW}} MEMR,IOW
      01:写传送,存储器<-I/O设备, 发 MEMW ‾ , IOR ‾ \overline {\text{MEMW}},\overline {\text{IOR}} MEMW,IOR
      00:校验传送,伪传送,8237A 会产生地址信息和
      EOP \text{EOP} EOP 信号,不会发出读写控制信号,用于测试。

    • D4 位:所选通道是否进行自动预置操作。如果 D4=1 ,则选择自动预置。

    • D5 位:方向控制位。D5=0 数据传送由低址向高址方向进行,每传送 1 字节,地址 +1D5=1 时传送方向相反。

    • D7D6 位:定义所选通道操作方式。有 4 种传送方式:
      1) 单字节传送方式(常用于软盘)
      每次DMA操作只传送 1 字节。之后字计数器 -1 ,地址寄存器 +1-1HRQ 无效,释放系统总线。当字计数器由 0 减为 FFFFH 时,产生终止信号 TC
      此后即使 DREQ 继续有效,8237AHRQ 输出仍进入无效状态并让出总线,由CPU控制至少一个总线周期。

      2) 数据块传输方式
      进入 DMA 服务后,可连续传输一批数据,直到字计数器由 0 减为 FFFFH 产生 TC 信号,或从外部送来 EOP \text{EOP} EOP 信号时,才释放总线,结束 DMA 传输。

      3)请求传送方式
      也连续传送数据,直到字计数器由 0 减为 FFFFH 产生 TC ,或外界送来 EOP \text{EOP} EOP 信号。但每传送 1 字节后,都要测试 DREQ 端,一旦发现此信号无效,马上停止
      地址和字计数器的中间值会被保存在通道的现行地址和字计数器中,外设准备好新数据时,可使 DREQ 再变为有效,又从断点处继续进行传输

      4)级联传送方式
      连接多个 8237A扩充 DMA 通道,连线见图11.5。
      主片 DREQ —从片 HRQ ,主片 DACK—从片 HLDA ,主片 HRQHLDA 与CPU的 HOLDHLDA 相连。1 块主片可连 4 块从片。主片置为级联传送从片设成其它三种方式。主片不输出地址和读写信号。
      【微机原理与接口技术】学习笔记9 DMA控制器8237A_第6张图片

  7. 请求寄存器
    相应请求位置 1 时,对应通道可产生 DMA 请求。相应位可由DREQ 信号置1,也可写入通道请求字来置 1 或清 0
    D1D0 位选通道号,D2 位为请求位。请求位不能屏蔽,其优先权受优先权逻辑控制,TC 或外部的 EOP \text{EOP} EOP 信号能将相应的请求位清 0RESET 信号则使整个请求寄存器清 0
    【微机原理与接口技术】学习笔记9 DMA控制器8237A_第7张图片

  8. 屏蔽寄存器
    4 位,1 个/通道。禁止/允许对应通道的 DREQ 请求进入请求寄存器。有两种屏蔽字,端口地址不同
    1)通道屏蔽字
    可对该寄存器写入通道屏蔽字来对单个屏蔽位置 1 /复位。通道屏蔽字格式与通道请求字格式类似:
    【微机原理与接口技术】学习笔记9 DMA控制器8237A_第8张图片
    2)主屏蔽字
    还允许用主屏蔽命令设置通道的屏蔽触发器D3~D0 位对应通道 3~0 的屏蔽位,1 屏蔽,0 清除屏蔽。可写入主屏蔽字,一次完成 4 个通道的屏蔽位设置。可用软件同时清除 4 个通道的屏蔽位。
    【微机原理与接口技术】学习笔记9 DMA控制器8237A_第9张图片

  9. 状态寄存器
    8 位状态寄存器存放状态信息,供CPU读出。如 D3~D0 中置 1 的通道,已达计数终点 TC 或外部送来了 EOP \text{EOP} EOP 信号。D7-D4 中置 1 的通道,DMA 请求还未处理。复位或被读出后,相应状态位被清除。状态字格式:
    【微机原理与接口技术】学习笔记9 DMA控制器8237A_第10张图片

  10. 暂存寄存器
    在存储器->存储器传送时,保存所传送的数据。其中始终保存着最后 1 个传送的字节,RESET 信号会将其清除。编程状态下,可由CPU读出这个字节。

  11. 软件命令
    编程状态下,8237A 可执行 3 个附加的特殊软件命令,只要对特定端口进行一次写操作,命令就会生效。
    1)清除先/后触发器
    8237A8 根数据线,而地址寄存器和字计数器均为 16 位,CPU要分两次读写。先/后触发器控制高低字节读写次序。清 0 读写低 8 位,随后自动置 1 ,读写高 8 位。接着又清 0 ,… 。对该触发器所在的寄存器执行一次写操作便清 0 ,复位和 EOP \text{EOP} EOP 信号有效也将它清为 0
    2)主清命令
    主清命令也称为复位命令,功能与 RESET 信号同,它可使命令寄存器、状态寄存器、请求寄存器、暂存寄存器和内部先/后触发器均清 0 ,而把屏蔽寄存器置 1 。复位后,8237A 进入空闲状态。
    3)清除屏蔽寄存器
    该命令能清除 4 个通道的全部屏蔽位,允许各通道接受 DMA 请求。

  12. 各寄存器的端口地址
    8237A 内部寄存器读写时, CS ‾ \overline {\text{CS}} CS 端必须为低电平,该信号由高位地址经I/O译码后产生
    A3~A0 线选择不同寄存器,共占 16 个I/O端口地址。常将它们与地址总线低 4A3~A0 相连,选择各寄存器。
    例如,PC/XT 机中,地址 A9~A4=000000 时,经I/O译码电路选中 8237A,使其有效。 地址 A3~A08237AA3~A 0脚连接实现片内寻址。因此基地址 =00H,记为 DMA=00H 。由此可得其他寄存器的地址,如DMA+00H 为通道 0 基地址与当前地址寄存器地址,DMA+08H 为状态寄存器地址等:
    【微机原理与接口技术】学习笔记9 DMA控制器8237A_第11张图片


9.2 8237A的时序

空闲周期 SI :未发生 DMA 请求时

  • 检测 CS :CPU是否对其操作
  • 检测 DREQ :外设是否有请求

过渡状态 S0DMAC 发出 HRQ 之后,收到 HLDA 之前。

有效周期:DMAC 收到 HLDA 之后,接管总线:
包括 4 个状态周期(S1、S2、S3、S4),慢速I/O或M还可通过令 READY=0 申请插入 SW8237A-5S3 中检测 READYSW 中的操作同 S3
【微机原理与接口技术】学习笔记9 DMA控制器8237A_第12张图片

  • S1 :更新高8位地址,AENADSTB 有效,DMACMA8~15 放到 DB0~7 上;只有当 A8~15 有变化时才出现
  • S2 :选中两个介质,输出 16 位地址选中 M :低 8 位由 A0~7 直接输出;高 8 位由 DB0~7 经外部锁存器(由 ADSTB 下降沿锁存)输出;发出有效的 DACK 选中I/O
  • S3 :读周期。发出 IOR(DMA写)或 MEMR(DMA读),从源读数据到 DB0~7,等待写周期。
  • S4 :写周期。发出 MEMW(DMA写)或 IOW(DMA读),将 DB0~7 上的数据写到目标中。
    【微机原理与接口技术】学习笔记9 DMA控制器8237A_第13张图片

扩展写:写提前到与读同时开始(S3),与读一样扩展到 2 个时钟周期。
压缩时序:去掉 S3 ,读与写同为 1 个时钟周期。
SW :慢速I/O或M传送时,在 S3S4 间插入 SW


9.3 8237A的编程和应用举例

9.3.1 DMA系统组成

PC机的DMA系统:

  • 8237A-5
  • 页面地址寄存器
  • 总线裁决逻辑

9.3.2 DMA系统有效地址的生成

【微机原理与接口技术】学习笔记9 DMA控制器8237A_第14张图片

第一代PC机中的地址是 20 位的,而 8237A16 位的。为此需要一个 74LS670 扩展地址。

1. 74LS670工作原理

74LS670RA,RBDACK2,DACK3 连接,内有 44 位寄存器。读写分开控制:

  • 写: GW ‾ = 0 \overline {\text{GW}}=0 GW=0WA、WB:写入寄存器选择;D1~4:数据输入
  • 读: GR ‾ = 0 \overline {\text{GR}}=0 GR=0RA、RB:读出寄存器选择;Q1~4:数据输出

2. DMA系统有效地址的生成

如何提供存储器的地址:

  • A16~19 :由 74LS670 提供;
  • A8~15 :由 8237A-5DB0~774LS373 提供;
  • A0~7 :由 8237A-5A0~7 直接提供;

如何对I/O设备寻址,用 DACK 信号取代芯片选择和片内端口选择
【微机原理与接口技术】学习笔记9 DMA控制器8237A_第15张图片

3. IBM-PC微机的DMA系统

单片 DMACDMA 系统:4 个通道;8 位传送;1MB 寻址;64KB 计数
双片DMAC的DMA系统:

  • 7 个通道;16MB 寻址;64KB 计数
  • 片(0):8 位传送
  • 片(1):使用偶地址;16 位传送
    【微机原理与接口技术】学习笔记9 DMA控制器8237A_第16张图片

如果我们打开设备管理器,可以在直接内存访问控制器中看到上图双片DMAC结构中,出现的端口地址。

4. DMA系统的初始化

注意事项:

  • 初始化前要对芯片检测
  • 初始化前禁止工作或屏蔽通道
  • 所有通道的方式寄存器均加载
  • 初始化页面地址寄存器

初始化编程:
① PC机检测芯片816 位寄存器全 1 、全 0 的读写)及加载校验方式:

	MOV	AL, 04H		 ;0000_0100:4位默认配置,正常时序,禁止工作,CR0地址不保持,禁止内存到内存
	OUT	DMA+08H, AL  ;写入命令寄存器
	OUT	DMA+OCH, AL  ;清先后触发器
	MOV	AL, 0FFH	 ;1111_1111:1的读写测试
C16:	MOV	BL, AL   ;1或全0
	MOV	BH, AL       ;1或全0
	...
	...
	MOV	CX, 8		 ;8个寄存器做读写测试
	MOV	DX, DMA		 ;从DMA开始测试
C17:	OUT	DX, AL	 ;1或全0写入DX
	OUT	DX, AL		 ;再写一次,16位写两次,先写低八位,再写高八位
	IN	AL, DX	     ;读出低八位
	MOV	AH, AL		 ;
	IN	AL, DX		 ;读出高八位,放入AX中
	CMP	BX, AX		 ;和之前保存的AL对比
	JE	C18	         ;如果相同,证明该寄存器没有出错
	HLT				 ;不相同则停机
C18:	INC	DX	     ;DX端口号+1
	LOOP	C17	     ;再重复循环
	...
	INC	AL	         ;AL+1=0
	JE	C16	         ;0,跳转回C16,做全0测试
	...
	...
	...
	...
	...
	...
	SUB	AL, AL			 ;AL清0
	OUT	DMA+08H, AL		 ;写入命令寄存器,4位按照默认配置,4位正常时序,允许工作,其他位默认;启用芯片
	;下面将40H,41H,42H,43H先后写入工作方式寄存器,,即对全部的通道写入同样的工作方式
	MOV	AL, 40H			 ;0100_0000针对0号通道
	OUT	DMA+0BH, AL		 ;单字节方式,地址递增,禁止地址预置,校验方式
	MOV	AL, 41H			 ;0100_0001针对1号通道
	OUT	DMA+0BH, AL		 ;单字节方式,地址递增,禁止地址预置,校验方式
	MOV	AL, 42H			 ;0100_0010针对2号通道
	OUT	DMA+0BH, AL		 ;单字节方式,地址递增,禁止地址预置,校验方式
	MOV	AL, 43H			 ;0100_0011针对3号通道
	OUT	DMA+0BH, AL		 ;单字节方式,地址递增,禁止地址预置,校验方式

5. DMA传送的应用

例:利用级联的 IBM PC/AT8237 主片通道 5 ,将内存其始地址为 80000H280H 字节的内容直接输出到外部设备。

MOV	AL, 04H		;命令字, 禁止82C37工作
OUT	0D0H, AL	;写命令寄存器
MOV	AL, 0	
OUT	0D8H, AL	;清除先/后触发器
OUT	0C4H, AL	;写低位地址
OUT	0C4H, AL	;写高位地址      
MOV	AL,04H		;页面地址为8
OUT	08BH, AL	;写页面寄存器	
MOV	AX, 280H	;传输字节数
DEC	AX
OUT	0C6H, AL	;写字节数低位
MOV	AL, AH
OUT	0C6H, AL	;写字节数高位
MOV	AL, 89H		;方式字: 单字节读, 地址加1
OUT	0D6H, AL
MOV	AL, 05H		;写请求寄存器
OUT	0D2H, AL

DMA控制器与I/O设备的连接:DMAENDMA 申请允许信号;软盘接口中的数据输出寄存器(3F2H)的 D3 位控制,高有效
【微机原理与接口技术】学习笔记9 DMA控制器8237A_第17张图片

ROM-BIOS 中软盘 DMA_SETUP

  • AL——方式字(CH2,单一传送,非自动预置,地址增量)
  • 42H:DMA校验(软盘校验)
  • 46H:DMA写(读软盘)
  • 4AH:DMA读(写软盘)
  • ES:BX——内存首址
  • DH——要传送的扇段数

字节数/扇段在磁盘基址区 DISK_BASE3 号单元

  • 0128 字节/扇段
  • 1256 字节/扇段
  • 2512 字节/扇段
  • 31024 字节/扇段
DMA_SETUP  PROC
	PUSH	CX		;保护现场
	CLI
	OUT	DMA+12, AL	;清先/后触发器
	OUT	DMA+11, AL	;设置方式
					;形成物理地址
	MOV	AX, ES
	MOV	CL, 4
	ROL	AX, CL
	MOV	CH, AL
	AND	AL, 0F0H
	ADD	AX, BX
	JNC	J33
	INC	CH
J33:	PUSH	AX	;16位地址入栈
	...
					;设置地址寄存器及页面地址
	OUT	DMA+4, AL	;写低16位地址
	MOV	AL, AH
	OUT	DMA+4, AL
	MOV	AL, CH
	AND	AL, 0FH		;写高4位地址
	OUT	81H, AL
					;设置字节计数器
	MOV	BX, 6
	CALL GET_PAM	;取DISK_BASE的3号单元作为移位次数
	MOV	CL, AH
	MOV	AH, DH
	SUB	AL, AL
	SHR	AX, 1
	SHL	AX, CL
	DEC	AX
	PUSH	AX		;N-1入栈保护
	...
	OUT	DMA+5, AL
	MOV	AL, AH
	OUT	DMA+5, AL
	STI
					;判DMA是否超界
	POP	CX			;用低16位地址与N-1相加设置CF
	POP	AX
	ADD	AX, CX
	POP	CX			;恢复现场
	MOV	AL, 02H
	OUT	DMA+10, AL
	RET
DMA_SETUP  ENDP

你可能感兴趣的:(微机原理)