只要你想听CD,它在任何时候(DOS下,游戏下都可以)用鼠标激活,鼠标控制,为你播放.并提供了选曲和暂停功能,这为光驱上无直接播放建的朋友提供了莫大的方便.该程序思路巧妙,利用INT 33H的现有鼠标功能,巧妙扩展,达到任何条件下激活的能力!!如果你有兴趣,可以把他改为鼠标控制XXXXXX的程序,随时激活,方便无比!!! 逆风者
源码如下:
;mcd.asm .286 code segment assume cs:code,ds:code org 100h start: jmp init_cd ;到初始化 cd_command db 32 dup(0) ;CD-AUDIO 控制区 cd_state db 32 dup(0) ;CD-AUDIO 状态区 max_track db 0,0 ;CD最大道 min_track db 0,0 ;CD最小道 lead_track dw 0 track dw ? track_buff db 40*4 dup(?) ;CD音道数据区(预定为40个) int33_off dw ? ;原鼠标中断向量 int33_seg dw ? user_dx dw ? ;用户鼠标事件向量 user_es dw ? mark db 0 ctrl db 0 ;CD控制方式 next equ 1 ;前进 back equ 0 ;到退 stop equ 2 ;停止 cd_rom_driver dw ? ;CD驱动器号 red_max_h dw ? red_max_l dw ? cd_int macro ;控制CD-AUDIO的宏 mov ax,1510h mov cx,cd_rom_driver int 2fh endm
my: ;本程序的鼠标事件 MY pushf cmp bx,7 ;是否三键同时按下 jnz ttt mov cs:ctrl,stop ;停止 jmp ll ttt: cmp bx,3 ;是否两键同时按下 jnz q cmp dx,1 ;鼠标在最上 jnb other mov cs:ctrl,stop ;停止 jmp ll other: cmp cx,599 ;鼠标在最右 jb qqq mov cs:ctrl,next ;前进 jmp ll
qqq: cmp cx,1 jae q mov cs:ctrl,back ;鼠标在最左,倒退 ll: pusha push ds push es
push cs pop ds push cs pop es
call mediachg ;是否更换CD cmp al,0ffh jnz che call init ;更换CD后的初始化 che: call check ;CD状态检查 cmp cs:ctrl,next jz ff cmp cs:ctrl,back jz rew
ff: ;前进 cmp al,max_track ;是超过最大音轨 jb goo mov al,0 ;如超过,由第一音轨开始 goo: inc al ;音轨加一 jmp okk
rew: ;倒退 cmp al,1 ;是否小于最小音轨 ja dy mov al,max_track ;如小于,由最大音轨开始 jmp okk dy: dec al ;音轨减一
okk: mov byte ptr cs:track,al call pause ;暂停 cmp cs:ctrl,stop jz exit call play ;播放 exit: pop es pop ds popa
q: cmp cs:mark,1 ;用户事件是否有效 jnz qq popf jmp dword ptr cs:user_dx;转向(模拟)用户鼠标事件 qq: popf retf ;MY 鼠标事件返回
new_33 proc near ;新的鼠标中断 cmp ax,8888h jnz l005 mov ax,'zd' ;是否已驻留 iret ;中断返回
l005: cmp ax,000ch jz l_000 ;设置鼠标事件,转l_000 cmp ax,0 jz mre cmp ax,0021h jnz l001 ;鼠标初始化
mre: mov cs:mark,0 pushf call dword ptr cs:int33_off ;调用原鼠标中断初始化 pusha push es mov ax,cs mov es,ax mov ax,000ch ;0Ch号功能,设置鼠标事件 mov cx,00001010b mov dx,offset my ;指向 MY pushf call dword ptr cs:int33_off;设置本程序鼠标事件 MY pop es popa iret ;中断返回 l001: jmp dword ptr cs:int33_off ;调用其它鼠标功能
l_000: ; mov cs:user_dx,dx mov cs:user_es,es ;保存用户鼠标事件向量 push es push dx push cs pop es mov dx,offset my ;指向 MY mov cs:mark,1 ;设置标志,表示是用户事件 pushf call dword ptr cs:int33_off;设置用户鼠标事件, ;实质是指向本程序事件MY pop dx pop es iret ;中断返回 new_33 endp
init proc near ;初始化,读取CD-AUDIO信息 mov track,1 mov di,offset track_buff mov byte ptr cd_command[0],1ah mov byte ptr cd_command[1],0 mov byte ptr cd_command[2],03 mov byte ptr cd_command[13],00 mov word ptr cd_command[20],0000h mov word ptr cd_command[24],0000h mov word ptr cd_command[22],0000h mov word ptr cd_command[16],es mov word ptr cd_command[14],offset cd_state mov word ptr cd_command[18],0007h mov byte ptr cd_state[0],0ah mov ax,ds mov es,ax mov bx,offset cd_command cd_int ;调用CD服务程序
本文章更多内容:1 - 2 - 3 - 下一页>> |