PersonalCorpus 版 (精华区)

发信人: OGG (扑朔迷离), 信区: Asm
标  题: 8237控制软驱读写的例程(收集)
发信站: 哈工大紫丁香 (2003年05月18日08:58:28 星期天), 站内信件

PC读写软驱的操作是在DMA控制器的通道2和软盘控制器FDC(uPD765)的协同控制下完成的

PC上标准的DMA磁盘操作都用的是单字节的方式
    通常用4Ah(通道2单字节DMA读),用于写软盘
          46h(通道2单字节DMA写),用于读软盘
          42h(通道2单字节DMA检验)
类似int 13h中的使用方式--es:bx中保存有DMA传送的内存首地址
dma_setup proc
    push    cx  ;保存cx
    cli     ;关中断,因软盘传送后要请求中断
    out 0ch,al  ;清高/低触发器命令
    push    ax  ;延时
    pop ax
    out     0bh,al  ;将AL中的方式字写入到通道2
    mov     ax,es
    mov     cl,4
    rol ax,cl   ;段地址左移4位
    mov ch,cl   ;高位存入CH
    and al,0f0h
    add ax,bx   ;加段内偏移地址
    jnc j33
    inc ch  ;物理地址形成
j33:    push    ax  ;保存ax
    out 04h,al  ;写入地址寄存器
    mov     al,ah
    out     04h,al
    mov     al,ch
    and al,0fh
    out 81h,al  ;写入页面寄存器
    mov     ah,dh   ;取扇区数,计算传送的字节数
    sub al,al   ;ax为扇区数乘256
    shr ax,1    ;ax为扇区数乘128
    push    ax  ;暂存ax
    mov     bx,6
    call    GET_PARM;调用参数子程序(注)
    mov     cl,ah   ;出口参数:ah=0/1/2/3,作为左移次数
    pop ax  ;恢复ax
    shl ax,cl   ;左移后,ax为DMA传送的字节数
    dec ax  ;字节数减1
    push    ax
    out 05h,al  ;写入字节数寄存器
    mov     al,ah
    out 05h,al
    sti     ;开中断
    pop cx  ;弹出传送的字节数
    pop ax  ;弹出物理地址的低16位
    add ax,cx   ;相加,根据结果建立标志CF
    pop cx  ;恢复cx
    mov al,02h  ;清除通道2的屏蔽位,允许对DRQ2的响应
    out 0ah,al
    ret
dma_setup endp
    注:GET_PARM是读取参数子程序。入口参数:BX=字节索引乘2。
出口参数:AH=该索引的字节数。本例中BX=6表示从磁盘基数表中取每扇区字节数的代码
,ah=0/1/2/3分别代表扇区具有128/256/512/1024字节。

--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.21]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.000毫秒