Эксперт
  
Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва
Репутация: нет Всего: 18
|
Читал параметры хард-диска: | Цитата | .286 SectorSize equ 512 HardDiskParams struc Heads db ? Cylinders dw ? Sectors_per_track db ? HardDiskParams ends LogDiskStruc struc DiskNum db ? ; Номер винта FirstHead db ? ; Номер головки начала раздела FirstCylSec dw ? ; Номер сектора и номер цилиндра загрузочного модуля(BOOT) OSystem db ? ; May be 0eh/0ch/0bh - to extended read by 42h - Идентификатор OS LastHead db ? ; Номер головки конца раздела LastCylSec dw ? ; Номер сектора и цилиндра последнего сектора раздела AbsFirstSecNum dd ? ; Младшее и старшее двухбайтовое слово относительного номера начального сектора TotPartSize dd ? ; Младшее и старшее двухбайтовое слово размера раздела в секторах LogDiskStruc ends PartitionTable struc LogDiskStruc1 db size LogDiskStruc dup(?) LogDiskStruc2 db size LogDiskStruc dup(?) LogDiskStruc3 db size LogDiskStruc dup(?) LogDiskStruc4 db size LogDiskStruc dup(?) PartitionTable ends MBR struc Code db 446 dup(?) MBRPartitionTable db size PartitionTable dup(?) Marker dw 0AA55h MBR ends SectorToRead struc Head db ? Road dw ? SectorNumber db ? SectorToRead ends text segment byte public assume cs:text,ds:text org 100h begin: push offset MyHardDiskParams call GetHard80h_Info_by_INT41 push offset MyLogDiskStruc call GetHard80h_Info_by_MBR mov ax,MyLogDiskStruc.LastCylSec push ax and al,00111111b mov byte ptr CurrSect,al pop ax and al,11000000b xchg al,ah shr ah,6 mov dh,MyLogDiskStruc.LastHead push dx and dh,11000000b or ah,dh mov word ptr CurrCyl,ax pop dx and dh,00111111b mov byte ptr CurrHead,dh @@ReadSectors: inc byte ptr CurrSect mov al,CurrSect cmp al,byte ptr MyHardDiskParams.Sectors_per_track jbe @@UseTheseCylHead mov byte ptr CurrSect,1 inc byte ptr CurrHead mov al,byte ptr CurrHead cmp al,byte ptr MyHardDiskParams.Heads jb @@UseTheseCylHead mov byte ptr CurrHead,0 inc word ptr CurrCyl mov ax,word ptr CurrCyl cmp ax,word ptr MyHardDiskParams.Cylinders jae @@Exit @@UseTheseCylHead: mov cl,byte ptr CurrSect mov dh,byte ptr CurrHead mov ax,word ptr CurrCyl mov ch,al mov al,ah shl ah,6 or cl,ah shl al,4 and al,11000000b or dh,al mov ax,0201h mov dl,80h mov bx,offset Sector push ds pop es push offset MySectorToRead call What_Sector int 13h jnc @@SectorValid mov al,ah mov ah,0 mov di,offset SectorNotValid+23 call HexChar mov dx,offset SectorNotValid call @@Message jmp @@Exit @@SectorValid: mov dx,offset SectorDone call @@Message mov ah,1 int 16h jnz @@Exit call Get_CRC cmp word ptr Sector,6DB6h jz @@EmptySector test bx,bx jz @@EmptySector push offset MySectorToRead call Sector_To_Disk @@EmptySector: jmp @@ReadSectors @@Exit: mov ax,4C00h int 21H ; BACK TO DOS NoFreeArea db 'Free Cylinder after OS not exist !',13,10,'$' Get_CRC proc near mov si,offset Sector cld mov cx,SectorSize xor bx,bx @@CRC: lodsb add bl,al adc bh,0 loop @@CRC retn Get_CRC endp Sector_To_Disk proc near push bp mov bp,sp mov si,[bp+4] mov di,offset NumBuff xor ax,ax mov al,[si].Head call DecChar mov ax,[di+3] mov word ptr fname+4,ax mov ax,[si].Road call DecChar mov ax,[di+1] mov word ptr fname+0,ax mov ax,[di+3] mov word ptr fname+2,ax xor ax,ax mov al,[si].SectorNumber call DecChar mov ax,[di+3] mov word ptr fname+6,ax mov ah,3Ch mov dx,offset fname xor cx,cx int 21h jc @@DiskErr mov bx,ax mov ah,40h mov cx,512 mov dx,offset Sector int 21h mov ah,3eh int 21h @@DiskErr: pop bp retn 2 fname db 'RRRRHHSS.sec',0 NumBuff db '?????' Sector_To_Disk endp What_Sector proc near push bp mov bp,sp pusha mov si,[bp+4] xor ax,ax mov al,dh and al,00111111b mov [si].Head,al mov di,offset WhatSect+18 call DecChar mov al,cl and ax,00111111b mov [si].SectorNumber,al mov di,offset WhatSect+45 call DecChar mov ax,cx xchg al,ah shr ah,6 shr dh,4 and dh,00001100b or ah,dh mov [si].Road,ax mov di,offset WhatSect+29 call DecChar mov dx,offset WhatSect call @@Message popa pop bp retn 2 WhatSect db 'Read sector: Head=????? Road=????? SecNumber=?????',13,10,'$' What_Sector endp GetHard80h_Info_by_MBR proc near push bp mov bp,sp mov ax,0201h mov bx,offset Sector push ds pop es mov cx,0001h mov dx,0080h int 13h jnc @@GetParams pop ax pop ax mov dx,offset MbrErr call @@Message jmp @@Exit @@GetParams: add bx,MBRPartitionTable mov cx,4 @@GetActivePart: cmp byte ptr [bx].DiskNum,80h jz @@ActiveFound add bx,size LogDiskStruc loop @@GetActivePart pop ax pop ax mov dx,offset MbrNotActive call @@Message jmp @@Exit @@ActiveFound: mov si,bx mov di,[bp+4] cld mov cx,size LogDiskStruc rep movsb xor ax,ax mov al,[bx].FirstHead mov di,offset MbrInfo2+11 call DecChar mov ax,[bx].FirstCylSec mov di,offset MbrInfo2+30 call HexChar xor ax,ax mov al,[bx].OSystem mov di,offset MbrInfo2+44 call DecChar xor ax,ax mov al,[bx].LastHead mov di,offset MbrInfo3+10 call DecChar mov ax,[bx].LastCylSec mov di,offset MbrInfo3+28 call HexChar mov dx,offset MbrInfo1 call @@Message pop bp retn 2 MbrErr db 'MBR not avaible !',13,10,'$' MbrNotActive db 'Active Part of MBR not exist !',13,10,'$' MbrInfo1 db 'Active Partition Info from MBR:',13,10 MbrInfo2 db 'FirstHead: ????? FirstCylSec: ???? OSystem: ?????',13,10 MbrInfo3 db 'LastHead: ????? LastCylSec: ????',13,10 db '$' GetHard80h_Info_by_MBR endp GetHard80h_Info_by_INT41 proc near push bp mov bp,sp mov si,[bp+4] ; INT 41 - SYSTEM DATA - HARD DISK 0 PARAMETER TABLE ; Notes: the default parameter table array is located at F000h:E401h in 100% ; compatible BIOSes; the pointer may be overridden by the hard disk ; controller's BIOS to support drive formats unknown to the ROM BIOS ; not used by some PS/2 models ; SeeAlso: #2451,INT 13/AH=09h,INT 1E,INT 46"HARD DISK 1",INT 60"Adaptec" ; ; Format of fixed disk parameters: ; Offset Size Description (Table 2451) ; 00h WORD number of cylinders ; 02h BYTE number of heads ; 03h WORD starting reduced write current cylinder (XT only, 0 for others) ; 05h WORD starting write precompensation cylinder number ; 07h BYTE maximum ECC burst length (XT only) ; 08h BYTE control byte (see #2452,#2453) ; 09h BYTE standard timeout (XT only, 0 for others) ; 0Ah BYTE formatting timeout (XT and WD1002 only, 0 for others) ; 0Bh BYTE timeout for checking drive (XT and WD1002 only, 0 for others) ; 0Ch WORD cylinder number of landing zone (AT and later only) ; 0Eh BYTE number of sectors per track (AT and later only) ; 0Fh BYTE reserved HARD_DISK0_PARAMETER_TABLE struc number_of_cylinders dw ? number_of_heads db ? starting_reduced_write_current_cylinder dw ? starting_write_precompensation_cylinder_number dw ? maximum_ECC_burst_length db ? control_byte db ? standard_timeout db ? formatting_timeout db ? timeout_for_checking_drive db ? cylinder_number_of_landing_zone dw ? number_of_sectors_per_track db ? reserved db ? HARD_DISK0_PARAMETER_TABLE ends mov ax,3541h int 21h ; es:bx -> HARD DISK 0 PARAMETER TABLE mov ax,es:[bx].number_of_cylinders mov [si].Cylinders,ax mov di,offset str1+21 call DecChar xor ax,ax mov al,es:[bx].number_of_heads mov [si].Heads,al mov di,offset str2+17 call DecChar mov ax,es:[bx].cylinder_number_of_landing_zone mov di,offset str3+33 call DecChar xor ax,ax mov al,es:[bx].number_of_sectors_per_track mov [si].Sectors_per_track,al mov di,offset str4+29 call DecChar mov dx,offset str1 call @@Message pop bp retn 2 str1 db 'number of cylinders: ?????',13,10 str2 db 'number of heads: ?????',13,10 str3 db 'cylinder number of landing zone: ?????',13,10 str4 db 'number of sectors per track: ?????',13,10 db '$' GetHard80h_Info_by_INT41 endp HexChar proc near pusha mov cx,4 mov bx,offset TabHex @GetHex: rol ax,4 push ax and al,0fh xlat mov [di],al inc di pop ax loop @GetHex popa retn TabHex db '0123456789abcdef' HexChar endp DecChar proc near pusha mov cx,5 mov bx,10000 @GetDec: xor dx,dx div bx add al,'0' mov [di],al inc di push dx xor dx,dx mov ax,bx mov bx,10 div bx mov bx,ax pop ax loop @GetDec popa retn DecChar endp @@Message: mov ah,09h int 21h retn ErrMess db 'Error !','$' SectorNotValid db 'SectorNotValid ! Error ????',13,10,'$' SectorDone db 'Status: complete',13,10,'$' CurrCyl dw ? CurrHead db ? CurrSect db ? MyHardDiskParams HardDiskParams <> MySectorToRead SectorToRead <> MyLogDiskStruc LogDiskStruc <> Sector db SectorSize dup(?) Text Ends end begin
|
--------------------
I don't like the drugs (but the drugs like me). M.Manson.
|