📄 ata_atapi39.inc
字号:
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 + -