| CPC Rulez https://cpcrulez.fr/forum/ |
|
| Questions sur les interruptions https://cpcrulez.fr/forum/viewtopic.php?f=4&t=4481 |
Page 1 sur 1 |
| Auteur : | dentifiant [ 28 Fév 2011, 17:48 ] |
| Sujet du message : | Questions sur les interruptions |
Bien le bonjour. J'ai lu pas mal de docs dispo sur les interruptions, mais il subsiste quelques points obscurs dans mon esprit. Déjà quel est la difference fondamentale entre placer EI RET ou juste RET en &38 ? Je comprend à peu près la difference d'effet entre les deux (enfin je crois), mais je comprend pas le pourquoi du comment techniquement parlant... Ensuite, dans mon projet, j'ai besoin à un moment de compter le temps (genre : mon gars, à partir de maintenant, il te reste 1 minute 37 secondes avant qu'il se passe un truc). Ai-je absolument besoin des interruptions pour ça, et si oui, comment faire pour en placer une (d'interruption), quand je me suis débarassé de toutes celles du système et des vecteurs avec ? (Idem, j'ai lu qu'il y avait moyen, mais le comment m'échappe un peu). Merci d'avance pour vos lumières. |
|
| Auteur : | fano [ 28 Fév 2011, 17:55 ] |
| Sujet du message : | Re: Questions sur les interruptions |
La différence est que si tu ne mets pas le EI tu ne vas pas autoriser à nouveau les interruptions quand tu sortira de ta routine de traitement. Sinon , pour compter le temps restant , ça dépends si tu cales ton programme sur la VBL tu peux avoir un compteur basé sur 1/50ème de seconde et pas te faire chier avec les interruptions. Après , c'est pas compliqué d'écrire sa propre routine d'interruption , ce qui est pas mal c'est d'identifier la première int en testant la VBL (pas sur que ça marche avec des configs CRTC "exotiques") et de faire une table de branchement en fonction. En IM1 , ta routine est obligatoirement en #38 , en IM2 tu peux choisir moyennant un bradage de 256 octets.Sur CPC , tu ne choisis pas quand l'int tombe , c'est 6 fois par image (52 lignes?) , tu peux retarder la prochaine int mais je crois que c'est tout. |
|
| Auteur : | dentifiant [ 28 Fév 2011, 18:04 ] |
| Sujet du message : | Re: Questions sur les interruptions |
fano a écrit : La différence est que si tu ne mets pas le EI tu ne vas pas autoriser à nouveau les interruptions quand tu sortira de ta routine de traitement. Parce que les interruptions sont interdites dans ce cas ? (Comme un DI implicite sortit de nulle part, qui va avec le call &38 ?) Excusez mes questions un peu bancales mais c'est pas toujours évident à suivre quand on débarque fano a écrit : Sinon , pour compter le temps restant , ça dépends si tu cales ton programme sur la VBL tu peux avec un compteur basé sur 1/50ème de seconde et pas te faire chier avec les interruptions. J'attend bel et bien la prochaine VBL pour afficher proprement oui, mais je m'occupe pas de savoir combien en sont passées pendant la boucle précédente donc ça va être tendu. fano a écrit : Après , c'est pas compliqué d'écrire sa propre routine d'interruption , ce qui est pas mal c'est d'identifier la première int en testant la VBL (pas sur que ça marche avec des configs CRTC "exotiques") et de faire une table de branchement en fonction. Bon, je vais essayer de digérer ça déjà. Faut que je retourne manger du gate array et du CRTC si je pige tout Merci bien |
|
| Auteur : | fano [ 28 Fév 2011, 18:31 ] |
| Sujet du message : | Re: Questions sur les interruptions |
dentifiant a écrit : Parce que les interruptions sont interdites dans ce cas ? (Comme un DI implicite sortit de nulle part, qui va avec le call &38 ?) Pas de souci , y'a effectivement un DI implicite quand l'int est lancée.Voilà un petit exemple d'une routine d'int simple qui se loge en #38 , avec juste un bout de code du player son appelé que tu peux ignorer. Code : ;ISR code
push AF push BC push HL ;get if we are on VBL ld B,#F5 in A,(C) rra jr nc,int_not_VBL ld A,#FF ld (int_counter),A .int_not_VBL int_counter EQU $+1 ld A,0 inc A and 7 ld (int_counter),A add A,A int_table EQU $+1 ld HL,int_default_table ld C,A ld B,0 add HL,BC ld A,(HL) inc HL ld H,(HL) ld L,A jp (HL) .int_done pop HL pop BC pop AF ei ret ;interrupt table - 8 vectors .int_default_table dw int_done dw int_SND_Player dw int_done dw int_done dw int_done dw int_done dw int_done dw int_done ;sound player INT .int_SND_Player ld A,(#4000) push AF ld BC,#7FC7 out (C),C call SND_Run pop AF ld B,#7F out (C),A jr int_done |
|
| Auteur : | dentifiant [ 28 Fév 2011, 19:24 ] |
| Sujet du message : | Re: Questions sur les interruptions |
Waa nickel merci bien, j'm'en vais décortiquer tout ça
|
|
| Auteur : | norecess [ 01 Mars 2011, 00:23 ] |
| Sujet du message : | Re: Questions sur les interruptions |
Super aide de ta part fano, je trouve ca tip top!
|
|
| Auteur : | dentifiant [ 01 Mars 2011, 00:34 ] |
| Sujet du message : | Re: Questions sur les interruptions |
Pratique le truc de equ $+1, je connaissais pas. Par contre, le fait qu'il y ai un point devant un nom de label change quelquechose ou c'est juste une autre syntaxe ? Si j'ai tout bien comris, int_SND_Player est executé à chaque VBL ? Ou j'ai raté un truc ? ![]() norecess a écrit : Super aide de ta part fano, je trouve ca tip top! ![]() +1 merci c'est vraiment cool |
|
| Auteur : | Megachur [ 01 Mars 2011, 08:27 ] |
| Sujet du message : | Re: Questions sur les interruptions |
le . indique juste que c'est un label... mais on en pas besoin. tu trouveras également des ":" à la fin d'un label aussi... selon l'assembleur c'est accepté (dams, maxam, etc.) exemple : label .label label: int_SND_Player est exécuté à la seconde interruption... et normalement, le compteur d'interruption doit passer à 2 une fois par VBL (à condition d'être synchro avec la VBL ce que fait le morceau de code qui réinitialise le compteur à &ff (qui devient 0 à la 1ière interruption)) |
|
| Auteur : | fano [ 01 Mars 2011, 08:36 ] |
| Sujet du message : | Re: Questions sur les interruptions |
Le point c'est l'habitude de NASM mais à mon grand regret WINAPE ne gère pas les labels locaux (Démoniak si tu m'entends !) donc c'est inutile , je les garde juste pour faire ressortir les labels du reste. Sinon , tu as tout compris , int_SND_Player est exécuté pour la seconde interruption à chaque frame. Il y 8 adresses dans la table pour des questions de simplicité (un AND 7 c'est plus facile et rapide que de capper à 5) et il se peut que le code ne soit pas synchro sur la première frame et c'est pour ça qu'il faut renseigner les deux adresses en trop. |
|
| Auteur : | Longshot [ 01 Mars 2011, 11:27 ] |
| Sujet du message : | Re: Questions sur les interruptions |
Citer : en IM2 tu peux choisir moyennant un bradage de 256 octets 257...et calés sur une frontière de page. L'adresse du vecteur d'interruption est composée du registre Z80A I et d'un octet aléatoire. L'octet aléatoire peut être FF, donc le Z80A doit aller chercher le reste de l'adresse sur la page suivante. |
|
| Auteur : | dentifiant [ 01 Mars 2011, 16:49 ] |
| Sujet du message : | Re: Questions sur les interruptions |
Bon, je crois que j'ai tout bien compris tout ça, du moins ce qui va m'être utile dans les jours à venir. Pour le mode IM2, je verrais ça plus tard. Apprenons à marcher avant de se mettre à courire. |
|
| Page 1 sur 1 | Le fuseau horaire est UTC+1 heure |
| Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |
|