La Place des Développeurs [Réglé] Besoin d'aide pour appel sous routine ASM
Fabf
Membre non connecté
Conseiller Municipal
J'aurais besoin de l'aide d'un programmeur confirmer
J'ai fait une petite routine en langage machine (surement truffée d'erreurs) que je ne peux malheureusement pas tester car j'ai un syntax error ligne 90
Je ne crois pas avoir fait d'erreur de syntax, je comprend pas bien ce qui ce passe
Voici le listing
10 CLEAR 200,50559!
20 SCREEN1
30 FOR A=50560! TO 50560!+17
40 READ A$:POKE A,VAL("&h"+A$)
50 NEXT
60 DEFUSR0=50560!
70 PRINT STRING$(10,240)
80 X=50560!
90 Y=USR0(X)
100 DATA 3a,f7,f8,67,3a,f7,f9,6f,3e,80,07,12,3e,08,02,cd,5c,c9
Merci par avance
J'ai fait une petite routine en langage machine (surement truffée d'erreurs) que je ne peux malheureusement pas tester car j'ai un syntax error ligne 90
Je ne crois pas avoir fait d'erreur de syntax, je comprend pas bien ce qui ce passe
Voici le listing
10 CLEAR 200,50559!
20 SCREEN1
30 FOR A=50560! TO 50560!+17
40 READ A$:POKE A,VAL("&h"+A$)
50 NEXT
60 DEFUSR0=50560!
70 PRINT STRING$(10,240)
80 X=50560!
90 Y=USR0(X)
100 DATA 3a,f7,f8,67,3a,f7,f9,6f,3e,80,07,12,3e,08,02,cd,5c,c9
Merci par avance
j'ai dessassemblé ton programme et ça donne ça
C580 3AF7F8 LD A,(0F8F7H) ; zone des touches de fonction
C583 67 LD H,A
C584 3AF7F9 LD A,(0F9F7H) ; queue musicale pour la voie B
C587 6F LD L,A
C588 3E80 LD A,80H
C58A 07 RLCA
C58B 12 LD (DE),A
C58C 3E08 LD A,08H
C58E 02 LD (BC),A
C58F CD5CC9 CALL 0C95CH ; appel d'une autre routine ????
je ne vois pas a quoi ça sert si tu expliquais un peu !!
C580 3AF7F8 LD A,(0F8F7H) ; zone des touches de fonction
C583 67 LD H,A
C584 3AF7F9 LD A,(0F9F7H) ; queue musicale pour la voie B
C587 6F LD L,A
C588 3E80 LD A,80H
C58A 07 RLCA
C58B 12 LD (DE),A
C58C 3E08 LD A,08H
C58E 02 LD (BC),A
C58F CD5CC9 CALL 0C95CH ; appel d'une autre routine ????
je ne vois pas a quoi ça sert si tu expliquais un peu !!
Un classique: il y a inversion entre l'octet de "poids faible" et celui de "poids fort", sinon pour la suite...
Petit rappel sur la fonction USR:
Petit rappel sur la fonction USR:
Y=USR N° (X)
Appelle le programme en langage machine N° défini par DEFUSR N°.
Y : variable à laquelle sera atribuée la valeur de l’opération effectuée sur X par le programme chargé..
X :variable par laquelle on envoie une valeur dans le programme en LM..
Dans le tableau suivant sont données les différentes valeurs entrée en LM suivant la nature de X.
A la fin du programme Y est donné de la même façon.
Le MSXien le plus à l'ouest ... ou presque
Y : variable à laquelle sera atribuée la valeur de l’opération effectuée sur X par le programme chargé..
X :variable par laquelle on envoie une valeur dans le programme en LM..
Dans le tableau suivant sont données les différentes valeurs entrée en LM suivant la nature de X.
A la fin du programme Y est donné de la même façon.
Type X |
Valeur du registre A et adresse &HF663 |
Valeur de HL (Pointe à l'adresse...) |
Adresse de stockage de X |
Entier | 2 | &HF7F6 | &HF7F8 - &HF7F9 |
Simple précision | 4 | &HF7F6 | &HF7F6 - &HF7F9 |
Double precision | 8 | &HF7F6 | &HF7F6 - &HF7FD |
Suivant ça il y a une méthode plus simple et qui évite les erreurs: HL a pour valeur &HF7F6 je l'incrémente 2 fois et je me retrouve sur &HF7F8 , j'attribue l'adresse pointé par HL à E ,encore un incrémentation et j'attribue la valeur pointée par HL à D et j'ai récupéré ma valeur X dans DE il n'ya plus qu'à corrigé la suite. Cela donne:
23 | INC HL | HL= &HF7F7 |
23 | INC HL | HL= &HF7F8 |
5E | LD E,(HL) | octet de poids faible de X dans E |
23 | INC HL | HL= &HF7F7 |
56 | LD D,(HL) | octet de poids faible de X dans D |
EB | EX DE,HL | valeur de X(DE) dans HL... |
Le MSXien le plus à l'ouest ... ou presque
Fabf
Membre non connecté
Conseiller Municipal
Merci pour vos réponses
Pour répondre à Jipé, j'essaie de faire une routine de scrolling sur un caractère
Sinon bravo MSXosaure à tout compris (même mon erreur d'inversion entre l'octet de "poids faible" et de "poids fort")
J'aime bien ta combine pour optimiser le programme
Est ce qu'il ne manque pas un 23 entre 5E et 56 ?
Ce soir ça va être court mais dès que je peux je retente l'expérience
Pour répondre à Jipé, j'essaie de faire une routine de scrolling sur un caractère
Sinon bravo MSXosaure à tout compris (même mon erreur d'inversion entre l'octet de "poids faible" et de "poids fort")
J'aime bien ta combine pour optimiser le programme
Est ce qu'il ne manque pas un 23 entre 5E et 56 ?
Ce soir ça va être court mais dès que je peux je retente l'expérience
Fabf
Membre non connecté
Conseiller Municipal
J'ai corrigé ma routine mais j'ai toujours ce problème de syntax error in 90
10 CLEAR 200,50559!
20 SCREEN1
30 FOR A=50560! TO 50560!+14
40 READ A$:POKE A,VAL("&h"+A$)
50 NEXT
60 DEFUSR0=50560!
70 PRINT STRING$(10,240)
80 X=50560!
90 Y=USR0(X)
100 DATA 23,23,5e,23,56,eb,01,80,00,11,08,07,cd,5c,c9
C'est énervant à la fin
10 CLEAR 200,50559!
20 SCREEN1
30 FOR A=50560! TO 50560!+14
40 READ A$:POKE A,VAL("&h"+A$)
50 NEXT
60 DEFUSR0=50560!
70 PRINT STRING$(10,240)
80 X=50560!
90 Y=USR0(X)
100 DATA 23,23,5e,23,56,eb,01,80,00,11,08,07,cd,5c,c9
C'est énervant à la fin
Fabf :
J'ai corrigé ma routine mais j'ai toujours ce problème de syntax error in 90
C'est énervant à la fin
C'est énervant à la fin
Ben, c'est un peu normal ... Vu que, sauf erreur de ma part, ta routine ne fait pas grand chose
Code :
INC HL
INC HL
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
OK, tu récupères la valeur de X dans HL.
Code :
LD BC, 0080h
LD DE, 0708h
Tu charges les valeurs 0080h dans BC et 0708h dans DE.
Code :
CALL C95Ch
Tu appelles une routine en C95Ch.
Et sauf si tu y a mis quelque chose, il n'y a RIEN en C95Ch
Même si il y avait quelque chose, une fois que tu en reviens, il n'y a pas de RET pour rendre la main.
Edité par Metalion Le 09/02/2012 à 10h17
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
Je me suis encore trompé
Désolé mais c'est ma première tentative en assembleur
La routine est en 5ch donc ma routine doit être :
100 DATA 23,23,5e,23,56,eb,01,80,00,11,08,07,cd,00,5c,c9
Je vais tester mais je pense qu'un appel d'un routine doit marcher même si la routine est mauvaise non
Désolé mais c'est ma première tentative en assembleur
La routine est en 5ch donc ma routine doit être :
100 DATA 23,23,5e,23,56,eb,01,80,00,11,08,07,cd,00,5c,c9
Je vais tester mais je pense qu'un appel d'un routine doit marcher même si la routine est mauvaise non
C'est plus lent mais on peut aussi faire l'inversion en Basic de cette façon :
La variable a ne doit pas dépasser 255. Le mieux c'est de définir a en variable de type entier. Edité par GDX Le 10/02/2012 à 10h37
Code TEXT :
a=(a/16)+(a and 15)*16
La variable a ne doit pas dépasser 255. Le mieux c'est de définir a en variable de type entier. Edité par GDX Le 10/02/2012 à 10h37
Fabf
Membre non connecté
Conseiller Municipal
Le but de cette routine est un scrolling verticale par copy de RAM en VRAM
Bon j'ai un peu corrigé la routine car ça marchait pas terrible en passant un paramètre par USR
J'utilise des pokes à la place et ça marche très bien
Le code :
LD A,(C57E)
LD H,A
LD A,(C57F)
LS L,A
LD BC,16
LD DE,240
CALL 5C
RET
Je vais sans doute aller un peu plus loin avec une forme sur 4 caractères
Il ne manque plus que la sychro avec le rafraichissement et se sera parfait
Si quelqu'un pouvait m'aiguiller
En tout cas je suis super content de ma première routine en assembleur
Voici le listing
10 CLEAR 200,50559!
20 COLOR 15,1,1:SCREEN1:KEY OFF
30 FOR A=50560! TO 50560!+17
40 READ A$:POKE A,VAL("&h"+A$)
50 NEXT
60 FOR A=50500! TO 50515!
70 READ B:POKE A,B
80 NEXT
90 DEFUSR0=50560!
100 POKE 50558!,&HC5
110 FOR A=1 TO 23
120 PRINT STRING$(28,240)
130 NEXT
140 FOR A=&H44 TO &H44+7
150 FOR B=1 TO 25:NEXT B
160 POKE 50559!,A
170 Y=USR0(X)
180 NEXT
190 GOTO 140
200 DATA 3a,7e,c5,67,3a,7f,c5,6f,01,16,00,11,80,07,CD,5C,00,C9
210 DATA 24,36,66,129,129,66,36,24
220 DATA 24,36,66,129,129,66,36,24
Bon j'ai un peu corrigé la routine car ça marchait pas terrible en passant un paramètre par USR
J'utilise des pokes à la place et ça marche très bien
Le code :
LD A,(C57E)
LD H,A
LD A,(C57F)
LS L,A
LD BC,16
LD DE,240
CALL 5C
RET
Je vais sans doute aller un peu plus loin avec une forme sur 4 caractères
Il ne manque plus que la sychro avec le rafraichissement et se sera parfait
Si quelqu'un pouvait m'aiguiller
En tout cas je suis super content de ma première routine en assembleur
Voici le listing
10 CLEAR 200,50559!
20 COLOR 15,1,1:SCREEN1:KEY OFF
30 FOR A=50560! TO 50560!+17
40 READ A$:POKE A,VAL("&h"+A$)
50 NEXT
60 FOR A=50500! TO 50515!
70 READ B:POKE A,B
80 NEXT
90 DEFUSR0=50560!
100 POKE 50558!,&HC5
110 FOR A=1 TO 23
120 PRINT STRING$(28,240)
130 NEXT
140 FOR A=&H44 TO &H44+7
150 FOR B=1 TO 25:NEXT B
160 POKE 50559!,A
170 Y=USR0(X)
180 NEXT
190 GOTO 140
200 DATA 3a,7e,c5,67,3a,7f,c5,6f,01,16,00,11,80,07,CD,5C,00,C9
210 DATA 24,36,66,129,129,66,36,24
220 DATA 24,36,66,129,129,66,36,24
Fabf :
Il ne manque plus que la sychro avec le rafraichissement et se sera parfait
Si quelqu'un pouvait m'aiguiller
Si quelqu'un pouvait m'aiguiller
Ouh là
C'est pas une petite chose que tu demandes là
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.
Mais le problème, c'est que il y a d'autres interruptions que celles générées par le VDP (lecteur disquette, notamment) et donc il y a un risque de ne pas être synchrone, car toutes les interruptions auront le même effet sur l'instruction "HALT".
Les autres façons de faire sont plus complexes :
1) Tu initialises ton programme et tu greffes au hook H.TIMI un appel à une sous-routine. Tu fais boucler ton programme et ce sont les interruptions du VDP (mais cette fois uniquement elles, car l'appel au hook H.TIMI est filtré par la gestion des interruptions en 38h) qui déclenchent ta routine.
2) Sur MSX2, tu fais générer au VDP une interruption spécifique à la ligne que tu veux en jouant sur le registre R#19.
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)
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.
Répondre
Sujet verrouillé, vous ne pouvez pas poster de message