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

📄 ata_atapi39.inc

📁 TestOS - 带简单GUI的DOS扩展OS// 源代码// ASM// 英文
💻 INC
📖 第 1 页 / 共 3 页
字号:
        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 disk                                          ;
 ;----------------------------------------------------;

Read_disk:
      ;  push  ebx
        call  Small_Delay1
        call  Wait_unit_ready
        call  Small_Delay1
        call  Wait_unit_ready
        
        jc    Unit_not_ready_Read_disk
       ; pop   ebx
        call  Read_disk_packet
        call  Send_Atapi_Packet
        call  Read_atapi_bufferx
        ret

Unit_not_ready_Read_disk:
       ; pop   ebx
       
       ; mov   esi, stringbad
       ; call  print_string
        stc
        ret   

 ;----------------------------------------------------;
 ; Read disk packet                                   ;
 ;----------------------------------------------------;

Read_disk_packet:

       ; call  Clear_atapi_packet
        mov   byte[packet+0],0x28
        mov   ebx,dword[SectorAdress]
        call  Mirror_ebx
        mov   dword[packet+2],ebx
        mov   ax,001
        mov   byte[packet+8],al
        mov   byte[packet+7],ah
        mov   byte[LoByte],48               
        mov   byte[HiByte],20 
        ret  
 ;----------------------------------------------------;
 ; Read disk info                                     ;
 ;----------------------------------------------------;

Read_disk_info:
        mov   ebx,16
        mov   dword[SectorAdress],ebx
        call  Read_disk
        ret

;=======================================================================================

 ;----------------------------------------------------;
 ; Read cd                                            ;
 ;----------------------------------------------------;

Read_cd:
        call  Small_Delay1
        call  Wait_unit_ready
        call  Small_Delay1
        call  Wait_unit_ready

        jc    Unit_not_ready_Rcd
        
        call  Small_Delay1

NextSectorLoop:
        mov   byte[LoopCounter],5

SectorLoop:        
        call  Read_disk_packet
        call  Send_Atapi_Packet
        call  Read_atapi_bufferx
        jnc   Success 

        sub   byte[LoopCounter],1
        cmp   byte[LoopCounter],0
        jne   SectorLoop  
        jmp   Unit_not_ready_Rcd
Success:
        add   dword[SectorAdress],1
        add   dword[LoadAdress],2048
        sub   word[counter],1
        cmp   word[counter],0
        jne   NextSectorLoop
        clc
        ret

Unit_not_ready_Rcd:
        stc
        mov   esi, stringbad
        call  print_string
        ret  
 
;=========================================================================================


 ;----------------------------------------------------;
 ; Read atapi bufferx                                 ;
 ;----------------------------------------------------;

Read_atapi_bufferx:
        pushad                                          ; Save some 32bit regs
        push  es                                        ; Save es
       	mov   ax,sys_data                               ; Move how data base,into ax
        mov   es,ax                                     ; move ax into es
        mov   edi,dword[LoadAdress]         ;0x200000      ;DiskBuffer
        mov   ecx,2048
        xor   al,al
        rep   stosb

        mov   edi,dword[LoadAdress]          ;0x200000      ;DiskBuffer
        mov   dx, 0                                     ; Read date/write = 0  
        add   dx, word[port]                            ; Add the base
        mov   ecx,1024
        cli
Read_atapi_bufferx_loop:
        in    ax,dx
        stosw
        loop  Read_atapi_bufferx_loop
        sti                                       
        mov   dx,0x7                                    ; Read status = 7 
        add   dx,word [port]                            ; Add the base
        mov   cx,0xffff                                 ; Mov cx, number of loops
do_rab_some_loops:  
        in    al,dx                                     ; Mov data from port to al
        test  al,0x80                                   ; Check bit 7(busy bit) ,loop if not 0
        jnz   do_some_loops_loops_rbx                       ; Jump to do_some_loops_loops if al bit7 =1
        test  al,0x1                                    ; Does bit 0 = 0 (error bit)
        jnz   error_read_bufferx                        ; Jump to "error_1" if bit0 is 1
        clc                                             ; Clear the carry flag
        jmp   read_bufferx_ok                           ; Goto ok exit lable
do_some_loops_loops_rbx:                                    ; Lable
        loop  do_rab_some_loops                         ; Loop if cx, not 0
error_read_bufferx:
        stc                                             ; Set the carry flag to 1
read_bufferx_ok:
        pop   es                                        ; Get old es off stack
        popad                                           ; Get some old regs off stack
        ret 

  

 ;----------------------------------------------------;
 ; Get file on cd info                                ;
 ;----------------------------------------------------;

Get_file_on_cd_info:
        
        call  Read_toc
        jc    Toc_error
        
        call  Read_disk_info
        mov   esi,dword[LoadAdress]          ;0x200000           ;DiskBuffer
        mov   ebx,dword[ds:esi+140]
        mov   dword[SectorAdress],ebx
        call  Read_disk
        jc    Toc_error 
        xor   eax,eax
        mov   dword[RootDirSector],eax        
        mov   esi,dword[LoadAdress]       ;0x200000           ;DiskBuffer dword[LoadAdress] 
        xor   ecx,ecx
        mov   ecx,1
GetOtherPathName:

        mov   bl,byte[ds:esi] 
        cmp   bl,0
        je    PathNameDone 
        cmp   bl,1
        jne   NotRootDir
        mov   eax,dword[ds:esi+2]
        mov   dword[RootDirSector],eax        
NotRootDir:

        mov   bl,byte[ds:esi]
        mov   dl,bl
       
        movzx edx,dl
        add   esi,edx
        add   esi,8
        and   edx,1
        add   esi,edx
        jmp   GetOtherPathName     
PathNameDone:
        mov   ebx,dword[RootDirSector]
        mov   dword[SectorAdress],ebx            ;*
        call  Read_disk
        jc    Toc_error

 ;---------------------------------;
 ; Scan for filename               ;
 ;---------------------------------;
        mov   esi,dword[LoadAdress]             ;0x200000            ;DiskBuffer
        xor   ecx,ecx
        mov   ecx,1
GetOtherFileName:
        mov   al,1
        mov   bl,byte[ds:esi]
        cmp   bl,0
        je    Toc_error

        mov   bl,byte[ds:esi]
        mov   dl,bl

        mov   ebx,dword[ds:esi+2]                       ; Data start
        mov   ebx,dword[ds:esi+10]                      ; Bytes

        mov   bl,byte[ds:esi+25]                 
        shr   bl,1
        and   bl,1                                      ; File/Dir
 
        mov   bl,byte[ds:esi+32]                        ; NameLen

        push  es
        mov   ax,sys_data                               ; Move how data base,into ax
        mov   es,ax                                     ; move ax into es
        mov   edi,TmpFileName1
        xor   al,al
        mov   byte[es:edi],al
        push  esi
        push  edi
        push  ecx
        push  edx
        mov   dl,byte[ds:esi+32]
        xor   cl,cl
       
        add   esi,33
CopyMoreTmpName:
        mov   al,byte[ds:esi]
        cmp   al,0
        je    EndOfTmpNameCopy
        cmp   al,1
        je    EndOfTmpNameCopy
        cmp   al,';'
        je    EndOfTmpNameCopy
        
        mov   byte[es:edi],al
        xor   al,al
        mov   byte[es:edi+1],al
        inc   esi
        inc   edi
        inc   cl
        cmp   cl,dl
        jae   EndOfTmpNameCopy
        jmp   CopyMoreTmpName

EndOfTmpNameCopy:
        pop   edx
        pop   ecx
        pop   edi
        pop   esi
        pop   es

        call  Compear_String 
        
        jc    NotThisFile
        
        mov   ebx,dword[ds:esi+2]
        mov   ecx,dword[ds:esi+10]
        mov   dword[SectorAdress],ebx
        mov   dword[FileSizeBytes],ecx
        clc
        jmp   Toc_error1          ;no errors:-)

NotThisFile:
        movzx edx,dl
        add   esi,edx
        and   edx,1
        add   esi,edx

⌨️ 快捷键说明

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