MSX Village forum

La Place des Développeurs Mes 1ers pas sur MSX ...

Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 02/01/2021 à 20h59

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;
}


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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2694

Le 02/01/2021 à 21h00
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)


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.
Github    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 03/01/2021 à 00h26
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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5481

Le 03/01/2021 à 07h40
ç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


banniere-ericb59e
Site web    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 03/01/2021 à 09h52
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 ;)


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5481

Le 03/01/2021 à 10h56
ptite question,
pourquoi dans ta routine get_stick
tu push/pop AF ?


banniere-ericb59e
Site web    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 03/01/2021 à 11h10
Par sécurité :)


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2694

Le 03/01/2021 à 11h19
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.
Github    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5481

Le 03/01/2021 à 11h20
Ricco59 :
Par sécurité :)

D'accord mais je ne comprend pas pourquoi AF a de l'importance pour toi ?

pour SDCC c'est IX qui est important :hum


banniere-ericb59e
Site web    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 03/01/2021 à 12h03
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



Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2694

Le 03/01/2021 à 12h38
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.
Github    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 10/01/2021 à 00h29
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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2694

Le 10/01/2021 à 13h19
Ca avance :)
L'animation du "Presents" au début, c'est du sprite ou bien des tiles animés ?


On est toujours ignorant avant de savoir.
Github    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 10/01/2021 à 14h20
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
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;
}


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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10318

Le 10/01/2021 à 14h46
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


:noel
Site web    
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 552

Le 10/01/2021 à 14h50
il manque un "return ..." dans tes sous-routines


Toute matrice carrée sur un corps K, dont le polynôme caractéristique est scindé, est semblable à une matrice de Jordan. Cette réduction est unique à l'ordre des blocs près. De plus, toute matrice carrée nilpotente sur un corps K est semblable à une matrice de Jordan dont chaque bloc est associé à la valeur 0. Évidement, cette réduction est encore unique à l'ordre des blocs près...
:)
   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie