中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 请教我的这个dos块设备驱动错在什么地方?
作者:
标题: 请教我的这个dos块设备驱动错在什么地方? 上一主题 | 下一主题
yixianwei
初级用户




积分 207
发帖 26
注册 2003-9-1
状态 离线
『楼 主』:  请教我的这个dos块设备驱动错在什么地方?

;blockdev.asm ;desige to be compiled in a small model ;cs=ds .model small ;------------------------------------------------- ;constant define ;------------------------------------------------- USBDevAddr EQU 01H ;usb device address CR EQU 0DH ;carriage return LF EQU 0AH ;Line feed MAXCMD EQU 25 ;DOS3.0 readErr EQU 800BH ;read ERROR writeErr EQU 800AH ;write ERROR locateErr EQU 8008H ;look for sector error ERROR EQU 8000H ;Set error bit BUSY EQU 0200H ;Set busy bit DONE EQU 0100H ;Set completion bit UNKNOWN_CMD EQU 8003H ;Set unknown status OP_COMPLETE EQU 0000h ;Set no error cseg segment public 'code' ;Start the code segment org 0 assume cs:cseg,ds:cseg ;------------------------------------------------------------------ drvr proc far ;FAR procedure DD -1 ;NEXT driver pointer DW 0800H ;support open/close/movable;block device DW strategy ;Pointer to strategy DW interrupt ;Pointer to interrupt DB 01 ;support one device db 7 dup(0) _BPB dw 0200H db 01H dw 0001H db 01H dw 0100H dw 0F000H db 0F0H dw 0100H dw 0001H dw 0001H dw 0001H dd 00000000H ;------------------------------------------------------------------- rh_seg DW ? ;RH segment address rh_off DW ? ;RH offset address physicalAddr DD ? ;==================================================================== ;strategy routine,must be declared far ;is the first routine dos called ;==================================================================== strategy PROC far mov cs:rh_seg,es; mov cs:rh_off,bx; ret strategy ENDP ;===================================================================== ; dispatch table ;===================================================================== dispatchTable: dw init dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport ;nondestructive read dw unsupport dw unsupport dw unsupport dw unsupport ;may change the CBWCB to apply the command dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport dw unsupport ;RH STRUC ;request head ;RHLength DB ? ;request head length ;unit DB ? ;request function number ;command DB ? ;request command number ;status DB ? ;return status ;reserve DB 8 DUP(?);reserve sector ;mediaLabel DB ? ;media label ;memoryAdd DD ? ;transfer memory buffer ;count DW ? ;sector/byte counter ;startSector DW ? ;start sector ;RH ends ;======================================================================= ; interrupt routine ;======================================================================= interrupt PROC far cld ;save machine state push AX push BX push CX push DX push DS push ES push DI push SI push BP push CS pop DS mov DX,CS:rh_seg mov ES,DX mov BX,CS:rh_off ; Now RH is in es:bx mov al,es:[bx+02H];get command number xor ah,ah cmp ax,MAXCMD jle ok mov ax,UNKNOWN_CMD jmp finish OK: shl ax,1 ;ax*2 mov di,ax ;di is the index number mov ax,0 ;zero ax call word ptr[di+dispatchTable] finish: mov dx,cs:rh_seg ;Now RH is in es:bx mov es,dx mov bx,cs:rh_off or ax,DONE ;Set the DONE bit mov es:[bx+3],ax pop BP pop SI pop DI pop ES pop DS pop DX pop CX pop BX pop AX ret ;Back to DOS interrupt ENDP unsupport PROC near mov dx,cs:rh_seg mov es,dx mov bx,cs:rh_off ; Now RH is in es:bx mov ax,UNKNOWN_CMD ret unsupport ENDP init PROC near mov dx,cs:rh_seg mov es,dx mov bx,cs:rh_off ; Now RH is in es:bx mov ah,9 mov dx,offset ident int 21h ;print the information lea ax,end_driver mov word ptr es:[bx+0EH],ax ;get the driver's end address offset mov word ptr es:[bx+10H],cs ;get the driver's end address seg mov ax,offset _BPB mov word ptr es:[bx+12H],ax ;get BPB's address offset mov word ptr es:[bx+14H],cs ;get BPB's address segment mov byte ptr es:[bx+0DH],1 ;support function number mov ah,9 mov dx,offset initOK int 21H mov ah,86H mov cx,10 mov dx,0 int 15H mov ax,OP_COMPLETE ;no error ret init ENDP ident db CR,LF db 'block device Driver(developed by high_end CNC research center of china )' db CR,LF db '------------------------------version1.0----------------------------------' db CR,LF,LF,'$' initOK db CR,LF db 'block device driver init OK' db CR,LF,LF,'$' end_driver: drvr endp cseg ends end ;====================================================;====================== 我使用tasm5.0编译,系统引导的时候提示说 sector size toolarge,我把BPB(bios parameter block)全部设为零,也不行.我提供的BPB是一个标准的磁盘参数块.   万请指导.


2004-5-3 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: