Accueil > > > CRÉER L' IMAGE D'UNE DISQUETTE [TASM]
CRÉER L' IMAGE D'UNE DISQUETTE [TASM]
Information sur la source
Description
Si vous souhaitez comprendre comment lire le contenu d'une disquette en assembleur 8086 ou bien si vous souhaitez avoir un chtit programme (vraiment chtit : 1 ko) pour créer l'image d'une disquette et bien c'est là que ça se passe... (Le programme crée floppy.img, seulement pour des disquettes de 1.44MO, l'image est créee à l'emplacement du programme) Je rappelle qu'une disquette est constituée de 2 faces, composées chacunes de 80 pistes, supportants chacune 18 secteurs. De plus, l'ordre de lecture est "spécial" : on lit tout d'abord la piste 0 de la face 0, on passe ensuite sur la face 1, pour lire la piste 0, on revient ensuite sur la face 0 et on s'occupe de la piste 1, puis de la piste 1 de la face 1, ect.... Cette structure de la disquette un peu étrange (pourquoi ne pas lire tout d'abord la face 0 entièrement puis la face 1....) permet aux 2 têtes de lectures de travailler plus efficacement, cad à tour de rôle...
Source
- ;CODE ASM x86 COMPILE SOUS TASM 4.1
-
- ;------------------------SEGMENT DE DONNEES-------------------------
- ;-------------------------------------------------------------------
- _data segment public
- Buffer DB 512 Dup(0) ;buffer correspondant à 1 secteur
- floppy db 'FLOPPY.IMG',0
- err1 db 'Erreur du lecteur de disquette',10,13,'$'
- err2 db 'Erreur fichier',10,13,'$'
- Handle dw ? ;pointeur sur fichier
- _data ends
- ;-------------------------------------------------------------------
-
-
- ;------------------------SEGMENT DE CODE----------------------------
- ;-------------------------------------------------------------------
- _code segment public
- assume cs:_code, ss:_stack
-
- start:
-
- ;synchronise le segment de donnée avec ds ainsi que es
- mov ax, _data
- mov ds, ax
- mov es, ax
-
- ;initialise le lecteur de disquette
- xor ah, ah ;mets la fonction 00h dans ah pour "initialiser un disque"
- xor dl, dl ;précise le numéro du disque à réinitialiser(00h pour le disquette A:)
- int 13h ;par l'int 13 (lecteur de disquette)
- jc erreur1 ;si CF=1 alors on affiche une erreur
-
- ;création du fichier floppy.img
- mov ah, 3Ch ;fonction 3Ch pour créer un fichier ou vider un fichier s'il existe déjà
- mov cx, 00h ;attribut du fichier : on mets 0 pour que l'on puisse -écrire-
- mov dx, Offset floppy ;@ du nom du fichier dans dx
- int 21h ;interruption dos
- jc erreur2 ;s'il s'est produit une erreur alors on arrête tout :)
- mov [ds:Handle], ax ;mets dans la variable "Handle" le pointeur sur le fichier
-
- ;copie de la disquette (chaque boucle lit un secteur de la disquette et l'écrit dans le fichier)
-
- ;initialisation des compteurs de la boucle (entre autres)
- mov al, 01h ;on lit un seul secteur à chaque fois
- xor dx, dx ;#lecteur disquette 0 + #face 0
- xor cx, cx ;#piste 0 + #secteur 0
- inc cl ;euh en fait #secteur 1 :-)
- mov bx, Offset Buffer;endroit ou l'on lit
- mov ah, 01h
-
- ;debut de la copie
- jmp faire
-
- tantque:
- inc cl
- cmp cl,19 ;il y a 18 secteurs par piste
- jne faire
-
- mov cl, 1
- inc dh
- cmp dh, 2 ;il y a 2 faces par disques
- jne faire
-
- xor dh, dh
- inc ch
- cmp ch, 80 ;il y a 80 pistes par face
- je fintantque
-
- faire:
-
- ;lecture d'un secteur de la disquette
- mov ah, 02h ;ATTENTION il faut mettre 02 avant CHAQUE lecture
- int 13h ;en effet si la lecture est un succès, ah vaut alors 00h
- jc erreur1
-
- ;écriture de ce que l'on vient de lire
- push ax ;on sauvegarde quelques registres
- push bx
- push cx
- push dx
- mov ah, 40h ;fonction 40h pour écrire dans un fichier
- mov bx, [ds:Handle] ;on précise dans bx le pointeur sur le fichier
- mov cx, 512 ;nombre d'octets à écrire
- mov dx, Offset Buffer;@ du buffer à écrire
- int 21h ;interruption dos pour écrire
- jc erreur2 ;s'il s'est produit une erreur alors on arrête tout :)
- pop dx
- pop cx
- pop bx
- pop ax
-
- jmp tantque
-
- fintantque:
-
- mov al, 00h
- jmp fin
-
-
-
- erreur1:
- mov dx, Offset err1
- jmp erreur
- erreur2:
- mov dx, Offset err2
- jmp erreur
- erreur:
- mov ah, 09h ;fonction d'affichage 09 (via le dos)
- int 21h ;interruption pour afficher err1 ou err2
- mov al, 01h ;on mets dans al le code d'erreur 1
- jmp fin
- fin:
- mov ah, 4Ch ;fonction 4Ch de sortie de programme avec code d'erreur
- int 21h ;interruption pour sortir
-
- _code ends
- ;--------------------------------------------------------------------
-
-
-
-
- ;------------------------SEGMENT DE LA PILE--------------------------
- ;--------------------------------------------------------------------
- _stack segment stack
- db 100h dup (?) ;déclare une pile de 256 octets
- _stack ends
- ;--------------------------------------------------------------------
-
-
-
-
- ;------------------------SAUT AU DEBUT DU PROGRAMME------------------
- end start
- ;--------------------------------------------------------------------
-
;CODE ASM x86 COMPILE SOUS TASM 4.1
;------------------------SEGMENT DE DONNEES-------------------------
;-------------------------------------------------------------------
_data segment public
Buffer DB 512 Dup(0) ;buffer correspondant à 1 secteur
floppy db 'FLOPPY.IMG',0
err1 db 'Erreur du lecteur de disquette',10,13,'$'
err2 db 'Erreur fichier',10,13,'$'
Handle dw ? ;pointeur sur fichier
_data ends
;-------------------------------------------------------------------
;------------------------SEGMENT DE CODE----------------------------
;-------------------------------------------------------------------
_code segment public
assume cs:_code, ss:_stack
start:
;synchronise le segment de donnée avec ds ainsi que es
mov ax, _data
mov ds, ax
mov es, ax
;initialise le lecteur de disquette
xor ah, ah ;mets la fonction 00h dans ah pour "initialiser un disque"
xor dl, dl ;précise le numéro du disque à réinitialiser(00h pour le disquette A:)
int 13h ;par l'int 13 (lecteur de disquette)
jc erreur1 ;si CF=1 alors on affiche une erreur
;création du fichier floppy.img
mov ah, 3Ch ;fonction 3Ch pour créer un fichier ou vider un fichier s'il existe déjà
mov cx, 00h ;attribut du fichier : on mets 0 pour que l'on puisse -écrire-
mov dx, Offset floppy ;@ du nom du fichier dans dx
int 21h ;interruption dos
jc erreur2 ;s'il s'est produit une erreur alors on arrête tout :)
mov [ds:Handle], ax ;mets dans la variable "Handle" le pointeur sur le fichier
;copie de la disquette (chaque boucle lit un secteur de la disquette et l'écrit dans le fichier)
;initialisation des compteurs de la boucle (entre autres)
mov al, 01h ;on lit un seul secteur à chaque fois
xor dx, dx ;#lecteur disquette 0 + #face 0
xor cx, cx ;#piste 0 + #secteur 0
inc cl ;euh en fait #secteur 1 :-)
mov bx, Offset Buffer;endroit ou l'on lit
mov ah, 01h
;debut de la copie
jmp faire
tantque:
inc cl
cmp cl,19 ;il y a 18 secteurs par piste
jne faire
mov cl, 1
inc dh
cmp dh, 2 ;il y a 2 faces par disques
jne faire
xor dh, dh
inc ch
cmp ch, 80 ;il y a 80 pistes par face
je fintantque
faire:
;lecture d'un secteur de la disquette
mov ah, 02h ;ATTENTION il faut mettre 02 avant CHAQUE lecture
int 13h ;en effet si la lecture est un succès, ah vaut alors 00h
jc erreur1
;écriture de ce que l'on vient de lire
push ax ;on sauvegarde quelques registres
push bx
push cx
push dx
mov ah, 40h ;fonction 40h pour écrire dans un fichier
mov bx, [ds:Handle] ;on précise dans bx le pointeur sur le fichier
mov cx, 512 ;nombre d'octets à écrire
mov dx, Offset Buffer;@ du buffer à écrire
int 21h ;interruption dos pour écrire
jc erreur2 ;s'il s'est produit une erreur alors on arrête tout :)
pop dx
pop cx
pop bx
pop ax
jmp tantque
fintantque:
mov al, 00h
jmp fin
erreur1:
mov dx, Offset err1
jmp erreur
erreur2:
mov dx, Offset err2
jmp erreur
erreur:
mov ah, 09h ;fonction d'affichage 09 (via le dos)
int 21h ;interruption pour afficher err1 ou err2
mov al, 01h ;on mets dans al le code d'erreur 1
jmp fin
fin:
mov ah, 4Ch ;fonction 4Ch de sortie de programme avec code d'erreur
int 21h ;interruption pour sortir
_code ends
;--------------------------------------------------------------------
;------------------------SEGMENT DE LA PILE--------------------------
;--------------------------------------------------------------------
_stack segment stack
db 100h dup (?) ;déclare une pile de 256 octets
_stack ends
;--------------------------------------------------------------------
;------------------------SAUT AU DEBUT DU PROGRAMME------------------
end start
;--------------------------------------------------------------------
Conclusion
Rq: Je dois bien avouer que la 1ère fois j'ai lu entièrement la face 0 puis la face 1 (je ne savais pas comment on lisait une disquette il fallait bien que je choisisse une méthode :) ) et mon image était quelque peu décousue...de plus le temps de lecture s'en étais avérer être beaucoup plus long.... je me suis dit que pê il (euh le lecteur...) passait d'une tête à une autre, et c'est bien le cas....
Amélioration possible: A la moindre erreur de lecture ou d'écriture le programme se stoppe, on pourrait retenter une lecture ou écriture en cas d'échec, et si il y a 5 erreurs consécutives, alors seulement on arrêterait le programme... A vos souris...
Si vous n'avez pas tout compris au code ou si vous avez des commentaires, des améliorations à apporter (et il y en a sûrement), n'hésitez pas à poster, a+
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
ENUMERABLECOLLECTIONENUMERABLECOLLECTION par Matthieu MEZIL
Prenons le scénario suivant. On utilise MVVM. On a les deux classes suivantes dans le model : public class Child { } public class Parent { private ObservableCollection < Child > _children; public ObservableCollection < Child > Children { get {...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [HS] CHROME 6 + MOI = COUP DE GUEULE ![HS] CHROME 6 + MOI = COUP DE GUEULE ! par JeremyJeanson
Attention, le poste qui suit n'est pas la complainte d'une personne : Qui n'aime pas Chrome. D'un anti Google. D'un développeur qui a un poil énorme dans la main. Ceux qui me fréquentent savent que je change de navigateur favori tous les 2 ou 3 mois afin ...
Cliquez pour lire la suite de l'article par JeremyJeanson [WP7] UTILISER UN WRAPPANEL DANS UNE APPLICATION WINDOWS PHONE 7[WP7] UTILISER UN WRAPPANEL DANS UNE APPLICATION WINDOWS PHONE 7 par Audrey
Lors de la réalisation de ma 2ème application Windows Phone 7, j'ai souhaité utiliser un WrapPanel pour afficher plusieurs photos. Mais le contrôle WrapPanel ne fait pas parti de la liste des contrôles inclus dans le SDK de la version Beta des outils pour...
Cliquez pour lire la suite de l'article par Audrey [WP7] BESOIN D'AVOIR DES DONNéES EN CACHE[WP7] BESOIN D'AVOIR DES DONNéES EN CACHE par Nicolas
Les développeurs ASP.NET ont l'habitude de mettre des données en cache pour éviter de requêter a chaque fois la base de données. Et il est toujours utilie de penser que vos utilisateurs mobiles n'ont pas troujours une super connexion 3G/WIFI et un for...
Cliquez pour lire la suite de l'article par Nicolas [TFS] COMMENT FORCER LA SAISIE D'UN AREA OU ITERATION[TFS] COMMENT FORCER LA SAISIE D'UN AREA OU ITERATION par cyril
Lorsque l'on créé un Work Item dans TFS, il est possible de le classer dans un "area" et dans une "iteration". Dans la plupart des types de projet, un "area" correspond à une catégorie, une "iteration" à un numéro de version. Il est possible de cré...
Cliquez pour lire la suite de l'article par cyril
Logiciels
uTorrent (2.0.4)UTORRENT (2.0.4)C'est un client BitTorrent très puissant et très performant. Comme son nom l'indique, uTorrent (m... Cliquez pour télécharger uTorrent Bureau de Gestion - ERP Devis Facturation (2.02)BUREAU DE GESTION - ERP DEVIS FACTURATION (2.02)- Version gratuite du 10/06/2010
Le Bureau de Gestion est un logiciel dédié à la gestion de l'en... Cliquez pour télécharger Bureau de Gestion - ERP Devis Facturation 4Videosoft Transfert iPod Mac (3.2.08)4VIDEOSOFT TRANSFERT IPOD MAC (3.2.08)4Videosoft Transfert iPod-Mac caractérise principalement à transférer les fichiers iPod vers Mac.... Cliquez pour télécharger 4Videosoft Transfert iPod Mac 4Videosoft HD Convertisseur (3.3.08)4VIDEOSOFT HD CONVERTISSEUR (3.3.08)Etant le meilleur HD Vidéo Convertisseur, 4Videosoft HD Convertisseur, vous pouvez regarder la vi... Cliquez pour télécharger 4Videosoft HD Convertisseur 4Videosoft Transfert iPad Mac (3.2.08)4VIDEOSOFT TRANSFERT IPAD MAC (3.2.08)4Videosoft Transfert iPad-Mac est un logiciel managérial iPad professionnel qui a des fonctions i... Cliquez pour télécharger 4Videosoft Transfert iPad Mac
|