Acceso
a Disco.
El
sistema de almacenamiento en disco constituye el soporte externo de la
información. Los datos se registran sobre la superficie del disco en una serie
de circunferencias concéntricas llamadas pistas (track).
Varias
pistas, una por cada cara del disco (generalmente 2), componen un cluster. Cada
pista está dividida en porciones iguales llamadas sectores. Un sector es la
unidad básica de almacenamiento en disco. El tamaño de un sector se mide en
bytes, y depende de las características del disco.
En esta sección se presentan 3 rutinas que
permiten lectura y escritura absoluta de sectores, así como la determinación
del espacio libre disponible en un disco.
Rutina
_AbsoluteRead: Transfiere el contenido de un o más sectores del disco al buffer
especificado, accesando directamente a los sectores lógicos. En caso de error,
se enciende el bit de acarreo y AX contiene el código del error.
Invocación: push <unidad de disco
push
<número de sectores a leer
push
<primer sector a leer>
push SEG
<buffer>
push OFFSET
<buffer>
call
_AbsoluteRead
PUBLIC
_AbsoluteRead
_AbsoluteRead
PROC NEAR
ARG
Buffer:DWORD,Start:WORD,NumSect:WORD,Drive:BYTE= ArgLen
push
bp ; salvar BP
mov
bp,sp ; permitir acceso a los argumentos
push
bx ; salvar registros
push
cx
push
dx
push
ds
mov
al,Drive ; lectura absoluta de disco
mov
cx,NumSect
mov dx,Start
lds
bx,Buffer
int 25h
pop bx
pop
ds ; recuperar registros
pop
dx
pop cx
pop bx
pop bp
ret
ArgLen
_AbsoluteRead
ENDP
Rutina
_AbsoluteWrite: Transfiere el contenido del buffer especificado a uno o más
sectores de disco, accesando directamente a los sectores lógicos. En caso de
error, se enciende el bit de acarreo y AX contiene el código del error.
Invocación: push <unidad de disco>
push
<número de sectores a escribir>
push
<primer sector a escribir>
push SEG
<buffer>
push OFFSET
<buffer>
call
_AbsoluteWrite
PUBLIC
_AbsoluteWrite
_AbsoluteWrite
PROC NEAR
ARG
Buffer:DWORD,Start:WORD,NumSect:WORD,Drive:BYTE= ArgLen
push
bp ; salvar BP
mov
bp,sp ; permitir acceso a los argumentos
push
bx ; salvar registros
push
cx
push
dx
push
ds
mov
al,Drive ; escritura absoluta a disco
mov
cx,NumSect
mov dx,Start
lds
bx,Buffer
int 26h
pop bx
pop
ds ; recuperar registros
pop
dx
pop cx
pop bx
pop bp
ret
ArgLen
_AbsoluteWrite
ENDP
Rutina
_FreeDiskSpace: Devuelve en DX:AX el espacio libre en disco (en Kb). En caso de
error, se enciende el bit de accarreo.
Invocación: push <unidad de disco>
call
_FreeDiskSpace
PUBLIC
_FreeDiskSpace
_FreeDiskSpace
PROC NEAR
ARG Drive:BYTE=
ArgLen
push bp ;
salvar BP
mov
bp,sp ; permitir acceso a los argumentos
push
bx ; salvar registros
push
cx
mov
ah,36h ; función 36h
mov
dl,Drive
int
21h ; del DOS
mul
cx ; DX:AX= bytes por cluster
mov
cx,1024 ; CX= 1 Kb
div
cx ; DX:AX= Kb por cluster
mul
bx ; DX:AX= Kb libres en el disco
pop
cx ; recuperar registros
pop
bx
pop bp
ret ArgLen
_FreeDiskSpace
ENDP