| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- .286
- .model small
- .code
- org 100h
- jumps
- include structs.inc
- COUNT = 8
- DRIVE = 'D'
- BOOT32 struc
- _jumps db 3 dup (?)
- OEM db 8 dup (?)
- ExtBPB A_BF_BPB <?>
- bDrvNo db ?
- bt32_res1 db ?
- bExtBootSig db ?
- wSerNo dw ?
- wSerNoHi dw ?
- abVolLabel db 11 dup (?)
- abFileSysCode db 8 dup (?)
- abBootCode db 200h-38-SIZE A_BF_BPB dup (?)
- BOOT32 ends
- start:
- ;{
- push cs ;
- push offset _Boot ; Rec_Buf
- push 1 ; Count
- push 0 ; Sector
- push 0 ; Cyl
- push 0 ; Head
- push DRIVE-'@' ; Drive
- call ReadCyl
- jc error
- xor ax, ax
- mov al, _boot.ExtBPB.A_BF_BPB_SectorsPerCluster
- mov _ClustSize, ax
- mov ax, _boot.ExtBPB.A_BF_BPB_ReservedSectors
- mov bp, ax
- mov _FAT32Beg, ax
- mov ax, _boot.ExtBPB.A_BF_BPB_BigSectorsPerFat
- xor bx, bx
- mov bl, _boot.ExtBPB.A_BF_BPB_NumberOfFATs
- mul bx
- add bp, ax
- adc dx, 0
- mov _DataBeg, bp
- mov _DataBegHi, dx
- ;} Read Extended Boot Sector
- mov ax, 0
- mov dx, 0
- call GetFat32
- jc error
- mov dx, 0
- mov ax, 0ah
- call GetValFromFAT
- push cs
- push offset _buf
- ; push _boot.ExtBPB.A_BF_BPB_RootDirStrtClusHi
- ; push _boot.ExtBPB.A_BF_BPB_RootDirStrtClus
- push 0
- push 0Ah
- push Drive-'@'
- call ReadClust
- mov ah, 3ch
- lea dx, _fname
- mov cx, 0
- int 21h
- mov bx, ax
- mov ah, 40h
- mov cx, 200h*COUNT
- lea dx, _buf
- int 21h
- mov ah, 3eh
- int 21h
- jmp exit
- error:
- mov dl, ah
- mov cl, al
- mov ah, 2
- int 21h
- mov dl, cl
- int 21h
- mov ah, 9
- lea dx, _err
- int 21h
- exit:
- mov ah, 4ch
- int 21h
- ;===================================================================
- ;===================================================================
- ;===================================================================
- ;===================================================================
- ;===================================================================
- ;===================================================================
- GetValFromFat proc near ; AX=Clstr, DX=ClstrHi
- push si
- push di
- mov vl_cls, ax
- mov vl_clshi, dx
- cmp dx, FtBegHi
- jb @NeedRd
- ja @Big
- cmp ax, FtBeg
- jb @NeedRd
- @BIG:
- cmp dx, FtEndHi
- ja @NeedRD
- jb @TblOK
- cmp ax, FtEnd
- jbe @TblOK
- @NeedRd:
- mov ax, vl_cls
- mov dx, vl_clshi
- call GetFAT32
- @TblOK:
- mov ax, vl_cls
- sub ax, ftBeg
- shl ax, 2
- mov bx, ax
- add bx, offset FAT32
- mov ax, [bx]
- mov dx, [bx+2]
- pop di
- pop si
- ret
- vl_cls dw 0
- vl_clshi dw 0
- endp
- ;-----------------------------------------------------
- GetFAT32 proc Near ; AX=Clstr, DX = ClstrHi (Guarantied present)
- push di
- push si
- mov FtBeg, ax
- mov FtBegHi, dx
- mov FtEndHi, dx
- and FtBeg, 1111111110000000b
- xor cx, cx ;
- shr ax, 7 ; Div
- mov cl, dl ; Cluster Num by 128
- shl cl, 1 ; to get sectorNum
- shr dx, 7 ; from begining of FAT32
- or ah, cl ;
- add ax, _FAT32Beg
- adc dx, 0
- push cs
- push offset FAT32
- push 1
- push dx
- push ax
- push Drive-'@'
- call ReadAbsCyl
- mov ax, FtBeg
- mov FtEnd, ax
- add FtEnd, 128
- adc FtEndHi, 0
- pop si
- pop di
- ret
- endp
- ;-------------------------------------------------------------------
- ReadClust proc Near
- push bp
- mov bp, sp
- push si
- push di
- cls_drv equ word ptr [bp+4]
- cls_clstr equ word ptr [bp+6]
- cls_clstrHi equ word ptr [bp+8]
- cls_bufOf equ word ptr [bp+10]
- cls_bufSeg equ word ptr [bp+12]
- mov si, cls_clstrHi
- mov ax, cls_clstr
- sub ax, 2
- sbb si, 0
- mov bx, _ClustSize
- mul bx
- push ax
- mov di, dx
- mov ax, si
- mul bx
- add ax, di
- mov dx, ax
- pop ax
- add ax, _DataBeg
- adc dx, _DataBegHi
- push cls_bufSeg
- push cls_bufof
- push bx
- push dx
- push ax
- push cls_drv
- call ReadAbsCyl
- pop di
- pop si
- pop bp
- ret 10
- endp
- ;-------------------
- ReadAbsCyl proc Near
- push bp
- mov bp, sp
- abs_drv equ word ptr [bp+4]
- abs_cyl equ word ptr [bp+6]
- abs_cylHi equ word ptr [bp+8]
- abs_count equ word ptr [bp+10]
- abs_BufOf equ word ptr [bp+12]
- abs_BufSeg equ word ptr [bp+14]
- push si
- push di
- mov ax, abs_cyl
- mov _NeedRead, ax
- mov ax, abs_cylHi
- mov _NeedReadHi, ax
- mov bx, _Boot.ExtBPB.A_BF_BPB_SectorsPerTrack ;
- mov ax, _Boot.ExtBPB.A_BF_BPB_Heads ; Calc
- mul bx ; Sect per
- mov bx, ax ; Cyl
- mov dx, _NeedReadHi ; Calc
- mov ax, _NeedRead ; Cyl
- div bx ; Number
- mov si, ax ; SI = Cyl Number
- mov ax, dx ; Ostatok
- mov bx, _Boot.ExtBPB.A_BF_BPB_SectorsPerTrack ; Calc
- xor dx, dx ; Head
- div bx ; Number
- mov di, ax ; Head
- push abs_bufSeg
- push abs_bufOf
- push abs_count
- push dx
- push si
- push di
- push abs_drv
- call ReadCyl
- pop di
- pop si
- pop bp
- ret 12
- _NeedRead dw 0
- _NeedReadHi dw 0
- endp
- ;=======================
- ReadCyl PROC near
- push bp
- mov bp,sp
- par_Drive equ word ptr [bp+4]
- push cs
- pop es
- mov ax, ss
- mov ds, ax
- mov di, offset _rb+1
- lea si, [bp+6]
- mov cx, 6
- repe movsw
- mov bx, par_Drive ;See below
- mov ch, 48h ;See below
- mov cl, 61h ;Read track on logical drive
- mov dx, offset _RB ;ds:dx points to RWBLOCK structure
- mov ax, 440Dh ;IOCTL for block device
- int 21h
- pop bp
- ret 14
- _RB RWBLOCK <?>
- endp
- ;
- ;-------------------------------------
- ; Global Varicables
- ;-------------------------------------
- ;
- FtBeg dw ?
- FtBegHi dw ?
- FtEnd dw ?
- FtEndHi dw ?
- _FAT32Beg dw ?
- _DataBeg dw ?
- _DataBegHi dw ?
- _ClustSize dw ?
- _err db 'Error',10,13,'$'
- _fname db 'RF2.dat',0
- FAT32 dd 128 dup (?)
- _Boot BOOT32 <?>
- _buf db 200h*COUNT dup (?)
- end start
|