BIBLIOTHEQUE POUR LE 8086

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 21 juin 2007 à 06:35
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 25 juin 2007 à 09:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43150-bibliotheque-pour-le-8086

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 juin 2007 à 09:57
RDTSC introduit depuis le Pentium.

"...justifié par le soucis d'oublier..."
c'est une philo pour usagers des langages interprétés mais qui n'est pas de mise en ASM. Si on ne vise pas les perfs optimales, il faut faire du VB.
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
24 juin 2007 à 21:25
re,



suivant le processeur:
1 - hooker l'interuption 8 afin de comptabiliser les impulsions d'horloge. La fonction delay sauvegarde le nombre d'impulsion courant, y ajoute dx et retourne la main une fois que le nombre d'impulsion courant est égal ou dépasse la valeur calculée. L'interruption 8 etant appelée de maniere régulière toutes les 18,2 ms (si mes souvenirs sont bons). Il est également possible de reprogrammer la rtc pour avoir une fréquence différente mais en prennant soin d'appeler l'interruption 8 d'origine toute les 18,2 ms quand meme.

2 - utiliser la commande processeur qui permet d'obtenir le nombre de tics interne mais dont je ne me rappelle plus le nom.


la première solution étant compatible avec tout les PC.

@++
flory_ Messages postés 2 Date d'inscription mercredi 20 décembre 2006 Statut Membre Dernière intervention 24 juin 2007
24 juin 2007 à 14:14
re;


toute à fait d'accord avec vous à ce qui concerne la fonction delay,mais l'utilsation de 'popa' et 'pusha',est justifié par le souci d'oublier de "depiler" à la fin,...

se servire du balayage de l'écran,avais pour but de réaliser une temporisation plus stable ;sinon qu'est ce que vous proposz comme solution ;

@++
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
24 juin 2007 à 12:28
re,


Pour finir:

1 - Ce n'est pas le programme appelant qui défini les registres utilisés dans ta fonction lib donc que tu copie l'ensemble ou une seule de tes fonction, le probleme reste le meme pour l'utilisation de "pusha" "popa".

2 - Ta fonction delay n'est pas a 60Hz mais est dépendante de la fréquence de ton écran, moi j'ai le choix:60Hz,70Hz,72Hz,75Hz, mais des ecrans peuvent monter beaucoup plus suivant la résolution choisie, ce qui rend ton delay de durée imprévisible et le paramètre passé n'as pas d'unité possible.

3 - "par exp, on peut par exp au lieu de mettre le parametre dans DX on peut passer l'adresse d'une case memoire(qui contiendrais notre fameux n ==>n/60 s) via bx".

Pourquoi utiliser bx qui etait auparavant inutilisé dans cette fonction alors que cx l'est, tu ne reponds pas à la question.
Pourquoi utiliser une case memoire et bx au lieu de passer le paramètre par la pile comme il est habituellement fait pour toutes fonctions ?

tout simplement:

delay: ;temporisation ,paramettre ==>CX
push ax
push dx
push cx
mov dx,03DAh
.1
in al,dx
and al,00001000b
jnz .1
.2
in al,dx
and al,00001000b
jz .2
loop .1
pop cx
pop dx
pop ax
ret

non ?

@++
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
23 juin 2007 à 20:56
re,




je suis moyennement convaincu par cet ensemble de fonctions qui sont toutes a améliorer et a optimiser.

@++
flory_ Messages postés 2 Date d'inscription mercredi 20 décembre 2006 Statut Membre Dernière intervention 24 juin 2007
21 juin 2007 à 17:06
salut,

1)D'abord l'utilisation systematique de "pusha" a pour but de sauvgarder le contenu des registres avant de les utiliser et aprés on les restaure par "popa".comme ça lors del'appel d'une fonction de la lib ça risquerai pas de changer les valeurs des registres,éventuellement,utilisés dans le programme avant l'appel.
d'autre part cette lib est conçu pour etre inclu toute entère dans un programme.mais aussi on peut utiliser ses fonctions de façon à copier seulement la partie du code qui nous intéresse dans notre programme principale ,dans ce cas tu pe laisser tomber cette histoire de "pusha" et "popa" et tu peut meme changer les registre utilisés dans la fonction et les substituer par d'autres pour que ça soit plus adapter avec votre programme principale.

2)pour ce qui concerne la "temporisation" la metohde utilisée consiste à se servirs du balayage de l'ecrant qui'est un peut prés le meme sur toutes les machines.le balayage de tout l'écran dure à peut prés de1/60s. comme ça on peut faire une temporisaion de l'ordre de 1/60s en surveillant le retour du spot.si on fait une boucle qui répete n fois cette temporisation on obtient une temporisation de l'orde de n*1/60s.
3) l'utilisation de Dx pour passer du parametre (ds la temporisation)n'est pas obligatoir,c'est juste un question d'adaptation,il se peut que cx soit utiliser dans un boucle...par exp, on peut par exp au lieu de mettre le parametre dans DX on peut passer l'adresse d'une case memoire(qui contiendrais notre fameux n ==>n/60 s) via bx .

@++
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
21 juin 2007 à 06:35
salut,



plusieurs petits détails:

1 - pourquoi empiler systematiquement tous les registres par "pusha". l'utilisation abusive de la pile en mode réel pourrait ecraser du code ou des données. Par exemple, pour un binaire .com qui aurait une pile de 100h octets et sans compter l'utilisation de la pile a l'interieur meme des fonctions ou de leurs paramètres, tu ne pourras en imbriquer que moins de 15 si elles ont toutes un pusha en entrée. Ce genre de bug serait extremement difficile à retrouver puisqu'il pourrait générer tout et n'importe quoi a n'importe quel moment.

2 - quelle est la fréquence de la synchronisation verticale et donc, quel est l'unité du parametre passé à ta fonction delay(dx) ? Le PC dispose d'une horloge interne (cela dit en passant).

3 - pourquoi ne pas mettre directement cx en paramètre de ta fonction delay(dx) ?

@++
Rejoignez-nous