IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Ecriture sur secteur disquette avec 13h


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 164
    Points
    164
    Par défaut Ecriture sur secteur disquette avec 13h
    Bonjour,

    J'ai des problèmes sur plusieurs lecteurs de disquette d'écriture de donnée sur des secteurs via l'interruption 13h du bios, voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    Code Segment
    	Assume CS:Code, DS:Code, SS:Code	; CS, DS et SS pointent vers le segment de code
    	ORG 100h							; Apres le PSP, entete d'un fichier executable DOS
     
    Main Proc								; procedure principale
    	JMP Debut							; saute au debut
     
    Buffer				DB 	2048 Dup(9)		; buffer remplit de 9
    erreur_reset		DB	"AH:Etat:Erreur reset lecteur",10,13,0
    erreur_copie		DB	"AH:Etat, AL=nb de secteur tranfere:Erreur de copie sur disquette",10,13,0
    fin_copie			DB	"Test termine",10,13,0
    Nb_Err				DB	0
     
    Debut:								; initialisation
    	MOV AX, CS						; C'est un .COM, donc 1 segment suffit.
    	MOV DS, AX						; DS = segment data = segment code pour un .COM
    	MOV ES, AX						; ES = segment de son choix
    recommence:
    	MOV AH, 00h						; fonction 0 -> reset du disque
    	MOV DL, 0						; index du lecteur
    	INT 13h
    	JNC suite						; si pas d'erreur
    	CALL printnb
    	MOV SI, offset erreur_reset		; Impression du message
    	CALL printf
    	JMP fin
    suite:								; Copie du buffer sur la disquette
    	LEA BX, Buffer					; ES:BX buffer du donnees, offset memoire toujours 0
     
    	MOV CX, 4						; secteur de debut
    	MOV AL, 1						; nombre de secteur a copier
     
    	MOV AH, 03h						; fonction 3 ecriture d'un secteur
    	MOV DX, 0						; DH numero de tete, DL numero de lecteur
    	INT 13h							; AH contient le code erreur
    	JNC fin							; Jump si carry flag CF est a 0
    	INC Nb_Err						; Si il y a eu une erreur
    	CMP Nb_Err, 50					; moins de 5 erreurs on re-essai
    	JL recommence
    	CALL printnb
    	MOV SI, Offset erreur_copie		; Impression du message
    	CALL printf
    fin:
    	MOV Nb_Err, 0
    	MOV SI, offset fin_copie
    	CALL printf
    	MOV AX, 4C00h		    	    ; on quitte le programme MS DOS
    	INT 21h
     
    printf:
    	PUSH AX
    	PUSH BX
    _printf_debut:
    	LODSB			; ds:si -> al
    	CMP AL,0		; fin chaine ?
    	JZ _printf_fin
    	MOV AH,0Eh		; appel au service 0x0e, int 0x10 du bios
    	MOV BX,02h		; bh -> numero page, bl -> attribut, al -> caractere ascii
    	INT 10h			; ne retourne rien
    	JMP _printf_debut
    _printf_fin:
    	POP BX
    	POP AX
    	RET
     
    printnb:
    	PUSH CX
    	PUSH BX
    	PUSH AX
    	MOV CL, 12		; nombre de decalage du debut
    _printnb_boucle:
    	SHR	AX, CL		; -> xxxx xxxx xxxx xxxx
    	AND AX, 0Fh		; &  0000 0000 0000 xxxx
    	CMP	AL, 10
    	JL	_printnb_inf10_a	; si superieur ou egal a 10
    	SUB AL, 10
    	ADD AL, 41h
    	JMP	_printnb_fin_a
    _printnb_inf10_a:			; si inferieur a 10
    	ADD AL, 30h
    _printnb_fin_a:				; AL contient le caractere a imprimer
    	MOV AH, 0Eh				; fonction d'impression de caractere
    	MOV BX, 0E00h
    	INT 10h					; ne modifie aucun registre
    	SUB	CL, 4
    	POP AX					; recuperation et sauvegarde de AX
    	PUSH AX
    	CMP	CL, 0
    	JGE	_printnb_boucle		; saut si plus grand ou egal a 0
    	MOV AH, 0Eh				; fonction d'impression de caractere
    	MOV AL, ':'
    	MOV BX, 0E00h
    	INT 10h
    	POP AX
    	POP BX
    	POP CX
    	RET
     
    Main EndP
    Code EndS
    End Main
    Donc j'ai un buffer de 2048 octets ne contenant que des 9, je joue sur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	MOV CX, 4						; secteur de debut
    	MOV AL, 1						; nombre de secteur a copier
    Pour écrire un ou plusieurs secteurs à partir du secteur de mon choix.
    Lorsque j'ecris un seul secteur (AL=1) à partir du secteur 0, 1, 2, 3 ou 4 ca marche, mais lorsque j'essai d'ecrire plus d'un secteur ( AL supérieur à 1 mais inférieur à 18 car une piste contient 18 secteurs sur une disquette 1.44Mo ), ou que j'essai d'écrire dans le secteur 5 ( AL = 1, CX = 5 ), j'ai une erreur: "data boundary error (attempted DMA across 64K boundary or >80h sectors)" (AH = 09h apres l'interruption 13h). D'ou peut venir se problème ? Lorsque je formate une disquette sous DOS avec ce lecteur tout fonctionne, je ne pense pas que je problème vienne du lecteur, d'autant plus que j'ai testé ce code sur plusieurs lecteurs.

    Je compile avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TASM /m2 TEST
    TLINK /t TEST
    ( mon programme se nomme TEST.ASM ).
    Y'a-t-il un procédé spécial à faire pour écrire plusieurs secteurs ou écrire a partir du secteur 5 sur une disquette ?

    Autre question, quelles sont les ports utilisés pour accéder directement au controlleur de disquette sans passer par l'interruption 13h ?

    Cordialement.

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 164
    Points
    164
    Par défaut Avancement
    Bonjour,

    Alors personne n'a d'idée ? J'ai pas trop envie d'utiliser rawrite pour palier à ce problème...

    Sinon sur http://docs.huihoo.com/help-pc/int-int_13_3.html
    ils indiquent "be sure ES:BX does not cross a 64K segment boundary or a DMA boundary error will occur", c'est justement ce type d'erreur que j'ai mais étant donné que mon programme est un .COM, donc ils tient entier dans un segment ( code + data + pile ), je ne voit pas pourquoi il y a cette erreur.

    Si quelqu'un à une idée...
    Cordialement.

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 930
    Points : 59 398
    Points
    59 398
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Si tu déplaces tes données en fin de code et si tu supprimes le jmp Debut, ça devrait tourner (testé avec succès après assemblage avec FASM).
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 164
    Points
    164
    Par défaut Zarbi
    Bonjour,

    J'ai essayé sur un portable Dell Inspiron en console DOS sous Windows 2000, et la ca tourne, alors que j'avais l'erreur sur un portable IBM Thinkpad en console DOS sous Windows 2000 et sur un PC Fujitsu/Siemens en console DOS sous XP.

    Je vais essayer ta methode avec les PC pour lesquel cela ne fonctionne pas.

    Merci !

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 164
    Points
    164
    Par défaut Ca vient pas de l'emplacement des données
    Bonjour,

    J'ai déplacé les données en bas et virer le JMP debut comme ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    Code Segment
    	Assume CS:Code, DS:Code, SS:Code	; CS, DS et SS pointent vers le segment de code
    	ORG 100h							; Apres le PSP, entete d'un fichier executable DOS
     
    Main Proc								; procedure principale
    	MOV AX, CS						; C'est un .COM, donc 1 segment suffit.
    	MOV DS, AX						; DS = segment data = segment code pour un .COM
    	MOV ES, AX						; ES = segment de son choix
    recommence:
    	MOV AH, 00h						; fonction 0 -> reset du disque
    	MOV DL, 0						; index du lecteur
    	INT 13h
    	JNC suite						; si pas d'erreur
    	CALL printnb
    	MOV SI, offset erreur_reset		; Impression du message
    	CALL printf
    	JMP fin
    suite:								; Copie du buffer sur la disquette
    	LEA BX, Buffer					; ES:BX buffer du donnees, offset memoire toujours 0
     
    	MOV CX, 1						; secteur de debut
    	MOV AL, 4						; nombre de secteur a copier
     
    	MOV AH, 03h						; fonction 3 ecriture d'un secteur
    	MOV DX, 0						; DH numero de tete, DL numero de lecteur
    	INT 13h							; AH contient le code erreur
    	JNC fin							; Jump si carry flag CF est a 0
    	INC Nb_Err						; Si il y a eu une erreur
    	CMP Nb_Err, 5					; moins de 5 erreurs on re-essai
    	JL recommence
    	CALL printnb
    	MOV SI, Offset erreur_copie		; Impression du message
    	CALL printf
    fin:
    	MOV Nb_Err, 0
    	MOV SI, offset fin_copie
    	CALL printf
    	MOV AX, 4C00h		    	    ; on quitte le programme MS DOS
    	INT 21h
     
    printf:
    	PUSH AX
    	PUSH BX
    _printf_debut:
    	LODSB			; ds:si -> al
    	CMP AL,0		; fin chaine ?
    	JZ _printf_fin
    	MOV AH,0Eh		; appel au service 0x0e, int 0x10 du bios
    	MOV BX,02h		; bh -> numero page, bl -> attribut, al -> caractere ascii
    	INT 10h			; ne retourne rien
    	JMP _printf_debut
    _printf_fin:
    	POP BX
    	POP AX
    	RET
     
    printnb:
    	PUSH CX
    	PUSH BX
    	PUSH AX
    	MOV CL, 12		; nombre de decalage du debut
    _printnb_boucle:
    	SHR	AX, CL		; -> xxxx xxxx xxxx xxxx
    	AND AX, 0Fh		; &  0000 0000 0000 xxxx
    	CMP	AL, 10
    	JL	_printnb_inf10_a	; si superieur ou egal a 10
    	SUB AL, 10
    	ADD AL, 41h
    	JMP	_printnb_fin_a
    _printnb_inf10_a:			; si inferieur a 10
    	ADD AL, 30h
    _printnb_fin_a:				; AL contient le caractere a imprimer
    	MOV AH, 0Eh				; fonction d'impression de caractere
    	MOV BX, 0E00h
    	INT 10h					; ne modifie aucun registre
    	SUB	CL, 4
    	POP AX					; recuperation et sauvegarde de AX
    	PUSH AX
    	CMP	CL, 0
    	JGE	_printnb_boucle		; saut si plus grand ou egal a 0
    	MOV AH, 0Eh				; fonction d'impression de caractere
    	MOV AL, ':'
    	MOV BX, 0E00h
    	INT 10h
    	POP AX
    	POP BX
    	POP CX
    	RET
     
    Buffer				DB 	2048 Dup(3)		; buffer remplit de 9
    erreur_reset		DB	"AH:Etat:Erreur reset lecteur",10,13,0
    erreur_copie		DB	"AH:Etat, AL=nb de secteur tranfere:Erreur de copie sur disquette",10,13,0
    fin_copie			DB	"Test termine",10,13,0
    Nb_Err				DB	0
     
    Main EndP
    Code EndS
    End Main
    Mais sans succes, il n'y a que sur mon portable Dell Inspiron 2650 que cela marche. Je me demande si cela ne pourrait pas venir du BIOS. Peut-etre que la ou cela ne marche pas c'est le BIOS qui a mal ou pas initialisé le controlleur de disquette. Il me semble avoir lu que l'on devait lui indiquer quel type de disquette ( 720ko, 1.44Mo, simple face, double face... ). Peut etre que le BIOS du Dell fait des chose en plus... Je vais jeter un oeil du cote des ports 3F0h - 3F7h.

    Si quelqu'un à une idée...
    Merci par avance.

  6. #6
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    C'est pas le fait que tu sois sous Win$ que ca marche pas ?

    a+ Francois

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 164
    Points
    164
    Par défaut Je ne pense pas
    Bonjour,

    Ca marche sous un portable Dell Inspiron 2650 sous Win2000

    Ca ne marche pas sur un portable ThinkPad IBM sous win200, sous un PC de bureau sous WinXP et sous un vieux PC Telemecanique que tu ne peux pas déterminer si il est portable ou pas sous Win98.

    Je ne connais pas le type du controlleur et du lecteur de disquette, peut-etre la difference viendrait de la...

    Merci de vos reponses.
    Cordialement.

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 164
    Points
    164
    Par défaut Secteur par secteur
    Bonjour,

    J'ai essayé d'ecrire secteur par secteur et la c'est bizarre, le secteur 0, 1 et 3 sont bien ecrit, mais j'ai une erreur sur le secteur 2 qui ne s'ecrit pas.
    Code d'erreur 09, toujours ce problème de DMA...

    Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    Code Segment
    	Assume CS:Code, DS:Code, SS:Code	; CS, DS et SS pointent vers le segment de code
    	ORG 100h							; Apres le PSP, entete d'un fichier executable DOS
     
    Main Proc								; procedure principale
    	MOV AX, CS						; C'est un .COM, donc 1 segment suffit.
    	MOV DS, AX						; DS = segment data = segment code pour un .COM
    	MOV ES, AX						; ES = segment de son choix
     
    ; detection du floppy drive _________________________________________________________________
     
    	MOV DX, 70h
    	MOV AX, 10h						; index de lecture
    	OUT DX, AL
     
    	MOV DX, 71h
    	IN AL,DX
     
    	CALL printnb					; 0040h pour un lecteur 1.44 Mo
    	MOV SI, Offset floppy			; Impression du message
    	CALL printf
     
    ; 360kb		5.25in	1
    ; 1.2mb 	5.25in	2
    ; 720kb 	3.5in	3
    ; 1.44mb	3.5in	4
    ; 2.88mb	3.5in	5
    ; No drive			0
     
    ; ___________________________________________________________________________________________
     
    	MOV AX, 0
    	MOV CX, 1
    	PUSH CX
    	PUSH AX
     
    recommence:
    	MOV AH, 00h						; fonction 0 -> reset du disque
    	MOV DL, 0						; index du lecteur
    	INT 13h
    	JNC suite						; si pas d'erreur
    	CALL printnb
    	MOV SI, offset erreur_reset		; Impression du message
    	CALL printf
    	JMP fin
     
    suite:								; Copie du buffer sur la disquette
        POP AX
        POP CX
        PUSH CX
        PUSH AX
     
    	LEA BX, Buffer					; ES:BX buffer du donnees, offset memoire toujours 0
    	ADD BX, AX
    	; MOV CX, 1						; secteur de debut
    	MOV AL, 1						; nombre de secteur a copier
     
    	MOV AH, 03h						; fonction 3 ecriture d'un secteur
    	MOV DX, 0						; DH numero de tete, DL numero de lecteur
    	INT 13h							; AH contient le code erreur
    	JNC fin							; Jump si carry flag CF est a 0
    	INC Nb_Err						; Si il y a eu une erreur
    	CMP Nb_Err, 5					; moins de 5 erreurs on re-essai
    	JL recommence
    	CALL printnb
    	MOV SI, Offset erreur_copie		; Impression du message
    	CALL printf
    fin:
    	POP AX
    	POP CX
     
    	ADD	AX, 512
    	ADD CX, 1
     
    	PUSH CX
    	PUSH AX
     
    	CMP CX, 5
    	JB recommence
     
    	MOV Nb_Err, 0
    	MOV SI, offset fin_copie
    	CALL printf
    	MOV AX, 4C00h		    	    ; on quitte le programme MS DOS
    	INT 21h
     
    printf:
    	PUSH AX
    	PUSH BX
    _printf_debut:
    	LODSB			; ds:si -> al
    	CMP AL,0		; fin chaine ?
    	JZ _printf_fin
    	MOV AH,0Eh		; appel au service 0x0e, int 0x10 du bios
    	MOV BX,02h		; bh -> numero page, bl -> attribut, al -> caractere ascii
    	INT 10h			; ne retourne rien
    	JMP _printf_debut
    _printf_fin:
    	POP BX
    	POP AX
    	RET
     
    printnb:
    	PUSH CX
    	PUSH BX
    	PUSH AX
    	MOV CL, 12		; nombre de decalage du debut
    _printnb_boucle:
    	SHR	AX, CL		; -> xxxx xxxx xxxx xxxx
    	AND AX, 0Fh		; &  0000 0000 0000 xxxx
    	CMP	AL, 10
    	JL	_printnb_inf10_a	; si superieur ou egal a 10
    	SUB AL, 10
    	ADD AL, 41h
    	JMP	_printnb_fin_a
    _printnb_inf10_a:			; si inferieur a 10
    	ADD AL, 30h
    _printnb_fin_a:				; AL contient le caractere a imprimer
    	MOV AH, 0Eh				; fonction d'impression de caractere
    	MOV BX, 0E00h
    	INT 10h					; ne modifie aucun registre
    	SUB	CL, 4
    	POP AX					; recuperation et sauvegarde de AX
    	PUSH AX
    	CMP	CL, 0
    	JGE	_printnb_boucle		; saut si plus grand ou egal a 0
    	MOV AH, 0Eh				; fonction d'impression de caractere
    	MOV AL, ':'
    	MOV BX, 0E00h
    	INT 10h
    	POP AX
    	POP BX
    	POP CX
    	RET
     
    Buffer				DB 	2048 Dup(1)		; buffer remplit de 9
    erreur_reset		DB	"AH:Etat:Erreur reset lecteur",10,13,0
    erreur_copie		DB	"AH:Etat, AL=nb de secteur tranfere:Erreur de copie sur disquette",10,13,0
    fin_copie			DB	"Test termine",10,13,0
    floppy				DB	":type floppy.",10,13,0
    Nb_Err				DB	0
     
    Main EndP
    Code EndS
    End Main
    J'ai essayé de verifier le type de lecteur detecté, mais j'ai la meme reponse sur le pc ou cela marche et sur les autres...

    Je ne vois pas d'ou peut venir le problème... Faudrait que je trouve le source de rawrite pour comment comment ch'est-y qui font

    Si quelqu'un a une idée...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Points : 74
    Points
    74
    Par défaut
    ca m'etonne que tu arrives à faire marche ca sous win 2000. Normalement l'ecriture direct sur disquette sous 2000 et XP est interdit.

    J'ai deja fait ce genre de code dans le passe, si je le retrouve je te mettrai la source, mais ce qui m'etonne c'est que je vois pas d'erreur.

    Sinon je me demande si Rawrite utilise pas une dll prevu pour ecrire sur la disquette. genre diskio.dll ou io.dll je me rappelle plus

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 164
    Points
    164
    Par défaut Code source RAWRITE
    Bonjour,

    Je viens de trouver un code source de rawrite, je l'ai compilé, essayé et... ca marche sur tous les postes !!! Pourtant, à par le fait qu'il ecrive 3 secteurs au coup, et qu'il fasse une détection du type de lecteur pour savoir combien de secteur il y a par piste ( ce que je n'ai pas besoin vu que je sais que j'utilise un lecteur 1.44 Mo et donc qu'il y a 18 secteurs par piste ), je ne vois pas de difference avec mon code.

    Voici le source:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    #include <alloc.h>
    #include <bios.h>
    #include <ctype.h>
    #include <dir.h>
    #include <dos.h>
    #include <io.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #define FALSE	0
    #define TRUE	(!FALSE)
     
    #define SECTORSIZE	512
     
    #define	RESET	0
    #define	LAST	1
    #define	READ	2
    #define	WRITE	3
    #define	VERIFY	4
    #define	FORMAT	5
     
    int	done;
     
    /*
     Catch ^C and ^Break.
    */
    int	handler(void)
    {
      done = TRUE;
      return(0);
    }
    void msg(char (*s))
    {
    	fprintf(stderr, "%s\n", s);
    	_exit(1);
    }
    /*
     Identify the error code with a real error message.
    */
    void Error(int (status))
    {
      switch (status) {
        case 0x00:	msg("Operation Successful");				break;
        case 0x01:	msg("Bad command");					break;
        case 0x02:	msg("Address mark not found");				break;
        case 0x03:	msg("Attempt to write on write-protected disk");	break;
        case 0x04:	msg("Sector not found");				break;
        case 0x05:	msg("Reset failed (hard disk)");			break;
        case 0x06:	msg("Disk changed since last operation");		break;
        case 0x07:	msg("Drive parameter activity failed");			break;
        case 0x08:	msg("DMA overrun");					break;
        case 0x09:	msg("Attempt to DMA across 64K boundary");		break;
        case 0x0A:	msg("Bad sector detected");				break;
        case 0x0B:	msg("Bad track detected");				break;
        case 0x0C:	msg("Unsupported track");				break;
        case 0x10:	msg("Bad CRC/ECC on disk read");			break;
        case 0x11:	msg("CRC/ECC corrected data error");			break;
        case 0x20:	msg("Controller has failed");				break;
        case 0x40:	msg("Seek operation failed");				break;
        case 0x80:	msg("Attachment failed to respond");			break;
        case 0xAA:	msg("Drive not ready (hard disk only");			break;
        case 0xBB:	msg("Undefined error occurred (hard disk only)");	break;
        case 0xCC:	msg("Write fault occurred");				break;
        case 0xE0:	msg("Status error");					break;
        case 0xFF:	msg("Sense operation failed");				break;
      }
      _exit(1);
    }
     
    /*
     Identify what kind of diskette is installed in the specified drive.
     Return the number of sectors per track assumed as follows:
     9	-	360 K and 720 K 5.25".
    15	-	1.2 M HD	5.25".
    18	-	1.44 M		3.5".
    */
    int nsects(int (drive))
    {
      static	int	nsect[] = {18, 15, 9};
     
      char	*buffer;
      int	i, status;
    /*
     Read sector 1, head 0, track 0 to get the BIOS running.
    */
      buffer = (char *)malloc(SECTORSIZE);
      biosdisk(RESET, drive, 0, 0, 0, 0, buffer);
      status = biosdisk(READ, drive, 0, 10, 1, 1, buffer);
      if (status == 0x06)			/* Door signal change?	*/
      status = biosdisk(READ, drive, 0, 0, 1, 1, buffer);
     
      for (i=0; i < sizeof(nsect)/sizeof(int); ++i) {
        biosdisk(RESET, drive, 0, 0, 0, 0, buffer);
        status = biosdisk(READ, drive, 0, 0, nsect[i], 1, buffer);
        if (status == 0x06)
          status = biosdisk(READ, drive, 0, 0, nsect[i], 1, buffer);
          if (status == 0x00) break;
        }
        if (i == sizeof(nsect)/sizeof(int)) {
          msg("Can't figure out how many sectors/track for this diskette.");
        }
        free(buffer);
        return(nsect[i]);
    }
     
    void main(void)
    {
      char	 fname[MAXPATH];
      char	*buffer, *pbuf;
      int	 count, fdin, drive, head, track, status, spt, buflength, ns;
     
      puts("RaWrite 1.2 - Write disk file to raw floppy diskette\n");
      ctrlbrk(handler);
      printf("Enter source file name: ");
      scanf("%s", fname);
      _fmode = O_BINARY;
      if ((fdin = open(fname, O_RDONLY)) <= 0) {
         perror(fname);
         exit(1);
      }
     
      printf("Enter destination drive: ");
      scanf("%s", fname);
      drive = fname[0];
      drive = (islower(drive) ? toupper(drive) : drive) - 'A';
      printf("Please insert a formatted diskette into ");
      printf("drive %c: and press -ENTER- :", drive + 'A');
      while (bioskey(1) == 0) ;				/* Wait...	*/
      if ((bioskey(0) & 0x7F) == 3) exit(1);		/* Check for ^C	*/
      putchar('\n');
      done = FALSE;
    /*
     * Determine number of sectors per track and allocate buffers.
     */
      spt = nsects(drive);
      buflength = spt * SECTORSIZE;
      buffer = (char *)malloc(buflength);
      printf("Number of sectors per track for this disk is %d\n", spt);
      printf("Writing image to drive %c:.  Press ^C to abort.\n", drive+'A');
    /*
     * Start writing data to diskette until there is no more data to write.
     */
       head = track = 0;
       while ((count = read(fdin, buffer, buflength)) > 0 && !done) {
         pbuf = buffer;
         for (ns = 1; count > 0 && !done; ns+=3) {
           printf("Track: %02d  Head: %2d Sector: %2d\r", track, head, ns);
           status = biosdisk(WRITE, drive, head, track, ns, 3, pbuf);
     
           if (status != 0) Error(status);
     
           count -= (3*SECTORSIZE);
           pbuf  += (3*SECTORSIZE);
         }
         if ((head = (head + 1) & 1) == 0) ++track;
       }
       if (eof(fdin)) {
         printf("\nDone.\n");
         biosdisk(2, drive, 0, 0, 1, 1, buffer);		/* Retract head	*/
       }
    }	/* end main */
    Donc le mystère reste entier, je vais essayer d'enlever le plus de trucs possible de ce code-source pour savoir si une ligne en particulier fait que ca marche...

    Merci de vos reponses !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Points : 74
    Points
    74
    Par défaut
    je viens de tester ton prog chez moi, ca marche. Je l'ai compilé avec masm mais ca marche, doit moins il termine. J'ai ecrit 4 secteur, et c passé.

    Je vais faire une fonction pour lire les secteur, mais je pense que c bon.


    Par contre je retire ce que j'ai dis, ca marche bizarement sous xp.

  12. #12
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 164
    Points
    164
    Par défaut Sur quoi ?
    Bonjour,

    Si il n'y a pas de message d'erreur c'est que c'est bon, sinon il te le signale. Tu peux verifier avec sectedit (http://www.roadkil.net/Sectedit.html) pour verifier qu'il remplit bien les secteur de 1, enfin cela depend de ce que tu mets dans

    Sur quel PC ca marche ? Moi ca marche sur un Dell Inspiron 2650 mais ca ne fonctionne pas sur un pc de bureau Fujitsu/Siemens et un IMB ThinkPad ( je ne me souvient plus du modele,mais un assez vieux quand meme ).

    Cordialement.

  13. #13
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 930
    Points : 59 398
    Points
    59 398
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par yorke
    Par contre je retire ce que j'ai dis, ca marche bizarement sous xp.
    Ce n'est pas surprenant pour une disquette, par contre 2000/XP l'aurait empêché pour un disque dur.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par Lovmy
    Bonjour,

    Si il n'y a pas de message d'erreur c'est que c'est bon, sinon il te le signale. Tu peux verifier avec sectedit (http://www.roadkil.net/Sectedit.html) pour verifier qu'il remplit bien les secteur de 1, enfin cela depend de ce que tu mets dans

    Sur quel PC ca marche ? Moi ca marche sur un Dell Inspiron 2650 mais ca ne fonctionne pas sur un pc de bureau Fujitsu/Siemens et un IMB ThinkPad ( je ne me souvient plus du modele,mais un assez vieux quand meme ).

    Cordialement.
    y'a pas d'erreur. j'ai ecrit des A sur le premier secteur, B sur 2 eme ..., et les 4 d'un coup son passé. j'ai fais une fonction de lecture et ca m'a affiché le resultat voulu.

    Le pc c mon vieux athlon avec une CM MSi et sous XP, mais je pense pas que ton probleme vienne de la.
    Essaye de telecharger masm32 et recompile voir ce que ca donne (en 16 bits)
    La seule difference qu'il y a c'est que j'ai fais un exe sur plusieurs segment. Mais y'a pa de raison que ton buffer soit à la fin d'un segment.

    @Alcatîz > Ben le DD je savais, mais il me semble que j'avais deja testé la disquette a la sortie d'XP, et j'avais eu des problemes. J'ai du confondre

  15. #15
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 164
    Points
    164
    Par défaut Probleme .COM
    Bonjour,

    Peut-etre un probleme avec les .COM, j'utilise RAWRITE.EXE, qui fait la meme chose que mon programme en ASM, et avec lui ca marche...

    Bon donc solution: utiliser rawrite :o)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Ecriture sur un fichier XML existant avec C#
    Par ivoratparis dans le forum C#
    Réponses: 2
    Dernier message: 25/04/2014, 01h58
  2. booter sur une disquette avec la lenny
    Par copro dans le forum Debian
    Réponses: 4
    Dernier message: 27/07/2009, 16h33
  3. [Débutant] Ecrire sur disque dur avec int 13h
    Par bregolhen dans le forum Assembleur
    Réponses: 5
    Dernier message: 14/04/2006, 16h06
  4. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 22h00
  5. Réponses: 2
    Dernier message: 27/02/2004, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo