⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ata_atapi38.inc

📁 TestOS - 带简单GUI的DOS扩展OS// 源代码// ASM// 英文
💻 INC
📖 第 1 页 / 共 2 页
字号:
        call  print_string
        ret   
;******************************************************************
Play_cdog:
        call  Small_Delay1
        call  Wait_unit_ready
        call  Small_Delay1
        call  Wait_unit_ready
        jc    Unit_not_ready_playdog
        call  Clear_atapi_packet
        push  ebx
        mov   ebx,dword[track_start]
        call  Mirror_ebx
        mov   dword[packet+2],ebx
        pop   ebx
        mov   eax,dword[track_length]
        mov   byte[packet+8],al
        mov   byte[packet+7],ah
        mov   byte[packet+0],0x45
        call  Send_Atapi_Packet
        mov   esi, stringood
        call  print_string
        ret

Unit_not_ready_playdog:
        mov   esi, stringbad
        call  print_string
        ret   

;******************************************************************
        

 ;----------------------------------------------------;
 ; Read toc                                           ;
 ;----------------------------------------------------;

Read_toc:
        call  Small_Delay1
        call  Wait_unit_ready
        call  Small_Delay1
        call  Wait_unit_ready
        pushad
        jc    Unit_not_ready_a
        
        call  Small_Delay1
        call  Clear_atapi_packet
        mov   ax,804 
        mov   byte[packet+8],al
        mov   byte[packet+7],ah 
        mov   byte[packet+0],0x43       
        call  Send_Atapi_Packet
        jc    Unit_not_ready_a
        call  Read_write_toc
        jc    Unit_not_ready_a
Unit_is_ready_a:
        popad
        mov   esi, stringood
        call  print_string
        ret
        
Unit_not_ready_a:
        popad
        mov   esi, stringbad
        call  print_string
        ret   


 ;----------------------------------------------------;
 ; Get track info                                     ;
 ;----------------------------------------------------; 

Get_track_info: 
        call  Read_toc
        jc    Read_toc_error
        call  Small_Delay1
        pushad
        xor   edx,edx
        mov   esi,TOC_Data_Buffer
        add   esi,3
        lodsb
        inc   al
        mov   cl,al
        movzx ecx,cl
        mov   esi,TOC_Data_Buffer
        add   esi,4
Gettrackinfo:
        push  ecx
        inc   edx
        mov   bl,byte[ds:esi+2]
        cmp   bl,byte[track_num]
        jne   NoNotThisTrack
        
        mov   ebx,dword[ds:esi+4]
        call  Mirror_ebx 
        mov   dword[track_start],ebx
        
        mov   ebx,dword[ds:esi+4+8]
        call  Mirror_ebx
        mov   eax,dword[track_start]
        sub   ebx,eax
        and   ebx,0xffff
        mov   dword[track_length],ebx
        mov   bl,byte[ds:esi+1]
        and   bl,0x0f
        and   bl,4
        shr   bl,2
        mov   byte[track_type],bl
        
NoNotThisTrack:
        add   esi,8
        pop   ecx
        dec   ecx
        cmp   ecx,0
        jne   Gettrackinfo
        popad
        clc
        ret

Read_toc_error:
        stc
        ret     

 ;----------------------------------------------------;
 ; Clear atapi packet                                 ;
 ;----------------------------------------------------;

Clear_atapi_packet:
       
        pushad
        mov   byte[packet+0],0x00
        mov   byte[packet+1],0x00
        mov   byte[packet+2],0x00
        mov   byte[packet+3],0x00
        mov   byte[packet+4],0x00
        mov   byte[packet+5],0x00
        mov   byte[packet+6],0x00
        mov   byte[packet+7],0x00
        mov   byte[packet+8],0x00
        mov   byte[packet+9],0x00
        mov   byte[packet+10],0x00
        mov   byte[packet+11],0x00
        popad
        ret

 ;----------------------------------------------------;
 ; Stop cd                                            ;
 ;----------------------------------------------------;

Stop_cd:
        push  edi
        call  Clear_atapi_packet
        mov   byte[packet+4],0x0
        mov   byte[packet+1],0x1
        mov   byte[packet+0],0x1b
        call  Send_Atapi_Packet
        pop   edi
        ret   

 ;----------------------------------------------------;
 ; Pause cd                                           ;
 ;----------------------------------------------------;

Pause_cd:
        push  edi
        call  Clear_atapi_packet
        mov   byte[packet+8],0x0               
        mov   byte[packet+0],0x4b
        call  Send_Atapi_Packet
        pop   edi
        ret   

 ;----------------------------------------------------;
 ; Start cd                                           ;
 ;----------------------------------------------------;

Start_cd:
        push  edi

        call  Clear_atapi_packet
        
        mov   byte[packet+4],0x1
        mov   byte[packet+1],0x1
        mov   byte[packet+0],0x1b
                
        call  Send_Atapi_Packet

        pop   edi

        ret   


 ;----------------------------------------------------;
 ; Eject cd                                           ;
 ;----------------------------------------------------;

Eject_cd:
        push  edi
        pushad
        call  Clear_atapi_packet
        mov   byte[packet+4],0x2
        mov   byte[packet+1],0x1
        mov   byte[packet+0],0x1b
        call  Send_Atapi_Packet
        popad
        pop   edi
        ret   

 ;----------------------------------------------------;
 ; Close cd                                           ;
 ;----------------------------------------------------;

Close_cd:
        push  edi
        pushad
        call  Clear_atapi_packet
        mov   byte[packet+0],0x1b 
        mov   byte[packet+1],0x1
        mov   byte[packet+4],0x3
        call  Send_Atapi_Packet
        popad
        pop   edi
        ret 
 ;----------------------------------------------------;
 ; Small Delay                                        ;
 ;----------------------------------------------------;

Small_Delay1:
        push  cx
        mov   cx,0xffff
BusyDelay3a11:                                  
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        loop  BusyDelay3a11
        pop   cx
        ret  

 ;----------------------------------------------------;
 ; Mirror ebx                                         ;
 ;----------------------------------------------------;
  
Mirror_ebx:
        push  edi
        push  es
        mov   ax,sys_data                               ; Move how data base,into ax
        mov   es,ax                                     ; move ax into es
        mov   edi,Ebx_buffer
        mov   byte[es:edi+3],bl
        shr   ebx,8
        mov   byte[es:edi+2],bl
        shr   ebx,8
        mov   byte[es:edi+1],bl
        shr   ebx,8
        mov   byte[es:edi+0],bl
        mov   ebx,dword[Ebx_buffer]
        pop   es
        pop   edi
        ret

 ;--------------------------------------------------------------------------------------------;
 ;                                           Data                                             ;
 ;--------------------------------------------------------------------------------------------;
track_type:     db 0
track_num:      db 0
track_start:    dd 0
track_length:   dd 0
Ebx_buffer:     dd 0
testebx_buffer: dd 0

packet:
		db 0x0                     
		db 0x0                    
		db 0x0                     
		db 0x0                     
                db 0x0                    
		db 0x0                     
		db 0x0
		db 0x0                             
		db 0x0                 
		db 0x0        
		db 0x0
		db 0x0

                                     
TOC_Data_Buffer:
                rb 806                               


 ;--------------------------------------------------------------------------------------------;
 ;                                     The end for now!                                       ;
 ;--------------------------------------------------------------------------------------------;
              

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -