Comprobar sectores de un diskette

<<Sh4doW>>

Lanero Novato
25 Jun 2003
400
Que hay Laneros...

Resulta que estoy haciendo un programa de inventario, facturación y cartera en VB6 con Mysql; ya casi esta terminado, los Backups los hago a punta de SQL, no importa que tamaño tenga la BD, pues cree un procedimiento que parte la DB para copiarla en disquetes, algo así como el famoso hacha...

El problema es que a la hora de copiar los datos al disquete necesito comprobar q este bueno, que no tenga sectores defectuosos..., hasta ahora lo único que he logrado es hacer un format con el shell, ya que borra u chequea los sectores;

la verdad me gustaría hacerlo mediante código para tener un mayor control de mi aplicación...

otra que se me ocurrió es utilizar el format (shell("c:\windows\system32\format.com a: /y")) y efectivamente formatea muy bien pero no tengo ni la mas mínima idea de como pasar el porcentaje de formateo que muestre la ventana DOS a mi aplicación...

en resumen: necesito que por favor alguien me diga como formatear a punta de código sin llamar al API ó como comprobar los sectores del disquete ó como pasar el porcentaje de formateo que muestra el format.com a mi aplicación...

espero haber sido lo suficientemente claro

ahh casi lo olvido encontré un código para comprobar los sectores del HD en assembler pero no tengo ni la mas mínima idea de como adaptarlo a mi necesidad, ya lo compile con el turbo assembler de borland y funciona pero nada pa los disquetes, ahí les va el código a ver si un alma caritativa me puede colaborar...

---------
Code Segment Para 'CODE'
Org 100H
Assume CS:Code


inicio Proc near

mov ax,0003h
int 10h ; Pone modo de v!deo 80X25

mov dx,offset mensINI ; Posici"n donde est esta cadena
mov cx,0008h ; Fila y columna a imprimir en pantalla
call PrintString ; Procedimiento que imprime la cadena

mov dx,offset mensCara
mov cx,0209h
call PrintString ; Imprime Cadena Cara

mov dx,offset mensPista
mov cx,0308h
call PrintString ; Imprime Cadena Pista

mov dx,offset mensSector
mov cx,0407h
call PrintString ; Imprime Cadena Sector


mov ah,08h ; Sevicio que obtiene Cantidad de sectores
; por pista, pistas y caras de un disco Duro
mov dl,80h ; Disco duro elegido, 80h es el primero
int 13h
jnc goodCheck ; Si no hay error al obtener los datos de su HD

mov dx,offset mensBadCheck
mov cx,0407h
call PrintString ; Si hubo error, imprime mensaje y termina
jmp exit


goodCheck:
xor ah,ah
mov cs:[cara],dh ; hago una copia de la cantidad de caras
mov cs:[caraCop],dh
mov al,dh

push cx ; Apilo cantidad de sectores y pistas del HD

mov cx,020eh ; fila y columna para imprimir
call decimaldx0 ; Imprime el valor numrico de AX en pantalla

pop cx ; Desapilo cantidad de sectores y pistas del HD
push cx ; Apilo cantidad de sectores y pistas del HD

mov al,cl
and al,63 ;Este c lculo es para obtener cantidad de secotores

mov cx,040eh
mov ah,0
mov cs:[SectorCop],al ; Hago Copia de cantidad de sectores
mov cs:[Sector],al
call decimaldx0 ; Imprimo cantidad de sectores


pop ax ; Desapilo Cantidad de pistas y sectores
xchg ah,al
and ah,128+64 ; C lculo para obtener cantidad de pistas
mov cl,6
shr ah,cl

mov cs:[pistaCop],ax ; Hago copia de la cantidad de pistas
mov cs:[pista],ax

mov cx,030eh
call decimaldx0 ; Imprimo cantidad de pistas


mov dx,offset mensError1 ; Imprime un mensaje para continuar
mov cx,0008h
call PrintString

xor ah,ah
int 16h ; Espera a que se pulse una tecla

mov dx,offset mensBlank1
mov cx,0008h
call PrintString ; Borra el mensaje anterior



readDisk:
mov ah,01h
int 16h
jz notPressKey ; No se a pulsado tecla alguna

jmp exit ; Si se pulsa una tecla durante la lectura de su Disco Duro
; entonces se interrumpe y termina el programa



notPressKey:
Call ImprimirDatos ; Imprime sector, pista y cara que actualmente
; se est leyendo
mov cs:[Intentos],03h ; Actualiza 3 intentos de leer un sector

againReadDisk:
mov dl,80h ; Valores para leer un sector de su HD
; Primer disco duro, si tiene dos, puede poner 81h
; para leer el segundo HD
mov ax,cs:[pista]
xchg ah,al
mov cl,6
shl al,cl ; Obtiene la pista a leer

mov cx,ax
or cl,cs:[sector] ; obtiene sector a leer
mov bx,offset BufferRead ; Buffer donde se depositar los datos
; del sector leido
push cs
pop es

mov dh,cs:[cara] ; Cara a leer

mov ax,0201h ; El servicio 02h en AH es para leer sectores
; dentro de una pista y en una c ara determinada
; en su Disco duro. NUNCA CAMBIE ESTE POR OTRO
; Si lo desea, puede utilizar el 04, que chequea
; cada sector en su area de datos y el CRC.

int 13h
jnc GoodReadDisk ; Si no hay error en la lectura

mov dl,80h
mov ah,0
int 13h ; de haber error en la lectura, reclalibra
; su HD para repetir la lectura

dec cs:[Intentos] ; Lo hace 3 veces
jz BadReadDisk ; Salta si ha leido 3 veces y se ha producido error
jmp againReadDisk ; Salta a leere el sector que dio el error nuevamente

BadReadDisk:
call PrintError ; Imprime un mensaje del error de lectura en el sector
; actual, es posible que este est defectuoso

GoodReadDisk:
dec cs:[sector] ; Continu la lectura de sectores
jz changeHead ; si ha leido todos, cambia de cara
jmp readDisk


changeHead:
mov al,cs:[sectorCop] ; Vuelve a comenzar por el m ximo de sectores
mov cs:[sector],al
cmp cs:[cara],0
jz ChangePista ; Si ha leido todas las caras, cambia de pista

dec cs:[cara]
jmp readDisk

ChangePista:
mov al,cs:[CaraCop]
mov cs:[cara],al
cmp cs:[pista],0
jz ReadAll ; Si ha leido todas las pistas, entonces ha terminado
; de leer su disco duro completamente
dec cs:[pista]
jmp readDisk


ReadAll:
jmp exit



exit:

mov ax,4c00h ; Este servicio del Sistema Operativo, hace que su
; aplicaci"n termine correctamente
int 21h


mensPista db 'Pista:$'
mensCara db 'Cara:$'
mensSector db 'Sector:$'


mensINI db 'Comprobando dimensiones de su Disco DURO$'
mensError db 'Error de lectura para el sector actual. '
mensError1 db 'Presione una tecla para continuar $'
mensBlank db ' '
mensBlank1 db ' $'
mensBadCheck db 'Error al obtener valores de su Hard Disk$'

intentos db 0

pista dw 0
cara db 0
sector db 0

pistaCop dw 0
caraCop db 0
sectorCop db 0




ImprimirDatos:
mov cx,030eh
mov ax,cs:[pista]
call decimaldx0 ; pistas


mov cx,020eh
mov al,cs:[cara]
xor ah,ah
call decimaldx0 ; caras


mov cx,040eh
mov al,cs:[sector]
xor ah,ah
call decimaldx0 ; sectores

ret



PrintString: ; Imprime una cadena directamente en pantalla
mov ax,0b800h
mov es,ax
push cs
pop ds

mov ax,160
mul ch

shl cl,1
xor ch,ch

add ax,cx

mov di,ax
mov si,dx

cld

again_PrintString:
lodsb
cmp al,'$'
je exit_PrintString
mov ah,1fh
stosw
jmp again_PrintString


exit_PrintString:
ret




PrintError:
mov dx,offset mensError
mov cx,1008h
call PrintString

xor ah,ah
int 16h

mov dx,offset mensBlank
mov cx,1008h
call PrintString

ret


decimaldx0: ;Imprime directamente en pantalla el valor numrico
;contenido en AX
push ax

mov dx,0000h

mov ax,160
mul ch

shl cl,1
xor ch,ch

add ax,cx
mov si,ax

pop ax

decimal:
mov cx,0b800h
mov ds,cx
mov cx,0001h
mov bx,000ah
ahorra:
div bx
mov dh,1eh
push dx
mov dx,0000h
inc ax
dec ax
jz imprimir
inc cx
jmp ahorra

imprimir:
mov ax,0005h
sub ax,cx
jz p7a3
mov cx,ax
mov ax,1ef0h
p7a4: push ax
loop p7a4

p7a3:
mov cx,0005h






imp1:
pop dx
add dl,30h
mov [si],dx
inc si
inc si
loop imp1
RET



inicio EndP


BufferRead db 0 ; Buffer para depositar los datos de un sector
; El Sistema Operativo en teor!a le da a su programa
; toda la memoria disponible, as! que de aqu! en adelante
; dentro de este segmento de c"digo, usted puede guardar
; Lo que desee, m ximo de este segmento 64 Kilobytes.
; Es decir 64*1024-BufferRead-256 bytes y esta ser la
; cantidad m xima de bytes para guardar informaci{on extra
; en modo real o como aplicaci"n DOS. Hay otras formas...

Code EndS
End inicio
-------------------

De antemano muchas gracias, todas las respuestas serán Bienvenidas.
 
Pues si quieres un poco de programacion de ASM.... busca sobre el manejo de interrupciones

La interrupcion para manejar los HD es "int 80h" que esta en unas lineas en tu codigo aqui te pongo un ejemplo de lectura de Floppy y HD.

El archivo completo esta en :
http://mipagina.cantv.net/numetorl869/asm_05.txt




; --------------------------------
; Restablecer la unidad de floppy
; --------------------------------
reset:
mov cx, 0 ;<--------Floppy
mov ax, cx ; reestablecer sistema de disco
mov dl, al ; 0 para floppy, cambiar a 80h para discos duros
int 13h ;<------------- Interrupcion Lectura de dispositivos
; ----------------------------------
; Subir el 2do. sector a la memoria
; ----------------------------------
read:
mov bx, 200h ; desplazamiento de la segunda etapa

mov ah, 2 ; Cargar los datos del disco a ES:BX
mov al, 5 ; Cargar 3 sectores
mov ch, 0 ; Cilindros=0
mov cl, 2 ; Sector=2
mov dh, 0 ; Cabezal=0
mov dl, 0 ; Unidad=0
int 13h ; Leer!

jnc ok_load_setup ; si no hubo problemas, se continúa
 
HOLA LANEROS, QUISIERA PORFAVOR ME PROPORCIONEN LAS MACROS PARA HABILIAR Y DESHABILITAR LA DISKETERA Y EL PROG COMPLETO SERIA MEJOR SOLO PARA ESAS FUNCIONES, SE LOS AGRADECERIA MUCHO PORFAVOR!! ME LO PUEDEN ENVIAR A MI MAIL, kevincitox@hotmail.com, estare