Samuel Devulder a écrit:
Bon j'ai pas cherché à compiler, j'ai juste regardé le code et il y a cette partie que je ne comprends pas. Tu peux m'expliquer?
Code:
LDB $6019 <== lecture status
ANDB #251 <== effacement b2 (clignotement curseur)
STB $6019 <== mise à jour status
JSR PUTC <== envoie de n'importe quoi dans PUTC
LDB #<un code>
..trucs space que je pige pas sans doute un forçage du mode BM16 par poke..
..2e putc pour passer en BM16..
Il ne manquerait pas un LDB #27 avant le premier PUTC ? C'est sans doute pour ca que le programme ne passe pas en BM16.
En fait j'ai fait un rapide copier coller avant de te l'envoyer.
Originellement (avant de yester le mode page) j'avais mis:
Code:
MAIN LDB #$1B sequence d echappement
JSR PUTC
LDB #$5E Mode bm16c
JSR PUTC
Pour passer en mode bm16, mais comme je l'ai déjà dit auparavant, ça ne marchait plus pour les écrans "mode page" étant dans les banque RAM 2 et 3! Et c'est pour ça que j'ai mis
Code:
LDB #$7B Mode bm16c
STB MODVID Stocke bm16
Pour le passage en mode bm16 pour TOUS les écran (bank 0 à 3)
Citation:
La façon d'éviter le clignotement du curseur, m'interpelle. En effet j'ai toujours utilisé PUTC pour cela (LDB #$14 puis JSR PUTC ==> c'est plus court). Tu ne voulais pas plutôt effacer le bit 5 (rapport aux interruptions) et pas le bit 2 (curseur) ?
Pendant l'animation du sprite, il n'y a pas de clignotement du curseur (normal puisque c'est détourné via ma routine). D'autres part, dans la procédure d'initialisation du timer, on fait déjà appel au STATUS (6019) avec un ORA "$20 (IRQ Timer validé) sauf qu'à cette instant, je me demande s'il n'était pas validé déjà avant et du coup... l'initialisation n'utilise pas les anciennes valeur ? Normalement non... Ok je vais essayer de faire un test en
Citation:
Par ailleurs j'ai constaté que quand la ROM force le b2 (que tu as effacé) à 1 (par exemple avec LDB #$11 puis JSR PUTC), elle reset le timer à sa valeur initiale.
Normal c'est ce que c'est sensé faire (manuel de 'lassembleur 2.0 pour les TO8, p14 de la partie ""moniteur")
Citation:
Est-ce qu'il n'y aurait pas un lien entre les deux ? Probablement que oui vu que tu perds la valeur mise dans le timer. En fait en retour d'EXEC qui est à la fin du programme, le basic rends la main au prompt avec un bel OK accompagné d'un #$11 qui est.. une demande d'affichage du curseur.
Euh ça ne rend la main au basic que quand toute l'animation est finie, et en plus de mon côté ça ne rend pas la main puisque les banque RAM 2 et 3 sont effacées... En fait, j'avais écrit un code précédent plus simple dans lequel le changement de valeur de timer fonctionnait. Il faut que je vois ce qui a changé entre les 2.
Citation:
Ensuite:
Code:
LDA >REGSY1 Activation Mode Page..
ORA #16 ...pour Banques RAM
STA >REGSY1
lit $E7E7 qui ne contient pas la même chose qu'en écriture (on dit qu'en fait il est en écriture seule). La bonne façon de faire est:
Code:
LDA >$6081 Activation Mode Page..
ORA #16 ...pour Banques RAM
STA >REGSY1
STA >$6081
Ben de ce côté là; mon code fonctionne parfaitement. Je n'ai jamais vu un quelconque système informatique dans lequel ce qui est accessible en écriture ne peut être accessible en lecture (notamment les fs linux) J'ai répondu à Daniel de ce côté là. En plus 6081 est documenté comme étant un "buffer clavier". Bizarre non ?
Citation:
Enfin à la fin de ton interruption tu fais:
Code:
LDA >DPINIT
TFR A,DP
JMP KBIN Contient un RTS
ce qui est doublement curieux. D'une part tu mets dans le DP de retour d'interruption la valeur de DP à l'entrée de ton programme principal. Or quand l'interruption se produit le DP peut être différent de celui à l'entrée du MAIN (le moniteur l'utilise en interne), et donc tu écraserait celui qu'il y avait au moment où l'interruption est arrivée. Ca peut poser des bugs.... sauf que non en fait, car KBIN se termine par un RTI (et pas un RTS), qui a la propriété --IRQ oblige-- de restaurer tous les registres CPU, DP y compris. Donc pas besoin de remettre la valeur supposée qui en fait n'est pas la bonne. C'est une opération totalement inutile (et dangereuse car le DP au moment de l'interruption n'est pas forcément celui que tu avais dans le MAIN).
Eh non en fait!! Et c'était sur ton conseil que j'avais fait ça d'ailleur!! Tu lm'avais conseillé de changer le DP non pas dans le prog principal mais dans la routine du timer... Ce que j'ai fait d'ailleurs (en début de routine je l'initialise à $72 pour coller au DPINIT de l'affichage du sprite). Et puisqu'en foin de routine je 'nai plus besoin que le DP soit à $72, je ne réinitialise avec la valeur qu'il avait avant l'appel à la routine timer avant le JMP, ça ne change rien à ce qui se passe après.