La Place des Développeurs Mes 1ers pas sur MSX ...
Reprise du message précédent
hello,@Guillaume, merci pour la modif
@Eric
>> n'oublie pas de mofier le ab02 pattern number par 1b02
il me semble que sdcc ajoute automatiquement
au debut de ta fonction asm
push ix
ld ix,#0
add ix,sp
et à la fin
pop ix
sauf si tu lui mets __naked
pour gtstck,
voila ce que je fais
unsigned char get_stick(unsigned char choix)
{
choix;
__asm
ld a,4(ix)
call 0x005d
ld hl,#_Direction // direction = variable globale dans laquelle est stockée l'une des 8 directions
ld (hl),a
__endasm;
}
{
choix;
__asm
ld a,4(ix)
call 0x005d
ld hl,#_Direction // direction = variable globale dans laquelle est stockée l'une des 8 directions
ld (hl),a
__endasm;
}
Si je comprends ta 2e routine,
ld a,l est equivalent à ld a,4(ix)
et pour
ld l,a le registre 'l' récupère directement la 'direction' ??
je pourrais donc écrire : direction = Joystick(0); par exemple pour le clavier
et faire
switch (direction) ou directement switch ( Joystick(0))
case 0 : blabla; break;
case 1 : blabla; break;
case 2 : blabla; break;
..
..
case 8 : blabla; break;
?
j'ai encore bcp à apprendre
Merci en tout cas
Bonne soirée
Eric Edité par Ricco59 Le 02/01/2021 à 21h04
aoineko
Membre non connecté
Conseiller Municipal
Ricco59 :
oui, tu peux transformer ericm59 en ricco59, no soucaille
C'est fait :
- Ericm59 => Ricco59
- Ricco59 => Ricco59_bis
Ricco59 :
il me semble que sdcc ajoute automatiquement
Ca dépend quelle version de SDCC tu utilises.
Depuis la 3.0 (ou 3.X ), ce n'est plus le cas, même quand la fonction n'est pas naked.
Je sais pas pourquoi ils ont fait ça ; ça m'a obligé à réécrire une partie de ma lib.
Ricco59 :
Si je comprends ta 2e routine,
ld a,l est equivalent à ld a,4(ix)
ld a,l est equivalent à ld a,4(ix)
Quand tu utilises la directive __z88dk_fastcall, le compilateur va mettre la valeur du paramètre d'entrée de ta fonction directement dans le registre L (sans passer par la pile).
Ca ne marche (malheureusement) que si ta fonction n'a qu'un seul paramètre.
En fonction de la taille de ton paramètre, il va le mettre dans les registres :
- 8-bits : L
- 16-bits : HL
- 32-bits : DE et HL
Pour la valeur de retour, le compilateur passe toujours par les registres (selon la même règle en fonction de la taille de ton paramètre de retour).
Ricco59 :
ld l,a le registre 'l' récupère directement la 'direction' ??
Toutafé
Code TEXT :
Address ... 11EEH (from 00D5H) Name ...... GTSTCK (Get joyStick status) Input ..... A=Joystick ID (0, 1 or 2) Exit ...... A=Joystick position code Modifies .. AF, B, DE, HL, EI Standard routine to read the position of a joystick or the four cursor keys. If the supplied ID is zero the state of the cursor keys is read via PPI Port B (1226H) and converted to a position code using the look-up table at 1243H. Otherwise joystick connector 1 or 2 is read (120CH) and the four direction bits converted to a position code using the look-up table at 1233H. The returned position codes are: 1 8 | 2 \ | / \|/ 7----0----3 /|\ / | \ 6 | 4 5
On est toujours ignorant avant de savoir.
re
J'avais fait des essais cet am et un peu ce soir et...
unsigned char direction;
unsigned char get_stick(unsigned char choix)__z88dk_fastcall
{
choix;
__asm
push af
ld a,l // = ld a,4(ix)
call 0x00d5
ld l,a
pop af
__endasm;
}
switch(get_stick(0))
{
case 0: direction = 0; break;
case 1: direction = 1; break;
case 2: direction = 2; break;
case 3: direction = 3; break;
case 4: direction = 4; break;
case 5: direction = 5; break;
case 6: direction = 6; break;
case 7: direction = 7; break;
case 8: direction = 8; break;
}
pour les direction, ca marche même sous 8bitworkshop : qd j'appuie sur les touches, 'direction' prend bien les valeurs adequates
par contre pour le fire1 ou 2, ca marche pô... mais ca va marcher
unsigned char get_trigger(unsigned char choix) __z88dk_fastcall
{
choix;
__asm
push af
ld a,l
call 0x00d8
ld l,a
pop af
__endasm;
switch(get_trigger(0))
{
case 0: fire = 0; break;
case 1: fire = 1; break;
case 2: fire = 2; break;
}
là, j'ai rien... je continuerai mes recherches demain dès que j'ai quelques minutes.
Merci encore Edité par Ricco59 Le 03/01/2021 à 00h28
J'avais fait des essais cet am et un peu ce soir et...
unsigned char direction;
unsigned char get_stick(unsigned char choix)__z88dk_fastcall
{
choix;
__asm
push af
ld a,l // = ld a,4(ix)
call 0x00d5
ld l,a
pop af
__endasm;
}
switch(get_stick(0))
{
case 0: direction = 0; break;
case 1: direction = 1; break;
case 2: direction = 2; break;
case 3: direction = 3; break;
case 4: direction = 4; break;
case 5: direction = 5; break;
case 6: direction = 6; break;
case 7: direction = 7; break;
case 8: direction = 8; break;
}
pour les direction, ca marche même sous 8bitworkshop : qd j'appuie sur les touches, 'direction' prend bien les valeurs adequates
par contre pour le fire1 ou 2, ca marche pô... mais ca va marcher
unsigned char get_trigger(unsigned char choix) __z88dk_fastcall
{
choix;
__asm
push af
ld a,l
call 0x00d8
ld l,a
pop af
__endasm;
switch(get_trigger(0))
{
case 0: fire = 0; break;
case 1: fire = 1; break;
case 2: fire = 2; break;
}
là, j'ai rien... je continuerai mes recherches demain dès que j'ai quelques minutes.
Merci encore Edité par Ricco59 Le 03/01/2021 à 00h28
ericb59
Membre non connecté
Conseiller Municipal
ça marche pas parceque tu n'utilises pas les bons paramètres...
Voici pour Trigger
Input : A - Trigger button to test
0 = space bar
1 = port 1, button A
2 = port 2, button A
3 = port 1, button B
4 = port 2, button B
Output : A - #00 trigger button not pressed
#FF trigger button pressed Edité par ericb59 Le 03/01/2021 à 07h43
Voici pour Trigger
Input : A - Trigger button to test
0 = space bar
1 = port 1, button A
2 = port 2, button A
3 = port 1, button B
4 = port 2, button B
Output : A - #00 trigger button not pressed
#FF trigger button pressed Edité par ericb59 Le 03/01/2021 à 07h43
oui j'avoue, je n'avais plus les yeux en face des trous
là ca marche. Yapuka implanter le tout dans mon menu
while (1) { switch(get_stick(0))
{
case 0: direction = 0; break;
case 1: direction = 1; break;
case 2: direction = 2; break;
case 3: direction = 3; break;
case 4: direction = 4; break;
case 5: direction = 5; break;
case 6: direction = 6; break;
case 7: direction = 7; break;
case 8: direction = 8; break;
}
switch(get_trigger(1))
{
case 0: fire1 = 0; break;
case 255: fire1 = 255; break;
}
switch(get_trigger(3))
{
case 0: fire2 = 0; break;
case 255: fire2 = 255; break;
}
__asm
halt
__endasm;
}
Bon dimanche a tous
là ca marche. Yapuka implanter le tout dans mon menu
while (1) { switch(get_stick(0))
{
case 0: direction = 0; break;
case 1: direction = 1; break;
case 2: direction = 2; break;
case 3: direction = 3; break;
case 4: direction = 4; break;
case 5: direction = 5; break;
case 6: direction = 6; break;
case 7: direction = 7; break;
case 8: direction = 8; break;
}
switch(get_trigger(1))
{
case 0: fire1 = 0; break;
case 255: fire1 = 255; break;
}
switch(get_trigger(3))
{
case 0: fire2 = 0; break;
case 255: fire2 = 255; break;
}
__asm
halt
__endasm;
}
Bon dimanche a tous
Par sécurité
aoineko
Membre non connecté
Conseiller Municipal
Ricco59 :
Par sécurité
A moins que tu utilises cette fonction dans le hook H.TIMI (celui qui est appelé par les interruptions du VDP), tu n'as aucun besoin de sauvegarder le registre A.
On est toujours ignorant avant de savoir.
merci les potos, je récupère 4 octets
H.TIMI : pour l'instant je ne m'en sers pas. Est-ce utilisé dans une boucle pour jouer de la musique indépendamment du jeu par exemple et qui reste a 50i/s ou 60 alors que le jeu peut lui être en 25is/s ?
Bon dimanche
H.TIMI : pour l'instant je ne m'en sers pas. Est-ce utilisé dans une boucle pour jouer de la musique indépendamment du jeu par exemple et qui reste a 50i/s ou 60 alors que le jeu peut lui être en 25is/s ?
Bon dimanche
aoineko
Membre non connecté
Conseiller Municipal
Ricco59 :
H.TIMI : pour l'instant je ne m'en sers pas. Est-ce utilisé dans une boucle pour jouer de la musique indépendamment du jeu par exemple et qui reste a 50i/s ou 60 alors que le jeu peut lui être en 25is/s ?
Sans utiliser H.TIMI pour synchroniser ta boucle de jeu, celle-ci ne fait pas 25ips... en fait, elle fait un nombre indéterminé et variable de ips (en fonction de la complexité du code exécuté durant une boucle donnée).
Cela pose effectivement des problèmes pour la musique, mais pas que. Si tu bouges ton personnage de 1px à chaque frame par ex., son déplacement ne sera pas parfaitement homogène sans synchronisation.
Tiens, voici le code que j'utilise dans ma lib :
Code C :
typedef void (*callback)(void); // Callback default signature static u8 g_VBlank; static u8 g_Frame; // H_TIMI interrupt hook void VBlankHook() { g_VBlank = 1; } // Wait for V-Blank period void WaitVBlank() { while(g_VBlank == 0) {} g_VBlank = 0; g_Frame++; } // Set a Hook to jump to given function void Bios_SetHookCallback(u16 hook, callback cb) { *((u8*)hook) = 0xC3; // JUMP *((callback*)++hook) = cb; } // Program entry point void main() { g_VBlank = 0; g_Frame = 0; Bios_SetHookCallback(H_TIMI, VBlankHook); while(1) { // ... ta boucle de jeu ... // WaitVBlank(); } }
PS : u8 et u16 sont respectivement des unsigned char et unsigned short.
On est toujours ignorant avant de savoir.
Salut les zamis,
Voici une ch'tite video du Menu part 1/2 de Where Is It ?
A bientôt
Eric
https://youtu.be/oOMG4TCj95k Edité par Ricco59 Le 10/01/2021 à 00h31
Voici une ch'tite video du Menu part 1/2 de Where Is It ?
A bientôt
Eric
https://youtu.be/oOMG4TCj95k Edité par Ricco59 Le 10/01/2021 à 00h31
hello
oui ça avance J'utilise les Sprites pour le 'PRESENTS'
pour attaquer la partie 2/2 du menu, j'ai encore un souci avec le stick. Lorsque je l'essaye sur 8bitworkshop, ca marche. Par contre lorsque je l'insère dans mon code, à la compilation j'ai :
warning 59 : function 'get_stick' must return value
warning 59 : function 'get_trigger' must return value
dans mon dossier utils.c j'ai
dans mon utils.h
unsigned char get_trigger(unsigned char choix)__z88dk_fastcall;
unsigned char get_stick(unsigned char choix)__z88dk_fastcall;
dans le main.c, je l'appelle comme cela :
if ((get_trigger(1)==255) && (Flag_KeyP == 1))
Il est évident que je merdouille kekpart. Si vous pouviez m'aider à mettre le doigt dessus...
Merci et bon dimanche les zamis
Edité par Ricco59 Le 10/01/2021 à 14h21
oui ça avance J'utilise les Sprites pour le 'PRESENTS'
pour attaquer la partie 2/2 du menu, j'ai encore un souci avec le stick. Lorsque je l'essaye sur 8bitworkshop, ca marche. Par contre lorsque je l'insère dans mon code, à la compilation j'ai :
warning 59 : function 'get_stick' must return value
warning 59 : function 'get_trigger' must return value
dans mon dossier utils.c j'ai
unsigned char get_stick(unsigned char choix)__z88dk_fastcall
{
choix;
__asm
ld a,l // = ld a,4(ix)
call 0x00d5
ld l,a
__endasm;
}
unsigned char get_trigger(unsigned char choix)__z88dk_fastcall
{
choix;
__asm
ld a,l
call GTTRIG
ld h,#0x00
ld l,a
__endasm;
}
{
choix;
__asm
ld a,l // = ld a,4(ix)
call 0x00d5
ld l,a
__endasm;
}
unsigned char get_trigger(unsigned char choix)__z88dk_fastcall
{
choix;
__asm
ld a,l
call GTTRIG
ld h,#0x00
ld l,a
__endasm;
}
dans mon utils.h
unsigned char get_trigger(unsigned char choix)__z88dk_fastcall;
unsigned char get_stick(unsigned char choix)__z88dk_fastcall;
dans le main.c, je l'appelle comme cela :
if ((get_trigger(1)==255) && (Flag_KeyP == 1))
Il est évident que je merdouille kekpart. Si vous pouviez m'aider à mettre le doigt dessus...
Merci et bon dimanche les zamis
Edité par Ricco59 Le 10/01/2021 à 14h21
a mon avis tu dois passer le numéro du joystick dans A avant l'appel a la routine 00D5
0 pour clavier
1 pour stick 1
000D5H GTSTCK GeT joySTiCK status
Nom : GTSTCK
Adresse : 000D5H/ROM
Type: MSX1 - 1 -
Rôle : renvoi de la direction actuelle du joystick
Entrée : A - numéro du joystick (0-3)
Sortie : A - direction du joystick
Modifie : tout
Note : le joystick numéro 0 correspond au clavier (les quatre flèches)
la direction du joystick est un nombre de 0 à 8
8 1 2 Lors de l'utilisation du clavier comme joystick 0,
\ | / il faut appuyer simultanément sur deux flèches afin
7-0-3 d'obtenir une diagonale. Par exemple, flèche vers le bas et
/ | \ flèche vers la droite donnent 4.
6 5 4
0 pour clavier
1 pour stick 1
000D5H GTSTCK GeT joySTiCK status
Nom : GTSTCK
Adresse : 000D5H/ROM
Type: MSX1 - 1 -
Rôle : renvoi de la direction actuelle du joystick
Entrée : A - numéro du joystick (0-3)
Sortie : A - direction du joystick
Modifie : tout
Note : le joystick numéro 0 correspond au clavier (les quatre flèches)
la direction du joystick est un nombre de 0 à 8
8 1 2 Lors de l'utilisation du clavier comme joystick 0,
\ | / il faut appuyer simultanément sur deux flèches afin
7-0-3 d'obtenir une diagonale. Par exemple, flèche vers le bas et
/ | \ flèche vers la droite donnent 4.
6 5 4
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie