As-tu corrigé la géométrie de la disquette dans le BPB (car il s'agit ici d'une image possédant une géométrie particulière qui n'est pas nécéssairement adapté a ta disquette) ?Envoyé par bifur
As-tu corrigé la géométrie de la disquette dans le BPB (car il s'agit ici d'une image possédant une géométrie particulière qui n'est pas nécéssairement adapté a ta disquette) ?Envoyé par bifur
Le gourou dicte la ligne (de commande) à suivre ...
Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
ainsi que le Cour sur la ligne de commande et des scripts
ah bon ? dans quelle mesure ? (c'est bien de le préciser)
par ailleurs je me suis vite fait penché sur le remote debugging avec VirtualBox (sous windows en l'occurrence), je confirme un comportement rigoureusement identique à celui observé sur qemu (LOADER copié avec mount sous Linux) (on aurait pu s'en douter mais encore fallait-il en être sûr), du coup ce qui m'interroge un peu;
- d'où provient cette valeur de 0x5c00 ? elle est observée/déduite par quel biais ?
- vous vous y prenez comment pour debugger de votre coté ? (quels outils etc.)
je n'ai pas eu le temps de tester les disquettes montées avec WinImage, je jette un oeil d'ici ce soir
La géométrie de la disquette varie en fonction de son fabricant, de sa taille et de son formattage, rapidemment voici la liste des géométrie reconnu pour les disquettes MS-DOS (et donc FAT). Sachant qu'une disquette doit garantir (pour être compatible) au moins les spec de cette liste. Si un support offre plus de secteur par piste ou plus de tête ou plus de cylindre, ceux-in seront simplement ignoré.Envoyé par BufferBob
cette partie du dernier code du LOADER affiche CS (chez moi cela affiche 0x0)Envoyé par BufferBob
Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 mov ax, cs mov cx, 0x10 call _put_nb ; print current segment selector
puis l'appel à la fonction _addr empile la valeur de IP pour le retour de fonction
puis
Code : Sélectionner tout - Visualiser dans une fenêtre à part call _addr ; print offset of the next instruction (mov si, laddr(_lf))
j'obtient une adresse 0x5Cyz ou yz est l'offset de l'instruction suivant le
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 _addr: push bp ; sauve BP mov bp, sp ; BP pointe le sommet de la pile (old BP) add bp, 2 ; BP pointe la valeur de retour pour IP mov ax, [ss:bp] ; la valeur de retour pour IP est mis dans AX mov cx, 0x10 ; base 16 call _put_nb ; affiche l'adresse mov si, laddr(_lf) call _put ; affiche le retour à la ligne pop bp retDonc j'en conclue que le LOADER s'exécute à partir de l'adresse 0x0:0x5C00
Code : Sélectionner tout - Visualiser dans une fenêtre à part call _addr
Le gourou dicte la ligne (de commande) à suivre ...
Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
ainsi que le Cour sur la ligne de commande et des scripts
j'ai utillisé une disquette standard 1.44Mb qui semble correspondre aux paramêtre enregistré dans le BPBAs-tu corrigé la géométrie de la disquette dans le BPB (car il s'agit ici d'une image possédant une géométrie particulière qui n'est pas nécéssairement adapté a ta disquette) ?
je pense avoir trouvé pourquoi ça merdoyait, il semble qu'il y ait une erreur au niveau de conversion dans la fonction _intx13
on ne doit pas diviser par le nombre de secteur par piste mais par le nombre de secteur par cylindre, c'est a dire le nombre de secteur par piste multiplié par le nombre de tête (dans de nombreuse doc on ne fait pas la différence entre la piste et le cylindre)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 xor dx, dx ; clean DX mov byte [ds:bp+4], cl ; save sector count (word_array[2]) mov cx, [bpbaddr(BPB_SecPerTrk)] ; CX = BPB_SecPerTrk div cx ; AX =cylinder:head ; DX = sector number push dx ; save sector number xor dx, dx mov cx, [bpbaddr(BPB_NumHeads)] ; CX = BPB_NumHeads div cx ; AX =cylinder number ; DX = head number mov byte [ds:bp+2], dl ; save head number for int 0x13 (word_array[1])
ensuite le résultat entier de cette division est la coordonnée de N° de cylindre (pas le numéros de secteur)
la division suivante doit être celle du reste de la première par le nombre de tête, ce qui nous donne le numéos de tête et le reste de cette division est le numéros du secteur
et en dernier faut pas oublier de rajouter 1 au numéros de secteur car leur numérotation commence par 1
ce qui donne (si je reprend la source de AMORC.ASM et que je rajoute quelques commentaire)
j'en suis sur a 95%
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 mov cx,[bpbaddr(BPB_NumHeads)] mov ax,[bpbaddr(BPB_SecPerTrk)] mul cx ;ax=nombre de secteur par cylindre mov cx,ax mov ax,bx ;bx=numéros LBA du secteur xor dx,dx div cx mov bx,ax ;bx=numéros de cylindre/numéros de piste mov ax,dx mov cl,[bpbaddr(BPB_NumHeads)] div cl ;ah=numéros de secteur-1 al=numéros de tête inc ah ah=numéros de secteur mov dh,al ; a partir d'ici c'est pour adapter les données aux paramètre de la fonction lecture de l'int13h mov cx,bx xchg cl,ch shl cl,6 and cl,0C0h and ah,03Fh or cl,ah
un vieux pense bête a moi: http://bifur.olympe.in/?art=4
si c'est ça la modification va lui couter très cher à mon avis, la fonction _intx13 étant appelée plusieurs fois et le secteur dans lequel elle se trouve ne disposant plus que de 2 octets libres, le tout sans debugger...
mais non....
si il optimise un peu son code il n'y as pas besoin de beaucoup plus de place, il peut aussi a mon avis réduire pas mal la taille de la fonction _put et en dernier recourt il peut réduire un peu la taille du texte
sauf que:
N / (BPB_NumHeads * BPB_SecPerTrk) == ( N / BPB_SecPerTrk) / BPB_NumHeads
Le gourou dicte la ligne (de commande) à suivre ...
Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
ainsi que le Cour sur la ligne de commande et des scripts
j'ai testé la modif de la fonction eeeettt.......ça marche pas
enfin pas tout a fait comme prévu, si je ne met pas le fichier loader dans la disquette il affiche un message d'erreur et redémarre (normal donc) mais si je met le fichier LOADER dans la disquette il affiche "ASTERIX BOOTDISK" en boucle
j'ai du me planter quelque part.....
effectivement c'est vrai a condition qu'il n'y ait pas de reste issue de ces division (ce qui n'est pas toujour le cas)N / (BPB_NumHeads * BPB_SecPerTrk) == ( N / BPB_SecPerTrk) / BPB_NumHeads
dans notre cas les restes de divisions sont récupérés au fur et a mesure donc le pb ne vient pas de la.Envoyé par bifur
Le gourou dicte la ligne (de commande) à suivre ...
Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
ainsi que le Cour sur la ligne de commande et des scripts
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager