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.
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.