La Place des Développeurs [Réglé] Besoin d'aide pour appel sous routine ASM
Reprise du message précédent
Metalion :
Il y a plusieurs façons de faire. La plus simple, c'est de mettre une instruction "HALT" avant l'opération en VRAM. Cette instruction met le processeur en pause jusqu'à l'arrivée d'une interruption. Comme le VDP génère une interruption à chaque VBLANK (à la fin du balayage de l'écran), ton programme va redémarrer à l'arrivée de cette interruption, et donc le rafraichissement de l'écran va rythmer l'éxecution de ton programme.
Très mauvaise solution.
Mieux vaut utiliser le hook pour insérer ta routine et lire le registre 0 du VDP pour voir si c'est une interruption du VDP ou pas.
GDX :
Très mauvaise solution
Je ne dirait pas qu'elle est "très mauvaise"
Elle n'est pas parfaite car pas entièrement fiable.
Mais vu qu'il débute, c'est une approche plus facile même si elle a ses problèmes.
Les autres méthodes sont beaucoup plus fiables, mais elles sont beaucoup plus compliquées à mettre en oeuvre. Edité par Metalion Le 11/02/2012 à 13h27
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
Fabf
Membre non connecté
Conseiller Municipal
J'ai rajouté un HALT avant l'appel de la routine bios 5C et le résultat est pas mal du tout
Maintenant je vais bosser sur les GFX pour faire quelque chose sympa
Maintenant je vais bosser sur les GFX pour faire quelque chose sympa
Fabf
Membre non connecté
Conseiller Municipal
Fabf
Membre non connecté
Conseiller Municipal
Le voila tout chaud
Comme je le disais je dois encore revoir les GFX car là ça pique les yeux
scroll.zip Edité par Fabf Le 12/02/2012 à 21h02
Comme je le disais je dois encore revoir les GFX car là ça pique les yeux
scroll.zip Edité par Fabf Le 12/02/2012 à 21h02
Fabf
Membre non connecté
Conseiller Municipal
Tu annule la boucle en mettant un négatif comme ça
Donc ça tourne à pleine vitesse
Tu peux aussi modifier
140 FOR A=&H44 TO &H44+7
par
140 FOR A=&H44+7 TO &H44 step-1
Donc ça tourne à pleine vitesse
Tu peux aussi modifier
140 FOR A=&H44 TO &H44+7
par
140 FOR A=&H44+7 TO &H44 step-1
En Basic, le moindre détail peut accélérer le programme. Voici ton programme à l'identique mais plus lisible et plus rapide :
Explications :
- Mieux vaut mettre les valeurs qui concernent les adresses et la partie langage machine en hexadécimal.
- J'ai mis 300 au CLEAR car l'insruction String$ prend 192 octects à elle seule.
- Ne pas oublier le WIDTH si le programme est en SCREEN 0 ou 1.
- Une petite boucle FOR ~ NEXT est plus rapide sur une même ligne.
- Faire un PRINT de 4 STRING$ est plus rapide qu'avec une boucle FOR ~ NEXT
- Je trouve les boucles FOR ~ NEXT plus lisible comme ça.
- Ça sert à rien de déclarer des variables supplémentaires pour le USR donc je réutilise B à la place de Y et je vire X.
- Dans la partie machine, j'ai mis un JP au lieu d'un CALL pour éviter un RET, ça fait gagner 17 cycles et un octet !
- Tu peux récuppérer ton programme BASIC avec un éditeur de text si tu sauvegardes ton programme avec SAVE"SCROLL.BAS",A. Edité par GDX Le 13/02/2012 à 05h40
Citation :
10 CLEAR 300,&HC57F
20 COLOR 15,1,1:SCREEN1:KEY OFF:WIDTH32
30 FOR A=&HC580 TO A+17:READ A$:POKE A,VAL("&h"+A$):NEXT
40 FOR A=&HC544 TO A+15:READ B:POKE A,B:NEXT
50 DEFUSR=&HC580:POKE&HC57E,&HC5
60 PRINT STRING$(192,240);STRING$(192,240);STRING$(192,240);STRING$(192,240);
70 FOR A=&H44 TO A+7
80 FOR B=1 TO 20:NEXT B
90 POKE&HC57F,A:B=USR(0):NEXT
100 GOTO 70
110 DATA 3a,7e,c5,67,3a,7f,c5,6f,01,16,00,11,80,07,76,C3,5C,00
120 DATA 24,36,66,129,129,66,36,24
130 DATA 24,36,66,129,129,66,36,24
20 COLOR 15,1,1:SCREEN1:KEY OFF:WIDTH32
30 FOR A=&HC580 TO A+17:READ A$:POKE A,VAL("&h"+A$):NEXT
40 FOR A=&HC544 TO A+15:READ B:POKE A,B:NEXT
50 DEFUSR=&HC580:POKE&HC57E,&HC5
60 PRINT STRING$(192,240);STRING$(192,240);STRING$(192,240);STRING$(192,240);
70 FOR A=&H44 TO A+7
80 FOR B=1 TO 20:NEXT B
90 POKE&HC57F,A:B=USR(0):NEXT
100 GOTO 70
110 DATA 3a,7e,c5,67,3a,7f,c5,6f,01,16,00,11,80,07,76,C3,5C,00
120 DATA 24,36,66,129,129,66,36,24
130 DATA 24,36,66,129,129,66,36,24
Explications :
- Mieux vaut mettre les valeurs qui concernent les adresses et la partie langage machine en hexadécimal.
- J'ai mis 300 au CLEAR car l'insruction String$ prend 192 octects à elle seule.
- Ne pas oublier le WIDTH si le programme est en SCREEN 0 ou 1.
- Une petite boucle FOR ~ NEXT est plus rapide sur une même ligne.
- Faire un PRINT de 4 STRING$ est plus rapide qu'avec une boucle FOR ~ NEXT
- Je trouve les boucles FOR ~ NEXT plus lisible comme ça.
- Ça sert à rien de déclarer des variables supplémentaires pour le USR donc je réutilise B à la place de Y et je vire X.
- Dans la partie machine, j'ai mis un JP au lieu d'un CALL pour éviter un RET, ça fait gagner 17 cycles et un octet !
- Tu peux récuppérer ton programme BASIC avec un éditeur de text si tu sauvegardes ton programme avec SAVE"SCROLL.BAS",A. Edité par GDX Le 13/02/2012 à 05h40
Fabf
Membre non connecté
Conseiller Municipal
T'as la forme toi à 5h00 du mat
J'ai en effet pas optimisé le programme basic, c'était juste pour exploiter la routine.
Merci pour les conseils et bravo pour le JP
Je vais tester ce soir sur 2x2 blocs
J'ai en effet pas optimisé le programme basic, c'était juste pour exploiter la routine.
Merci pour les conseils et bravo pour le JP
Je vais tester ce soir sur 2x2 blocs
Fabf :
Le voila tout chaud
Comme je le disais je dois encore revoir les GFX car là ça pique les yeux
Comme je le disais je dois encore revoir les GFX car là ça pique les yeux
Joli
Bravo pour cette première expérience
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
Répondre
Sujet verrouillé, vous ne pouvez pas poster de message