;===================================================== ; ;Program:DetectATAPIdeviceexistornot ;Ifexist,changestatus. ;Ifnowexist,donothing. ;NotaffectATAdevice. ;Environment:PureDOS. 逆@风@者 ;Author:JimYu(YuLing) ;Data:2004.07.15 ;Version:1.0.0 ;Mail:Jim.Yu@Mic.Com.Tw ; .MODELSMALL .586P .STACK1024 .DATA BSYEQU80h DRQEQU8 START_STOP_UNITEQU1Bh EJECT_TRAYEQU2 CLOSE_TRAYEQU3 MODE_SENCEEQU5Ah STATUS_PAGEEQU2Ah SIZE_OF_CHANNEL_ITEMEQU15h SHOW_DOOR_OPENDB'DoorOpened.',0dh,0ah,'$' SHOW_DOOR_CLOSEDB'DoorClosed.',0dh,0ah,'$' NOT_EXISTDB'NotExist.',0dh,0ah,'$' SS_CHANNELDB'4.SecondarySlave$' SM_CHANNELDB'3.SecondaryMaster$' PS_CHANNELDB'2.PrimanySlave$' PM_CHANNELDB'1.PrimanyMaster$' PACKET_COMMANDDB12DUP(0) .CODE START: MOVAX,@code MOVDS,AX PUSHDS
;Codestart pushsegPACKET_COMMAND popds movcx,4 next_device: callshow_channel
calldetect_atapi
jnenot_atapi
calldetect_device
jc@f callopen_device callopen_deviceSomeATAPI(e.g.DVD-ROM) callopen_deviceNeedsendcommand3times. movdx,offsetSHOW_DOOR_OPEN jmpshow_and_reset_device @@: callclose_device callclose_deviceSomeATAPI(e.g.DVD-ROM) callclose_deviceNeedsendcommand3times. movdx,offsetSHOW_DOOR_CLOSE show_and_reset_device: movah,9 int21h callreset_device jmpcheck_device_finish not_atapi: movdx,offsetNOT_EXIST movah,9 int21h check_device_finish: loopnext_device
;Codeend
POPDS MOVAX,4C00h INT21h
;===================================================== ;procedure:show_channel ;in:cx ;out:none ;destroy:none show_channelproc pushcx pushsegSS_CHANNEL popds movdl,cl decdl movax,SIZE_OF_CHANNEL_ITEM muldl movdx,ax adddx,offsetSS_CHANNEL movah,9 int21h popcx ret show_channelendp
;===================================================== ;procedure:waid_idle ;in:dx ;out:CY=timeout ;NC=deviceidle ;destroy:none wait_idleproc pushcx pushdx pushax
ordl,7 movcx,0ffffh @@: callin_al_dx testal,BSY jz@f loop@b @@: popax popdx popcx ret wait_idleendp
;===================================================== ;procedure:req_data ;in:dx ;out:CY=timeout ;NC=devicerequestdata ;destroy:none req_dataproc pushcx pushdx pushax
ordl,7 movcx,0ffffh @@: callin_al_dx testal,DRQ jnz@f loop@b @@: popax popdx popcx ret req_dataendp
;===================================================== ;procedure:set_feature ;in:ax ;out:none ;destroy:ax ;Set1X1=0 ;Set1X4=AL ;Set1X5=AH ;Send1X70A0h set_featureproc pushdx pushax
incdl xoral,al callout_dx_al
popax
adddl,3 callout_dx_al
incdl xchgah,al callout_dx_al
adddl,2 moval,0a0h callout_dx_al
popdx ret set_featureendp
;===================================================== ;procedure:send_packet_command ;in:dx,si ;out:none ;destroy:ax,si send_packet_commandproc pushcx
movcx,6 @@: movax,ds:[si] callout_dx_ax xorax,ax movds:[si],ax addsi,2 loop@b
callwait_idle
popcx ret send_packet_commandendp
;===================================================== ;procedure:detect_device ;in:cx ;out:CY=TrayOpen ;NC=TrayClose ;destroy:dx,ax,si ;Detectatapidevicetray detect_deviceproc
callset_device
movax,090h callset_feature
callwait_idle
@@: movsi,offsetPACKET_COMMAND
movax,(STATUS_PAGE*100h) MODE_SENCE movds:[si],al movds:[si 2],ah moval,90h movds:[si 8],al
callsend_packet_command
callreq_data
callin_al_dx callin_al_dx cmpal,70h jedoor_close stc ret door_close: clc ret detect_deviceendp
;===================================================== 本文章更多内容:1 - 2 - 下一页>> |