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毫秒