MSX Village forum

La Place des Développeurs [Réglé] Besoin d'aide pour appel sous routine ASM

Fabf Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 06/02/2012 à 21h14
J'aurais besoin de l'aide d'un programmeur confirmer :oups

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
Visiteur

Vagabond

Rang

Avatar

Message : 0

Le 06/02/2012 à 22h34
Bête question : la ligne 80 est-elle vraiment requise vu que l'adresse de la routine est définie en ligne 60 ? :'(

J'essayerais sans la ligne 80 et avec 90 modifié comme suit : Y=USR(0) Edité par Visiteur Le 06/02/2012 à 22h39
   
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10356

Le 07/02/2012 à 10h31
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 !!


:noel
Site web    
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 777

Le 07/02/2012 à 19h12
Un classique: il y a inversion entre l'octet de "poids faible" et celui de "poids fort", sinon pour la suite... :hum

Petit rappel sur la fonction USR:
Y=USR N° (X)
Appelle le programme en langage machine défini par DEFUSR .
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 :heink , 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 :fou ... ou presque :D
osaurer
   
Fabf Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 07/02/2012 à 20h49
Merci pour vos réponses

Pour répondre à Jipé, j'essaie de faire une routine de scrolling sur un caractère :fou

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 :top
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

MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 777

Le 07/02/2012 à 23h10
Fabf :


J'aime bien ta combine pour optimiser le programme :top

Est ce qu'il ne manque pas un 23 entre 5E et 56 ?




En effet, :oups merci, c'est corrigé :top


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
Fabf Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 08/02/2012 à 17h49
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 :gre
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 09/02/2012 à 09h47
Fabf :
J'ai corrigé ma routine mais j'ai toujours ce problème de syntax error in 90

C'est énervant à la fin :gre




Ben, c'est un peu normal ... Vu que, sauf erreur de ma part, ta routine ne fait pas grand chose :s



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 :heink



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

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 09/02/2012 à 19h03
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 :hum
Fabf Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 09/02/2012 à 19h09
Ca marche :glass

La routine est
100 DATA 23,23,5e,23,56,eb,01,00,08,11,80,07,cd,5c,00,c9

Merci à tous :tchin Edité par Fabf Le 09/02/2012 à 19h58
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 10/02/2012 à 08h10
De rien :tchin
Et elle fait quoi ta routine ?


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)
   
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 10/02/2012 à 10h28
C'est plus lent mais on peut aussi faire l'inversion en Basic de cette façon :

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

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 10/02/2012 à 22h19
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 :D

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

Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 11/02/2012 à 10h39
Fabf :
Il ne manque plus que la sychro avec le rafraichissement et se sera parfait

Si quelqu'un pouvait m'aiguiller ;)




Ouh là :s

C'est pas une petite chose que tu demandes là :lol



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)
   
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 11/02/2012 à 11h42
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