发新话题
 搜藏 打印 该页面添加到 Mister Wong

CD-ROM出盒、入盒程序

CD-ROM出盒、入盒程序

CD-ROM出盒、入盒程序


--------------------------------------------------------------------------------

概述:

     我们在应用程序中常见到用软件控制 CD-ROM 的出、入盒,本文就是实现这种功能的一个例子。主要用到 INT 2FH 的 1510H(Send device driver request) 功能。具体参数详见程序注释。

要用到的几个中断说明如下:

1. IOCTL input 的格式:

偏移量 类型 内容
00H 字节 1AH
01H 字节 00H
02H 字节 03H
03H 字节 11 DUP(?)
0EH 双字 缓冲区地址
12H 字 缓冲区长度
14H 字节 6 DUP(?)

2. IOCTL output 的格式:

偏移量 类型 内容
00H 字节 1AH
01H 字节 00H
02H 字节 0CH
03H 字节 11 DUP(?)
0EH 双字 缓冲区地址
12H 字 缓冲区长度
14H 字节 6 DUP(?)

3. 在缓冲区中填入命令再用 INT 2fH 的 1510H 便可以实现 CD-ROM 的各种功能,缓冲的一些命令格式如下:

作用 长度 格式
出盒 1 00
解锁 2 01,00
加锁 2 01,01
入盒 1 05
取CD-ROM 状态 5 06,0,0,0,0
返回:06,xx,xx,0,0
xx,xx为状态字
位0:1 门开,0门关
位1:1未锁,0门锁
位B:1无盘,0有盘

4. 检测 CD-ROM 驱动程序的存在:

AX = 1500H
BX = 0
INT 2fH
返回:BX = CD-ROM 个数
      CX = 起始CD-ROM 盘符,0=A:,1=B:等等

5. 发送 Device Driver Request:

AX = 1510H
ES:BX=请求头地址
CX = CD-ROM 的盘号

源程序如下:

;       CD-ROM eject/load progrm
;       Ver 1.20 ------ Jan 6,1996

CODE                SEGMENT
                ASSUME        CS:CODE,DS:CODE
                ORG        100H
START:
                jmp        install
COPYRIGHT        DB        'CD-ROM drive eject/close prg. V1.20',0dh,0ah
                DB        'Copyright (c) by Luo Yun Bin, Jan 6,1996',0dh,0ah
                DB        'http://asm.yeah.net,Email: luoyunbin@telekbird.com.cn'
                DB        0dh,0ah,0ah,24h
D_HELP                DB        'Usage: EJ [drive:] [/?|/L|/U]',0dh,0ah
                DB        '       /?  -------- Display this help',0dh,0ah
                DB        '       /L  -------- Lock door',0dh,0ah
                DB        '       /U  -------- Unlock door',0dh,0ah,24h
MESS_WAIT        DB        '[ENTER] to close, [Esc] to quit.',24h
MESS_ESC        DB        'tray keep open...',0dh,0ah,24h
MESS_NO_CD        DB        'MSCDEX not installed!',0dh,0ah,24h
MESS_STATUS        DB        'There are '
DRV_NUMBER        DB        '0 CD-ROM drive(s) starting at '
DRV                DB        'A:',0dh,0ah,24h
MESS_DRV        DB        0dh,'                                  ',0dh
                DB        'drive '
DRV1                DB        'A: ',24h
MESS_EJECT        DB        'ejecting....',24h
MESS_CLOSE        DB        'closing ....',24h
MESS_LOCK        DB        'locking ....',24h
MESS_UNLOCK        DB        'unlocking...',24h
MESS_DONE        DB        ' Done!',0dh,0ah,24h
CD_DRV                DW        ?
FLAG                DB        ?
;======================================================
REQ_HEAD        DB        1ah,0                ;IOCTL input
REQ_CMD                DB        3
REQ_ERR                DW        ?
                DB        9 dup (0)
BUF_OFF                DW        buffer
BUF_SEG                DW        ?
BUF_LEN                DW        ?
                DB        6 dup (0)
;======================================================
BUFFER                DB        5 dup (0)        ;Max used 5 bytes
CMD_LINE        PROC
                mov        si,81h                ;处理命令行参数
                mov        di,80h
                cld
cmd_reload:
                lodsb
                cmp        al,0dh
                jz        conv_end        ;将命令行小写字母换成大写
                cmp        al,'a'
                jb        conv_ok
                cmp        al,'z'
                ja        conv_ok
                sub        al,20h
conv_ok:
                stosb
                jmp        short cmd_reload
conv_end:
                xor        al,al
                stosb
               
                mov        si,80h
cmd_reload1:
                lodsb
                or        al,al
                jz        cmd_end
                cmp        al,'/'
                jz        cmd_switch
                cmp        al,':'
                jnz        cmd_reload1
                mov        al,[si-2]
                cmp        al,'A'
                jb        cmd_end
                cmp        al,'Z'
                ja        cmd_end
                sub        al,'A'
                xor        ah,ah
                mov        cd_drv,ax
                jmp        short cmd_reload1
cmd_switch:
                lodsb
                cmp        al,'?'
                jz        cmd_help
                cmp        al,'L'
                jz        cmd_lock
                cmp        al,'U'
                jz        cmd_unlock
                jmp        short cmd_reload1
cmd_end:
                ret
cmd_help:
                mov        dx,offset d_help
                call        print
                int        20h
cmd_lock:
                or        flag,1
                jmp        short cmd_reload1
cmd_unlock:
                or        flag,2
                jmp        short cmd_reload1
CMD_LINE        ENDP
CD_INT                PROC
                mov        ax,1510h
                mov        buf_seg,cs
                mov        bx,offset req_head
                mov     cx,cd_drv
                int     2fh
               
                ret
CD_INT                ENDP
GET_STATUS        PROC
                mov     buffer,6
                mov        buf_len,5
                mov        req_cmd,3
                call    cd_int
                ret
GET_STATUS        ENDP
EJECT_DISK        PROC
                mov        dx,offset mess_drv
                call        print
                mov        dx,offset mess_eject
                call        print
                mov        buffer,0
                mov        buf_len,1
                mov        req_cmd,0ch
                call    cd_int
                mov     dx,offset mess_done
                call    print
                ret
EJECT_DISK      ENDP
CLOSE_TRAY      PROC
                mov     dx,offset mess_drv
                call    print
                mov     dx,offset mess_close
                call    print
                mov        buffer,5
                mov        buf_len,1
                mov        req_cmd,0ch
                call        cd_int
                mov     dx,offset mess_done
                call    print
                ret
CLOSE_TRAY      ENDP
LOCK_DOOR        PROC
                mov        dx,offset mess_drv
                call        print
                mov        dx,offset mess_lock
                call        print
               
                mov        word ptr buffer,0101h
                mov        buf_len,2
                mov        req_cmd,0ch
                call        cd_int
               
                mov        dx,offset mess_done
                call        print
                ret
LOCK_DOOR        ENDP
UNLOCK_DOOR        PROC
                mov        dx,offset mess_drv
                call        print
                mov        dx,offset mess_unlock
                call        print
               
                mov        word ptr buffer,0001h
                mov        buf_len,2
                mov        req_cmd,0ch
                call        cd_int
               
                mov        dx,offset mess_done
                call        print
                ret
UNLOCK_DOOR        ENDP
CHECK_CDROM     PROC
                mov     ax,1500h
                xor     bx,bx
                int     2fh
                or      bx,bx                ;BX = CD-ROM numbers
                jnz     mscdex_installed
                mov     dx,offset mess_no_cd
                call    print
                int     20h
mscdex_installed:
                mov     bp,cx
                xor     bh,bh
                add     bp,bx
                dec     bp
                cmp     cd_drv,cx
                jb      re_set
                cmp     cd_drv,bp
                jbe     par_ok
re_set:
                mov     cd_drv,cx
par_ok:
                add     drv_number,bl
                add     drv,cl
                mov     cx,cd_drv
                add     drv1,cl
                mov     dx,offset mess_status
                call    print
                ret
CHECK_CDROM     ENDP
PRINT                PROC
                mov     ah,9
                int     21h
                ret
PRINT                ENDP
install:
                mov     dx,offset copyright
                call    print
                call        cmd_line
                call    check_cdrom                ;检测 CD-ROM 状态
                test        flag,1                        ;如果 /L 参数则 Lock_door
                jz        ins1
                call        lock_door
                int        20h
ins1:
                test        flag,2                        ;如果 /U 参数则 unlock_door
                jz        ins2
                call        unlock_door
                int        20h
ins2:
                call    get_status
                test        word ptr buffer+1,1        ;如果现在在出盒状态则转入盒
                jnz        close_it
                call    eject_disk                ;打开 CD-ROM
                mov     dx,offset mess_wait        ;等待
                call    print
                xor     ax,ax
                int     16h
                cmp     al,1bh
                jz      _esc_quit
close_it:
                call    close_tray                ;关闭 CD-ROM
                int     20h
_esc_quit:
                mov     dx,offset mess_drv
                call    print
                mov     dx,offset mess_esc
                call    print
                int     20h
CODE                ENDS
                END        START

本文由GOD_Father 发布于Linuxsky 论坛,网址:http://bbs.linuxsky.org/thread-444-1-1.html

====================
夜,给了我黑色的眼睛;
我却用它来寻找光明,
寻找光明……

zyl508@163.com
====================

TOP

发新话题