1257 lines
24 KiB
NASM
1257 lines
24 KiB
NASM
model tiny,stdcall
|
||
p486
|
||
locals
|
||
jumps
|
||
codeseg
|
||
option procalign:byte
|
||
|
||
include "..\include\mem.h"
|
||
include "..\include\fat.h"
|
||
|
||
org 0h
|
||
|
||
header exe <"CE",1,0,0,offset exports,offset imports,,>
|
||
|
||
|
||
exporting
|
||
declare readsector
|
||
declare writesector
|
||
declare verifysector
|
||
declare initdrive
|
||
declare loadfile
|
||
declare compressrle
|
||
declare decompressrle
|
||
declare findfirstfile
|
||
declare findnextfile
|
||
declare getfreespace
|
||
declare searchfile
|
||
declare getname
|
||
declare getserial
|
||
declare changedir
|
||
declare readcluster
|
||
declare writecluster
|
||
declare getdir
|
||
declare projfile
|
||
declare execfile
|
||
declare getbuffer
|
||
declare setbuffer
|
||
ende
|
||
|
||
importing
|
||
use SYSTEME,biosprint
|
||
use SYSTEME,biosprinth
|
||
use SYSTEME,mbfindsb
|
||
use SYSTEME,mbfree
|
||
use SYSTEME,mbcreate
|
||
use SYSTEME,mbresident
|
||
use SYSTEME,mbfind
|
||
use SYSTEME,mbchown
|
||
use SYSTEME,mbloadfuncs
|
||
use SYSTEME,mbloadsection
|
||
endi
|
||
|
||
|
||
;DPT disquette
|
||
mydpt dpt <>
|
||
|
||
;Secteur de boot
|
||
myboot bootinfo <>
|
||
|
||
;Parametres
|
||
support db 0
|
||
nbbuffer db 0
|
||
|
||
;Données Calculée
|
||
clustersize dw 0
|
||
tracksperhead dw 0
|
||
drivesize dd 0
|
||
adressboot dw 0
|
||
adressfat dw 0
|
||
adressparent dw 0
|
||
adressdirectory dw 0
|
||
adressdata dw 0
|
||
addingvalue dw 0
|
||
currentdir dw 0 ;En cluster
|
||
currentdirstr db 128 dup (0)
|
||
|
||
|
||
PROC getfat near
|
||
uses ax,bx,dx,si,ds,es
|
||
push cs
|
||
pop ds
|
||
|
||
push cs
|
||
pop es
|
||
call [cs:mbfindsb],offset datafat,cs
|
||
mov es,ax
|
||
mov ax,cx
|
||
mov bx,ax
|
||
and bx,0000000000000001b
|
||
shr ax,1
|
||
mov cx,3
|
||
mul cx
|
||
;mov si,offset fatter
|
||
xor si,si
|
||
add si,ax
|
||
cmp bx,0h
|
||
jnz evenfat
|
||
oddfat:
|
||
mov ax,[es:si]
|
||
and ax,0FFFh
|
||
mov cx,ax
|
||
jmp endfat
|
||
evenfat:
|
||
mov ax,[es:si+1]
|
||
and ax,0FFF0h
|
||
shr ax,4
|
||
mov cx,ax
|
||
endfat:
|
||
cmp ax,0FF0h
|
||
jbe nocarry
|
||
stc
|
||
ret
|
||
nocarry:
|
||
clc
|
||
ret
|
||
endp getfat
|
||
|
||
;============loadfile===============
|
||
;Charge le fichier ds:%0 en ds:%1 ->ax taille
|
||
;-> AH=4
|
||
;<- Flag Carry si erreur
|
||
;=====================================================
|
||
PROC loadfile FAR
|
||
ARG @name:word,@pointer:word
|
||
LOCAL @@temp:word:48
|
||
USES cx,si,di,ds,es
|
||
push ss
|
||
pop es
|
||
lea di,[@@temp]
|
||
push ds di
|
||
mov si,[@name]
|
||
mov cx,48/4
|
||
cld
|
||
rep movsd
|
||
push ss
|
||
pop ds
|
||
pop di es
|
||
call searchfile,di
|
||
jne errorload
|
||
jc errorload
|
||
mov cx,[(find di).result.filegroup]
|
||
mov eax,[(find di).result.filesize]
|
||
push es
|
||
pop ds
|
||
call loadway,cx,eax,[@pointer]
|
||
jc errorload
|
||
clc
|
||
ret
|
||
errorload:
|
||
stc
|
||
xor eax,eax
|
||
ret
|
||
endp loadfile
|
||
|
||
;============execfile (Fonction 18)===============
|
||
;Execute le fichier ds:si
|
||
;-> AH=18
|
||
;<- Flag Carry si erreur
|
||
;=====================================================
|
||
PROC execfile FAR
|
||
ARG @file:word
|
||
pushad
|
||
push ds es fs gs
|
||
mov di,[@file]
|
||
call uppercase,di
|
||
call projfile,di
|
||
jc @@reallyerrornoblock
|
||
call [cs:mbfind],di
|
||
jc @@reallyerror
|
||
call [cs:mbchown],ax,[word ptr ss:bp+4]
|
||
jc @@reallyerror
|
||
push ax
|
||
pop ds
|
||
cmp [word ptr ds:0x0],'EC'
|
||
jne @@reallyerror
|
||
push ax
|
||
push cs
|
||
push offset @@arrive
|
||
push ds
|
||
push [word ptr (exe).starting]
|
||
push ds
|
||
push ds
|
||
push ds
|
||
pop es
|
||
pop fs
|
||
pop gs
|
||
push 7202h
|
||
xor eax,eax
|
||
xor ebx,ebx
|
||
xor ecx,ecx
|
||
xor edx,edx
|
||
xor esi,esi
|
||
xor edi,edi
|
||
xor ebp,ebp
|
||
popf
|
||
sti
|
||
db 0CBh
|
||
@@arrive:
|
||
;cli
|
||
;pop ax
|
||
;call [cs:mbfree],ax
|
||
call [cs:mbfree]
|
||
pop gs fs es ds
|
||
popad
|
||
clc
|
||
ret
|
||
@@reallyerror:
|
||
call [cs:mbfree],ax
|
||
@@reallyerrornoblock:
|
||
pop gs fs es ds
|
||
popad
|
||
stc
|
||
ret
|
||
endp execfile
|
||
|
||
;============projfile (Fonction 17)===============
|
||
;Charge le fichier ds:%0 sur un bloc mémoire -> eax taille
|
||
;-> eax taille fichier
|
||
;<- Flag Carry si erreur
|
||
;=====================================================
|
||
PROC projfile FAR
|
||
ARG @pointer:word
|
||
LOCAL @@temp:word:64
|
||
USES cx,si,di,ds,es
|
||
push ss
|
||
pop es
|
||
lea di,[@@temp]
|
||
push di
|
||
mov si,[@pointer]
|
||
mov cx,64/4
|
||
cld
|
||
rep movsd
|
||
push ss
|
||
pop ds
|
||
pop di
|
||
pushad
|
||
call [cs:biosprint],di
|
||
popad
|
||
call uppercase,di
|
||
call [cs:mbfind],di
|
||
jnc @@notace
|
||
call searchfile,di
|
||
jne @@errorload
|
||
jc @@errorload
|
||
mov eax,[es:(find di).result.filesize]
|
||
call [cs:mbcreate],di,ax
|
||
jc @@errorload
|
||
call [cs:mbchown],ax,[word ptr ss:bp+4]
|
||
jc @@errorload
|
||
mov ds,ax
|
||
mov cx,[es:(find di).result.filegroup]
|
||
mov eax,[es:(find di).result.filesize]
|
||
call loadway,cx,eax,0
|
||
jc @@errorload
|
||
cmp [word ptr ds:0x0],'EC'
|
||
jne @@notace
|
||
call [cs:mbloadfuncs],ds
|
||
jc @@errorload
|
||
call [cs:mbloadsection],ds
|
||
jc @@errorload
|
||
@@notace:
|
||
clc
|
||
ret
|
||
@@errorload:
|
||
xor eax,eax
|
||
stc
|
||
ret
|
||
endp projfile
|
||
|
||
|
||
;=============SearchFile===============
|
||
;Renvois dans ds:%0 et non equal si pas existant
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;======================================
|
||
PROC searchfile FAR
|
||
ARG @pointer:word
|
||
USES bx,cx,si,di,ds,es
|
||
mov si,[@pointer]
|
||
lea bx,[es:(find si).result]
|
||
call uppercase,si
|
||
call findfirstfile,si
|
||
jc @@errorsearch
|
||
jmp @@founded
|
||
@@nextsearch:
|
||
call findnextfile,si
|
||
jc @@errorsearch
|
||
@@founded:
|
||
cmp [byte ptr bx],0
|
||
je @@notgood
|
||
cmp [byte ptr bx+entries.fileattr],0Fh
|
||
je @@nextsearch
|
||
call cmpnames,si,bx
|
||
jc @@nextsearch
|
||
@@okfound:
|
||
clc
|
||
ret
|
||
@@notgood:
|
||
cmp si,0FF5h
|
||
ret
|
||
@@errorsearch:
|
||
stc
|
||
ret
|
||
endp searchfile
|
||
|
||
;Transforme la chaine ds:%0 en maj
|
||
PROC uppercase FAR
|
||
ARG @strs:word
|
||
USES si,ax
|
||
mov si,[@strs]
|
||
@@uppercaser:
|
||
mov al,[si]
|
||
cmp al,0
|
||
je @@enduppercase
|
||
cmp al,'a'
|
||
jb @@nonmaj
|
||
cmp al,'z'
|
||
ja @@nonmaj
|
||
sub al,'a'-'A'
|
||
mov [si],al
|
||
@@nonmaj:
|
||
inc si
|
||
jmp @@uppercaser
|
||
@@enduppercase:
|
||
clc
|
||
ret
|
||
endp uppercase
|
||
|
||
;Compare le nom ds:%0 '.' avec ds:%1
|
||
PROC cmpnames FAR
|
||
ARG @off1:word,@off2:word
|
||
USES ax,cx,si,di,es
|
||
mov si,[@off1]
|
||
mov di,[@off2]
|
||
cmp [byte ptr si],"."
|
||
jne @@notaredir
|
||
cmp [word ptr si],".."
|
||
jne @@onlyonedir
|
||
cmp [word ptr di],".."
|
||
je @@itok
|
||
jmp @@notequal
|
||
@@onlyonedir:
|
||
cmp [word ptr di]," ."
|
||
je @@itok
|
||
@@notaredir:
|
||
push ds
|
||
pop es
|
||
mov cx,8
|
||
repe cmpsb
|
||
jne @@nequal
|
||
inc si
|
||
jmp @@equal
|
||
@@nequal:
|
||
cmp [byte ptr es:di-1],' '
|
||
jne @@notequal
|
||
@@equal:
|
||
cmp [byte ptr si-1],'.'
|
||
jne @@trynoext
|
||
mov al,' '
|
||
rep scasb
|
||
mov cx,3
|
||
rep cmpsb
|
||
jne @@nequal2
|
||
inc si
|
||
jmp @@equal2
|
||
@@nequal2:
|
||
cmp [byte ptr es:di-1],' '
|
||
jne @@notequal
|
||
@@equal2:
|
||
cmp [byte ptr si-1],0
|
||
jne @@notequal
|
||
@@itok:
|
||
clc
|
||
ret
|
||
@@notequal:
|
||
stc
|
||
ret
|
||
@@trynoext:
|
||
cmp [byte ptr si-1],0
|
||
jne @@notequal
|
||
jmp @@itok
|
||
endp cmpnames
|
||
|
||
;charge le fichier de de groupe %0 et de taille %1
|
||
PROC loadway NEAR
|
||
ARG @sector:word,@size:dword,@offset:word
|
||
USES eax,bx,cx,dx,si,di,ds,es
|
||
push ds
|
||
pop es
|
||
mov eax,[@size]
|
||
cmp eax,0
|
||
je @@zeroload
|
||
rol eax,16
|
||
mov dx,ax
|
||
ror eax,16
|
||
div [cs:clustersize]
|
||
mov bx,ax
|
||
mov cx,[@sector]
|
||
mov di,[@offset]
|
||
cmp bx,1
|
||
jb @@adjustlast
|
||
@@loadfat:
|
||
call readcluster,cx,di
|
||
jc @@noway
|
||
add di,[cs:clustersize]
|
||
call getfat
|
||
dec bx
|
||
jnz @@loadfat
|
||
@@adjustlast:
|
||
cmp dx,0
|
||
je @@zeroload
|
||
push cs
|
||
pop ds
|
||
mov si,offset bufferread
|
||
call readcluster,cx,si
|
||
jc @@noway
|
||
mov cx,dx
|
||
cld
|
||
rep movsb
|
||
@@zeroload:
|
||
clc
|
||
ret
|
||
@@noway:
|
||
stc
|
||
ret
|
||
endp loadway
|
||
|
||
;=============INITDRIVE===============
|
||
;Initialise le lecteur pour une utilisation ultérieure
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;=====================================
|
||
PROC initdrive FAR
|
||
USES eax,bx,cx,edx,si,di,ds,es
|
||
push cs
|
||
pop ds
|
||
push cs
|
||
pop es
|
||
mov di,3
|
||
@@againtry:
|
||
xor ax,ax
|
||
mov dl,[support]
|
||
xor dh,dh
|
||
int 13h
|
||
mov bx,offset bufferread
|
||
mov ax,0201h
|
||
mov cx,0001h
|
||
mov dl,[support]
|
||
xor dh,dh
|
||
int 13h
|
||
jnc @@oknoagaintry
|
||
dec di
|
||
jnz @@againtry
|
||
@@oknoagaintry:
|
||
mov si,offset bufferread+3
|
||
mov di,offset myboot
|
||
mov cx,size myboot
|
||
cld
|
||
rep movsb
|
||
mov ax,[myboot.sectorsize]
|
||
mov bl,[myboot.sectorspercluster]
|
||
xor bh,bh
|
||
mul bx
|
||
mov [clustersize],ax
|
||
mov bx,[myboot.hiddensectorsl]
|
||
adc bx,[myboot.hiddensectorsh]
|
||
mov [adressboot],bx
|
||
add bx,[myboot.reservedsectors]
|
||
mov [adressfat],bx
|
||
xor ax,ax
|
||
mov al,[myboot.fatsperdrive]
|
||
mul [myboot.sectorsperfat]
|
||
add bx,ax
|
||
mov [adressparent],bx
|
||
mov [adressdirectory],bx
|
||
mov ax,32
|
||
mul [myboot.directorysize]
|
||
div [myboot.sectorsize]
|
||
add bx,ax
|
||
mov [adressdata],bx
|
||
sub bx,2
|
||
mov [addingvalue],bx
|
||
mov ax,[myboot.sectorsperdrive]
|
||
div [myboot.sectorspertrack]
|
||
xor dx,dx
|
||
div [myboot.headsperdrive]
|
||
mov [tracksperhead],ax
|
||
xor eax,eax
|
||
mov ax,[myboot.sectorsperdrive]
|
||
sub ax,[adressdata]
|
||
mul [myboot.sectorsize]
|
||
shl edx,16
|
||
add edx,eax
|
||
mov [drivesize],edx
|
||
mov [currentdir],0
|
||
mov [adressdirectory],0
|
||
mov [currentdirstr],0
|
||
xor eax,eax
|
||
mov ax,[buffer.size]
|
||
mul [myboot.sectorsize]
|
||
call [cs:mbfindsb],offset databuffer,cs
|
||
jnc @@hadabufferblock
|
||
call [cs:mbcreate],offset databuffer,ax
|
||
jc @@errorinit
|
||
call [cs:mbresident],ax
|
||
jc @@errorinit
|
||
call [cs:mbchown],ax,cs
|
||
jc @@errorinit
|
||
@@hadabufferblock:
|
||
mov [buffer.current],0FFFFh
|
||
mov ax,0FFFFh
|
||
mov cx,[buffer.size]
|
||
mov di,offset buffer.chain
|
||
cld
|
||
rep stosw
|
||
xor eax,eax
|
||
mov ax,[myboot.sectorsperfat]
|
||
mul [myboot.sectorsize]
|
||
call [cs:mbfindsb],offset datafat,cs
|
||
jnc @@hadafatbloc
|
||
call [cs:mbcreate],offset datafat,ax
|
||
jc @@errorinit
|
||
call [cs:mbresident],ax
|
||
jc @@errorinit
|
||
call [cs:mbchown],ax,cs
|
||
jc @@errorinit
|
||
@@hadafatbloc:
|
||
mov dx,[myboot.sectorsperfat]
|
||
mov cx,[adressfat]
|
||
xor di,di
|
||
;mov di,offset fatter
|
||
mov ds,ax
|
||
@@seefat:
|
||
call readsector,cx,di
|
||
jc @@errorinit
|
||
add di,[cs:myboot.sectorsize]
|
||
inc cx
|
||
dec dx
|
||
jnz @@seefat
|
||
clc
|
||
ret
|
||
@@errorinit:
|
||
stc
|
||
ret
|
||
endp initdrive
|
||
|
||
datafat db '/fat',0
|
||
databuffer db '/buffer',0
|
||
|
||
buffer diskbuffer <>
|
||
|
||
;=============FindFirstFile==============
|
||
;Renvois dans DS:%1 un bloc d'info
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;========================================
|
||
PROC findfirstfile FAR
|
||
ARG @pointer:word
|
||
USES cx,si
|
||
mov si,[@pointer]
|
||
mov cx,[cs:currentdir]
|
||
mov [(find si).adressdirectory],cx
|
||
xor cx,cx
|
||
mov [(find si).entryplace],cx
|
||
mov [(find si).firstsearch],1
|
||
call findnextfile,[@pointer]
|
||
ret
|
||
endp findfirstfile
|
||
|
||
;=============FindnextFile==============
|
||
;Renvois dans DS:%0 un bloc d'info
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;=======================================
|
||
PROC findnextfile FAR
|
||
ARG @pointer:word
|
||
USES ax,bx,cx,di,si,ds,es
|
||
push cs
|
||
push ds
|
||
pop es
|
||
pop ds
|
||
mov si,[@pointer]
|
||
mov cx,[es:(find si).adressdirectory]
|
||
mov bx,[es:(find si).entryplace]
|
||
@@findnextfileagain:
|
||
cmp [es:(find si).firstsearch],1
|
||
je @@first
|
||
add bx,size entries
|
||
cmp bx,[cs:clustersize]
|
||
jb @@nopop
|
||
@@first:
|
||
mov di,offset bufferentry
|
||
mov bx,0
|
||
cmp [cs:currentdir],0
|
||
jne @@notrootdir
|
||
cmp [es:(find si).firstsearch],1
|
||
je @@noaddfirst1
|
||
inc cx
|
||
@@noaddfirst1:
|
||
add cx,[cs:adressparent]
|
||
mov al,[cs:myboot.sectorspercluster]
|
||
@@readroot:
|
||
call readsector,cx,di
|
||
jc @@notwell
|
||
add di,[cs:myboot.sectorsize]
|
||
dec al
|
||
jnz @@readroot
|
||
sub cx,[cs:adressparent]
|
||
jmp @@nopop
|
||
@@notrootdir:
|
||
cmp [es:(find si).firstsearch],1
|
||
je @@noaddfirst2
|
||
call getfat
|
||
@@noaddfirst2:
|
||
jc @@notwell
|
||
call readcluster,cx,di
|
||
jc @@notwell
|
||
@@nopop:
|
||
mov [es:(find si).firstsearch],0
|
||
mov di,offset bufferentry
|
||
add di,bx
|
||
cmp [byte ptr di],0
|
||
je @@notwell
|
||
mov [es:(find si).entryplace],bx
|
||
mov [es:(find si).adressdirectory],cx
|
||
cmp [byte ptr di],0E5h
|
||
je @@findnextfileagain
|
||
cmp [byte ptr di+entries.fileattr],28h
|
||
je @@findnextfileagain
|
||
cmp [byte ptr di+entries.fileattr],0Fh
|
||
je @@findnextfileagain
|
||
mov si,di
|
||
mov di,[@pointer]
|
||
lea di,[es:(find di).result]
|
||
mov cx,size entries
|
||
cld
|
||
rep movsb
|
||
clc
|
||
ret
|
||
@@notwell:
|
||
stc
|
||
ret
|
||
endp findnextfile
|
||
|
||
;=============GetFreeSpace===============
|
||
;Renvoie en EDX l'espace disque libre du volume
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;========================================
|
||
PROC getfreespace FAR
|
||
USES eax,bx
|
||
xor eax,eax
|
||
call getsector
|
||
mul [cs:myboot.sectorsize]
|
||
shl edx,16
|
||
add edx,eax
|
||
pop eax
|
||
ret
|
||
endp getfreespace
|
||
|
||
;ax=défectueux bx=libre
|
||
getsector:
|
||
push cx dx
|
||
mov dx,[cs:myboot.sectorsperdrive]
|
||
sub dx,[cs:addingvalue]
|
||
xor ax,ax
|
||
xor bx,bx
|
||
mov cx,0
|
||
goget:
|
||
push cx
|
||
call getfat
|
||
cmp cx,0FF7h
|
||
jne notdefect
|
||
inc bx
|
||
notdefect:
|
||
cmp cx,0
|
||
jne notfree
|
||
inc ax
|
||
notfree:
|
||
pop cx
|
||
inc cx
|
||
dec dx
|
||
jnz goget
|
||
pop dx cx
|
||
ret
|
||
errorfree:
|
||
stc
|
||
pop dx cx
|
||
ret
|
||
|
||
|
||
;=============READCLUSTER===============
|
||
;Lit le secteur %0 et le met en ds:%1
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;=======================================
|
||
PROC readcluster FAR
|
||
ARG @sector:word,@pointer:word
|
||
USES ax,bx,dx,si
|
||
mov al,[cs:myboot.sectorspercluster]
|
||
xor ah,ah
|
||
mov bx,ax
|
||
mul [@sector]
|
||
add ax,[cs:addingvalue]
|
||
mov si,[@pointer]
|
||
@@readsectors:
|
||
call readsector,ax,si
|
||
jc @@errorreadincluster
|
||
add si,[cs:myboot.sectorsize]
|
||
inc ax
|
||
dec bx
|
||
jnz @@readsectors
|
||
clc
|
||
ret
|
||
@@errorreadincluster:
|
||
stc
|
||
ret
|
||
endp readcluster
|
||
|
||
;=============WRITECLUSTER===============
|
||
;Ecrit le cluster %0 et le met en ds:%1
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;=====================================================
|
||
PROC writecluster FAR
|
||
ARG @sector:word,@pointer:word
|
||
USES ax,bx,dx,si
|
||
mov al,[cs:myboot.sectorspercluster]
|
||
xor ah,ah
|
||
mov bx,ax
|
||
mul [@sector]
|
||
add ax,[cs:addingvalue]
|
||
mov si,[@pointer]
|
||
@@writesectors:
|
||
call writesector,ax,si
|
||
jc @@errorwriteincluster
|
||
add si,[cs:myboot.sectorsize]
|
||
inc ax
|
||
dec bx
|
||
jnz @@writesectors
|
||
clc
|
||
ret
|
||
@@errorwriteincluster:
|
||
stc
|
||
ret
|
||
endp writecluster
|
||
|
||
|
||
;=============READSECTOR===============
|
||
;Lit le secteur %0 et le met en ds:%1
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;======================================
|
||
PROC readsector FAR
|
||
ARG @sector:word,@pointer:word
|
||
USES ax,bx,cx,dx,si,di,ds,es
|
||
LOCAL @tempsec
|
||
push ds
|
||
push cs
|
||
pop ds
|
||
call [cs:mbfindsb],offset databuffer,cs
|
||
pop ds
|
||
mov es,ax
|
||
jc @@error
|
||
mov si,offset buffer.chain
|
||
xor cx,cx
|
||
mov ax,[@sector]
|
||
mov bx,0FFFFh
|
||
@@searchbuffer:
|
||
cmp [cs:si],ax
|
||
je @@preprepcopy
|
||
cmp [word ptr cs:si],0FFFEh
|
||
jne @@notfree
|
||
mov bx,cx
|
||
@@notfree:
|
||
cmp [word ptr cs:si],0FFFFh
|
||
je @@theend
|
||
inc si
|
||
inc si
|
||
inc cx
|
||
cmp cx,[cs:buffer.size]
|
||
jb @@searchbuffer
|
||
@@theend:
|
||
cmp bx,0FFFFh
|
||
jnz @@prepread
|
||
cmp cx,[cs:buffer.size]
|
||
jb @@read
|
||
mov cx,[cs:buffer.current]
|
||
@@searchnext:
|
||
inc cx
|
||
cmp cx,[cs:buffer.size]
|
||
jb @@read
|
||
xor cx,cx
|
||
jmp @@read
|
||
@@prepread:
|
||
mov cx,bx
|
||
@@read:
|
||
mov [cs:buffer.current],cx
|
||
mov [@tempsec],cx
|
||
mov ax,[cs:myboot.sectorsize]
|
||
mul cx
|
||
mov di,ax
|
||
mov ax,[@sector]
|
||
xor dx,dx
|
||
div [cs:myboot.sectorspertrack]
|
||
inc dl
|
||
mov bl,dl
|
||
xor dx,dx
|
||
div [cs:myboot.headsperdrive]
|
||
mov dh,[cs:support]
|
||
xchg dl,dh
|
||
mov cx,ax
|
||
xchg cl,ch
|
||
shl cl,6
|
||
or cl,bl
|
||
mov bx,di
|
||
mov si,3
|
||
@@tryagain:
|
||
mov ax,0201h
|
||
int 13h
|
||
jnc @@prepcopy
|
||
dec si
|
||
jnz @@tryagain
|
||
mov bx,[@tempsec]
|
||
shl bx,1
|
||
mov [word ptr bx+offset buffer.chain],0FFFEh
|
||
@@error:
|
||
stc
|
||
ret
|
||
@@preprepcopy:
|
||
mov [@tempsec],cx
|
||
@@prepcopy:
|
||
mov bx,[@tempsec]
|
||
mov ax,[@tempsec]
|
||
mov cx,[@sector]
|
||
shl bx,1
|
||
mov [cs:bx+offset buffer.chain],cx
|
||
mov cx,[cs:myboot.sectorsize]
|
||
mul cx
|
||
mov di,ax
|
||
@@copy:
|
||
push ds
|
||
push es
|
||
pop ds
|
||
pop es
|
||
mov si,di
|
||
mov di,[@pointer]
|
||
cld
|
||
rep movsb
|
||
@@done:
|
||
ret
|
||
endp readsector
|
||
|
||
;=============SETBUFFER============
|
||
;change la taille des buffers a %0
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;====================================
|
||
PROC setbuffer FAR
|
||
ARG @size:word
|
||
USES ax,cx,di,ds,es
|
||
push cs
|
||
push cs
|
||
pop ds
|
||
pop es
|
||
call [cs:mbfindsb],offset databuffer,cs
|
||
jc @@nodatabuffer
|
||
call [cs:mbfree],ax
|
||
@@nodatabuffer:
|
||
mov ax,[@size]
|
||
mov cx,ax
|
||
mov [buffer.size],ax
|
||
mul [myboot.sectorsize]
|
||
call [cs:mbcreate],offset databuffer,ax
|
||
jc @@errorinit
|
||
call [cs:mbresident],ax
|
||
jc @@errorinit
|
||
call [cs:mbchown],ax,cs
|
||
jc @@errorinit
|
||
mov [buffer.current],0FFFFh
|
||
mov ax,0FFFFh
|
||
mov di,offset buffer.chain
|
||
cld
|
||
rep stosw
|
||
clc
|
||
ret
|
||
@@errorinit:
|
||
stc
|
||
ret
|
||
endp setbuffer
|
||
|
||
;=============GETBUFFER============
|
||
;renvoie la structure de buffer en %0
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;====================================
|
||
PROC getbuffer FAR
|
||
ARG @pointer:word
|
||
USES ax,cx,di,ds,es
|
||
push cs
|
||
push ds
|
||
pop es
|
||
pop ds
|
||
mov si,offset buffer
|
||
mov di,[@pointer]
|
||
mov cx,size buffer
|
||
cld
|
||
rep movsb
|
||
clc
|
||
ret
|
||
endp getbuffer
|
||
|
||
;=============WRITESECTOR============
|
||
;Ecrit le secteur %0 pointé par ds:%1
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;====================================
|
||
PROC writesector FAR
|
||
ARG @sector:word,@pointer:word
|
||
USES ax,bx,cx,dx,si,es
|
||
push ds
|
||
pop es
|
||
mov ax,[@sector]
|
||
xor dx,dx
|
||
div [cs:myboot.sectorspertrack]
|
||
inc dl
|
||
mov bl,dl
|
||
xor dx,dx
|
||
div [cs:myboot.headsperdrive]
|
||
mov dh,[cs:support]
|
||
xchg dl,dh
|
||
mov cx,ax
|
||
xchg cl,ch
|
||
shl cl,6
|
||
or cl, bl
|
||
mov bx,[@pointer]
|
||
mov si,3
|
||
@@tryagain:
|
||
mov ax,0301h
|
||
int 13h
|
||
jnc @@done
|
||
dec si
|
||
jnz @@tryagain
|
||
@@done:
|
||
ret
|
||
endp writesector
|
||
|
||
;=============Getname==============
|
||
;Renvoie le nom en DS:%0
|
||
;-> AH=11
|
||
;<- Flag Carry si erreur
|
||
;==================================
|
||
PROC getname FAR
|
||
ARG @pointer:word
|
||
USES ax,cx,si,di,ds,es
|
||
push ds
|
||
pop es
|
||
push cs
|
||
pop ds
|
||
mov di,[@pointer]
|
||
mov si,offset myboot.drivename
|
||
mov cx,11
|
||
rep movsb
|
||
mov al,' '
|
||
mov di,[@pointer]
|
||
mov cx,11
|
||
repne scasb
|
||
mov [byte ptr es:di],0
|
||
ret
|
||
endp getname
|
||
;=============Getserial==============
|
||
;Renvoie le numéro de serie en EAX
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;====================================
|
||
PROC getserial FAR
|
||
mov eax,[cs:myboot.serialnumber]
|
||
ret
|
||
endp getserial
|
||
|
||
;=============VERIFYSECTOR==============
|
||
;Vérifie le secteur %0
|
||
;->
|
||
;<- Flag Carry si erreur, Flag Equal si secteurs égaux
|
||
;=======================================
|
||
PROC verifysector FAR
|
||
ARG @sector:word
|
||
USES ecx,si,di,ds,es
|
||
push cs
|
||
pop es
|
||
push cs
|
||
pop ds
|
||
mov si,offset bufferread
|
||
call readsector,cx,si
|
||
call inverse
|
||
call writesector,cx,si
|
||
jc @@errorverify
|
||
|
||
mov si,offset bufferwrite
|
||
call readsector,cx,si
|
||
call inverse
|
||
jc @@errorverify
|
||
|
||
mov si,offset bufferread
|
||
call inverse
|
||
call writesector,cx,si
|
||
jc @@errorverify
|
||
|
||
xor ecx,ecx
|
||
mov cx,[cs:myboot.sectorsize]
|
||
shr cx,2
|
||
mov si,offset bufferread
|
||
mov di,offset bufferwrite
|
||
cld
|
||
rep cmpsd
|
||
@@errorverify:
|
||
ret
|
||
|
||
endp verifysector
|
||
|
||
inverse:
|
||
push si cx
|
||
xor cx,cx
|
||
invert:
|
||
not [dword ptr si]
|
||
add si,4
|
||
add cx,4
|
||
cmp cx,[cs:myboot.sectorsize]
|
||
jb invert
|
||
pop cx si
|
||
ret
|
||
|
||
;=============DecompressRle (Fonction 05H)==============
|
||
;decompress ds:si en es:di taille bp d‚compress‚ cx compress‚
|
||
;-> AH=5
|
||
;<- Flag Carry si erreur, Flag Equal si secteurs égaux
|
||
;=====================================================
|
||
PROC decompressrle FAR
|
||
ARG @seg1:word,@off1:word,@seg2:word,@off2:word,@size:word
|
||
USES ecx,dx,si,di,ds,es
|
||
mov ds,[@seg1]
|
||
mov es,[@seg2]
|
||
mov si,[@off1]
|
||
mov di,[@off2]
|
||
mov dx,[@size]
|
||
@@decompression:
|
||
mov eax,[ds:si]
|
||
cmp al,'/'
|
||
jne @@nocomp
|
||
cmp si,07FFFh-6
|
||
jae @@thenen
|
||
mov ecx,eax
|
||
ror ecx,16
|
||
cmp cl,'*'
|
||
jne @@nocomp
|
||
cmp [byte ptr ds:si+4],'/'
|
||
jne @@nocomp
|
||
mov al,ch
|
||
mov cl,ah
|
||
xor ah,ah
|
||
xor ch,ch
|
||
cld
|
||
rep stosb
|
||
add si,5
|
||
sub dx,5
|
||
jnz @@decompression
|
||
jmp @@thenen
|
||
@@nocomp:
|
||
mov [es:di],al
|
||
inc si
|
||
inc di
|
||
dec dx
|
||
jnz @@decompression
|
||
@@thenen:
|
||
xor eax,eax
|
||
mov ax,di
|
||
sub ax,[@off2]
|
||
clc
|
||
ret
|
||
endp decompressrle
|
||
|
||
;=============CompressRle (Fonction 06H)==============
|
||
;compress ds:si en es:di taille cx d‚compress‚ BP compress‚
|
||
;-> AH=6
|
||
;<- Flag Carry si erreur, Flag Equal si secteurs égaux
|
||
;=====================================================
|
||
PROC compressrle FAR
|
||
ARG @seg1:word,@off1:word,@seg2:word,@off2:word,@size:word
|
||
USES ax,bx,cx,dx,si,di,ds,es
|
||
mov es,[@seg1]
|
||
mov ds,[@seg2]
|
||
mov di,[@off1]
|
||
mov si,[@off2]
|
||
mov dx,[@size]
|
||
@@againcomp:
|
||
mov bx,di
|
||
mov al,[es:di]
|
||
mov cx,dx
|
||
cmp ch,0
|
||
je @@poo
|
||
mov cl,0ffh
|
||
;mov cx,bp
|
||
;sub cx,di
|
||
;mov ah,cl
|
||
@@poo:
|
||
mov ah,cl
|
||
inc di
|
||
xor ch,ch
|
||
repe scasb
|
||
sub cl,ah
|
||
neg cl
|
||
cmp cl,6
|
||
jbe @@nocomp2
|
||
mov [dword ptr si],' * /'
|
||
mov [byte ptr si+4],'/'
|
||
mov [si+1],cl
|
||
mov [si+3],al
|
||
add si,5
|
||
dec di
|
||
xor ch,ch
|
||
sub dx,cx
|
||
jnz @@againcomp
|
||
jmp @@fini
|
||
@@nocomp2:
|
||
mov [si],al
|
||
inc si
|
||
inc bx
|
||
mov di,bx
|
||
dec dx
|
||
jnz @@againcomp
|
||
@@fini:
|
||
mov ax,si
|
||
sub ax,[@off2]
|
||
clc
|
||
ret
|
||
endp compressrle
|
||
|
||
;=============Changedir (Fonction 13)==============
|
||
;Change le repertoire courant a DS:SI
|
||
;-> AH=13
|
||
;<- Flag Carry si erreur, Flag Equal si secteurs égaux
|
||
;=====================================================
|
||
PROC changedir FAR
|
||
ARG @pointer:word
|
||
LOCAL @@temp:word:64
|
||
USES cx,si,di,ds,es
|
||
push ss
|
||
pop es
|
||
lea di,[@@temp]
|
||
push di
|
||
mov si,[@pointer]
|
||
mov cx,64/4
|
||
cld
|
||
rep movsd
|
||
push ss
|
||
pop ds
|
||
pop di
|
||
call searchfile,di
|
||
jne @@noch
|
||
jc @@noch
|
||
;cmp [si],005Ch ;'/',0 (root dir)
|
||
mov cx,[es:(find di).result.filegroup]
|
||
mov [cs:currentdir],cx
|
||
mov [cs:adressdirectory],cx
|
||
cmp [dword ptr es:(find di).result.filename],' .'
|
||
je @@theend
|
||
cmp [dword ptr es:(find di).result.filename],' ..'
|
||
jne @@notback
|
||
push cs
|
||
push cs
|
||
pop ds
|
||
pop es
|
||
mov di,offset currentdirstr
|
||
mov cx,128
|
||
mov al,0
|
||
cld
|
||
repne scasb
|
||
mov al,'/'
|
||
std
|
||
repne scasb
|
||
inc di
|
||
mov [byte ptr es:di],0
|
||
jmp @@theend
|
||
@@notback:
|
||
push cs
|
||
push cs
|
||
pop ds
|
||
pop es
|
||
mov di,offset currentdirstr
|
||
mov cx,128
|
||
mov al,0
|
||
cld
|
||
repne scasb
|
||
dec di
|
||
mov al,'/'
|
||
cld
|
||
stosb
|
||
mov dx,di
|
||
push ss
|
||
pop es
|
||
lea di,[@@temp]
|
||
mov si,di
|
||
mov cx,128
|
||
mov al,0
|
||
cld
|
||
repne scasb
|
||
sub cx,128
|
||
neg cx
|
||
push ss
|
||
pop ds
|
||
push cs
|
||
pop es
|
||
mov di,dx
|
||
cld
|
||
rep movsb
|
||
@@theend:
|
||
clc
|
||
ret
|
||
@@noch:
|
||
stc
|
||
ret
|
||
endp changedir
|
||
|
||
;=============getdir==============
|
||
;Recupere le repertoire courant a DS:%0
|
||
;->
|
||
;<- Flag Carry si erreur
|
||
;=================================
|
||
PROC getdir FAR
|
||
ARG @pointer:word
|
||
USES ax,cx,si,di,ds,es
|
||
push cs
|
||
pop es
|
||
mov di,offset currentdirstr
|
||
mov cx,128
|
||
mov al,0
|
||
cld
|
||
repne scasb
|
||
sub cx,128
|
||
neg cx
|
||
push ds
|
||
pop es
|
||
push cs
|
||
pop ds
|
||
mov si,offset currentdirstr
|
||
mov di,[@pointer]
|
||
cld
|
||
rep movsb
|
||
clc
|
||
ret
|
||
endp getdir
|
||
|
||
bufferread db 512 dup (0)
|
||
bufferwrite db 512 dup (0)
|
||
bufferentry db 512 dup (0)
|
||
;fatter db 9*512 dup (0)
|