MSX Village forum

La Place des Développeurs asmsx par un noob#2: Bouger un sprite... et ajout d'une boucle de tempo maison...

MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 16/10/2014 à 01h06
Épisode précédent

Vivant! Il est vivant! :| ...Ou presque!

Etape1: initialisation



pour ça j'ai ajouté des variables:1 pour la tempo et 4 par sprite nécessaire (2 pour l'instant)
Code ASM :
;----------------------------------------------------------
; VARIABLES
;----------------------------------------------------------
        .page   3
;
; variables sprites
VAR_SPRITES:
    ds  2*4
; variable pour la tempo
VAR_TEMPO:
ds1 


les valeurs initiales des sprites ntégrées et mise en place d'un crochet vers le programme de tempo pour les interruptions:
Code ASM :
; initialisation des attributs sprites
        ld      hl,ATT_SPRITES; on prend les paramètres initiaux
        ld      de,SPRATR; à envoyer vers la table des attributs des sprites en VRAM
        ld      bc,2*4; nombre de sprites * nb d'attributs (ça va évoluer)
        call    LDIRVM; la routine de copie en VRAM
        ld      hl,SPRATR; on prend les paramètres de la VRAM
        ld      de,VAR_SPRITES; à envoyer vers les variables des sprites
        ld      bc,2*4; nombre de sprites * nb d'attributs (ça va évoluer)
        call    LDIRMV; la routine de copie de VRAM en RAM
; Installation de la routine d'interruption
        ld      hl,$fd9f; on met le crochet "d'interruption"(H.TIMI) dans hl
        ld      bc,INTERRUPTION; On met l'adresse de notreinterruption dans bc
        ld      [hl],$c3; on remplace la première instruction par jump
        inc     hl;puis ensuite
        ld      [hl],c;l'adresse 
        inc     hl;de notre 
        ld      [hl],b  ;interruption.
xora;mise à 0
ld[VAR_TEMPO],a; de la variable de la tempo

Le petit programme d'interruption
Code ASM :
;----------------------------------------------------------
INTERRUPTION:;- on incrémente automatiquement et régulièrement
;----------------------------------------------------------
;
        push    af;on
        push    bc;sauve
        push    de;tout
        push    hl;!
        ldhl,VAR_TEMPO; la variable de tempo
inc[hl]; est incrémentée
        pop     hl;on
        pop     de;récupère
        pop     bc;tout
        pop     af;!
        ret


Etape2: les sous-programmes de la boucle principale


intégration des sous-programmes dans la boucle principale:
Code ASM :
;-----------------------------------------------!
;!
;!
;!
;   BOUCLE PRINCIPALE!
;!
;!
;!
LOOP:
call GST_DEP_Heros
call GST_SPRITES
callGST_TEMPO; Gestion timing 
jpLOOP
;-----------------------------------------------!


le sous-programme de gestion du stick:
Code ASM :
;----------------------------------------------------------
GST_DEP_Heros:;---- Gestion mouvement -----
;----------------------------------------------------------
;
    xor     a; A=0 (test clavier) 
    call    GTSTCK; A= direction flèches clavier 
    cp      0; Si A=0
    jr     nz,@@GST_MOVE; si non (a<>0) saut à la boucle  
    inc     a; si oui A=A+1 (A=1)
    call    GTSTCK; A= direction manette 1 
;  
;Gestion mouvement
@@GST_MOVE:
    push  af; sauve A (valeur joystick)
; Déplacement horizontaux
    ldhl,VAL_DEP_X; HL = adr. déplacement X
ldb,0; mise dans BC de A
ldc,a; "
addhl,bc; HL = On met HL à l'adresse correspondant à adresse de déplacement en X + position manette.
lda,[hl]; a = val. déplacement X
ldb,a; B = val. déplacement X
lda,[VAR_SPRITES+1] ; a=X avant déplacement
addb; a=a+val. déplacement X
cp 6; si X=X mini -2 (< à X mini)
jr nz,@@X_MAX; si non saut à X_MAX
lda,8; si oui X=X mini
jp@@X_MAJ; et saut à MAJ de X
@@X_MAX:
cp 234; si X=X maxi +2 (> à X maxi)
jr nz,@@X_MAJ; si non saut à MAJ de X
lda,232; si oui X=X maxi
@@X_MAJ:
ld [VAR_SPRITES+(0*4)+1],a; X 1er sprite heros (plan0)
ld [VAR_SPRITES+(1*4)+1],a  ; X 2nd sprite heros(plan1)
; Déplacement verticaux
pop af; recup de A (valeur joystick)
    ldhl,VAL_DEP_Y; HL = adr. déplacement Y
ldb,0; mise dans BC de A
ldc,a; "
addhl,bc; HL = On met HL à l'adresse correspondant à adresse de déplacement en Y + position manette.
lda,[hl]; A = val. déplacement Y
ldb,a; B = val. déplacement Y
ld a,[VAR_SPRITES]; A=Y avant déplacement
addb; A=a+val. déplacement Y
cp 6; si Y=Y mini -2 (< à Y mini)
jr nz,@@Y_MAX; si non saut à Y_MAX
lda,8; si oui Y=Y mini
jp@@Y_MAJ; et saut à MAJ de Y
@@Y_MAX:
cp 172; si Y=Y maxi +2 (> à Y maxi)
jr nz,@@Y_MAJ; si non saut à MAJ de Y
lda,170; si oui Y=Y maxi
@@Y_MAJ:
ld [VAR_SPRITES+(0*4)],a; Y 1er sprite heros (plan0)
ld [VAR_SPRITES+(1*4)],a  ; Y 2nd sprite heros(plan1)
ret; Retour à la boucle principale


Intégration des données déplacement suivant position du stick! Facile à modifier pour intégrer les mouvements en diagonale!
Code ASM :
; Test déplacement
VAL_DEP_X:
;------ 0,1,2,3,4,5,6, 7,8
db  0,0,0,2,0,0,0,-2,0
VAL_DEP_Y:
;------ 0, 1,2,3,4,5,6,7,8
db  0,-2,0,0,0,2,0,0,0


Le sous programme de transmission des variables vers attributs des sprites en VRAM
Code ASM :
;------------------------------------------------------
GST_SPRITES:;- envoi variables vers sprites 
;------------------------------------------------------
;
        ld      hl,VAR_SPRITES; on prend les variables des sprites
        ld      de,SPRATR; à envoyer vers les attributs de sprites en VRAM
        ld      bc,2*4; nombre de sprites * nb d'attributs (ça va évoluer)
        call    LDIRVM; c'est parti!
ret



Enfin le sous programme de tempo qui "attend":
Code ASM :
;----------------------------------------------------------
GST_TEMPO:
;----------------------------------------------------------
;
lda,[VAR_TEMPO];on récupère ce qui reste dans tempo
ldb,a;
lda,50;
subb;on lui soustrait 50
ldb,a;
xora;
ld[VAR_TEMPO],a;remise à zéro de la variable
@@time:;
pushbc;
ldb,30;on
@@time2:;marque
nop;une
djnz@@time2;pause
popbc;jusqu'à  
djnz@@time;0
ret;


voilà, je pense ne pas avoir oublier grand chose... Je vous laisse faire les essais sans la tempo et intégrer le mouvements en diagonale!

Le fichier: tuto_2.zip


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 16/10/2014 à 10h56
Bravo pour tous les commentaires dans ton code :top

Une première remarque : la série de push/pop dans ta routine de gestion de l'interruption est inutile, car le BIOS le fait déjà avant d'appeler le hook. Tu peux donc gagner du temps en les supprimant.


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 16/10/2014 à 11h55
OK, donc ça devient:
Code ASM :
;----------------------------------------------------------
INTERRUPTION:;- on incrémente automatiquement et régulièrement
;----------------------------------------------------------
        ldhl,VAR_TEMPO; la variable de tempo
inc[hl]; est incrémentée
ret

Je n'ai pas vérifié si on était sous les 5 octets!


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 16/10/2014 à 14h18
J'en déduit de ta remarque que tu mets la routine de gestion de l'interruption VBLANK directement dans l'espace réservé du hook.
Ce n'est pas une bonne pratique, car il existe d'autres cas de déroutage de ce hook, mis en place par le BIOS ou les SUBROMs.

Ce qu'il est conseillé de faire, c'est de :
1. copier les 5 octets du hook à un endroit de la RAM, identifiés par une étiquette (par exemple 'OLD_HOOK').
2. mettre dans le hook un simple 'JP' vers ta propre routine de gestion
3. terminer ta propre routine de gestion par un 'JP OLD_HOOK'

De cette manière, tu gères ton interruption, et puis tu laisses la main à une éventuelle routine déjà implantée.




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

Villageois

Rang

Avatar

Groupe : compte ++

Inscrit le : 22/11/2011 à 21h14

Messages: 865

Le 16/10/2014 à 15h26
Merci à vous ! J'adore ce type de topic ! :top



En essayant d'appliquer ce "tuto", je suis tombé sur ce post : http://karoshi.auic.es/index.php/topic,1858.0.html

C'est certes en espagnol mais on y apprend, screenshots à l'appui, comment configurer (sous windows) certains outils utiles au développement avec asMSX.



J'en profite pour saluer le travail de Granced au sujet de la traduction française de la documentation d'asMSX ( http://www.msxvillage.fr/download/download.php?id=4 ).



(NB : je me demande par ailleurs quels étaient les outils employés par les développeurs à l'aube du MSX1/2 ?)



MSXosaure :
OK, donc ça devient:

Code ASM :
;----------------------------------------------------------
INTERRUPTION:    ;- on incrémente automatiquement et régulièrement
;----------------------------------------------------------
        ld        hl,VAR_TEMPO    ; la variable de tempo
    inc        [hl]            ; est incrémentée
ret


Je n'ai pas vérifié si on était sous les 5 octets!
J'imagine que ça avoir rapport avec la taille des hooks, mais n'ai pas compris.



Metalion @ MSXosaure :
... J'en déduit de ta remarque que tu mets la routine de gestion de l'interruption VBLANK directement dans l'espace réservé du hook.

Ce n'est pas une bonne pratique, car il existe d'autres cas de déroutage de ce hook, mis en place par le BIOS ou les SUBROMs...
Un exemple ?


Philips.NMS.8245/50/80, Sony.F1XV/HBF-700D, Pana.FSA1FX/A1WX(x2)/A1GT, OCM, GR8BIT.... et ...
   
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 16/10/2014 à 16h35
Metalion :
J'en déduit de ta remarque que tu mets la routine de gestion de l'interruption VBLANK directement dans l'espace réservé du hook.

Ce n'est pas une bonne pratique, car il existe d'autres cas de déroutage de ce hook, mis en place par le BIOS ou les SUBROMs.



Ce qu'il est conseillé de faire, c'est de :

1. copier les 5 octets du hook à un endroit de la RAM, identifiés par une étiquette (par exemple 'OLD_HOOK').

2. mettre dans le hook un simple 'JP' vers ta propre routine de gestion

3. terminer ta propre routine de gestion par un 'JP OLD_HOOK'



De cette manière, tu gères ton interruption, et puis tu laisses la main à une éventuelle routine déjà implantée.




Pour le 1 OK j'ai compris. cékoi la routine pour copier un bloc de ROM en RAM^^ :oups



Pour le 2 j'ai bon (on saute vers "INTERRUPTION")



Pour le 3... Bah tant que j'ai pas fait le 1



SveN :
J'imagine que ça avoir rapport avec la taille des hooks, mais n'ai pas compris.


Oui c'est 5 RET dans le Hook par défaut... Mais faut y mettre juste le jump qu'il a dit Metalion;)












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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 16/10/2014 à 16h43
SveN :
NB : je me demande par ailleurs quels étaient les outils employés par les développeurs à l'aube du MSX1/2 ?


Oui, je me pose cette question aussi. En fait je me pose surtout la question de leur méthode de travail. Car avec un cross assembler et un émulateur (qui n'existaient pas à l'époque) c'est très facile de faire des modifications et de les vérifier en quelques secondes. Mais à l'époque c'était très différent ...



Tout ce qu'on sait (grâce à l'interview d'un développeur), c'est que KONAMI utilisait des HP 64000 pour l'émulation hardware du Z80. C'était des grosses machines qui émulaient des processeurs en fonction des cartes électroniques qu'on leur branchait. Mais il restait tout le reste : développement graphiques et sonore ... Bref, qu'ils réussissaient à développer un jeu en une dizaine de mois semble maintenant un véritable exploit.



SveN :
J'imagine que ça avoir rapport avec la taille des hooks, mais n'ai pas compris.


Oui, les hooks font 5 octets.

Ici, MSXosaure veut implanter sa routine dans l'espace de ces 5 octets (d'où sa question).



SveN :
Metalion @ MSXosaure :
... J'en déduit de ta remarque que tu mets la routine de gestion de l'interruption VBLANK directement dans l'espace réservé du hook.

Ce n'est pas une bonne pratique, car il existe d'autres cas de déroutage de ce hook, mis en place par le BIOS ou les SUBROMs...
Un exemple ?




Démarre BlueMSX avec un MSX2 'full options'.

Ouvre la fenêtre du débogueur et place toi sur le hook en FD9Fh.Le code qui s'y trouve est :



Code :
rst     0030h
87h
00h
79h
ret




c'est un appel inter-slot à l'adresse 0079h (probablement dans la Disk ROM).



MSXosaure :
Pour le 1 OK j'ai compris. cékoi la routine pour copier un bloc de ROM en RAM




Moi je fais comme ça (VBLANK étant le nom de ma routine de gestion d'interruption, et VBLANK_OLD un espace libre de 5 octets en RAM) :



Code :
; Sauvegarde du hook original H.TIMI
        ld    hl,HTIMI
        ld    de,VBLANK_OLD
        ld    bc,5
        ldir

; Mise en place de la dérivation de l'interruption VBLANK
        di
        ld    hl,VBLANK
        ld    [HTIMI+1],hl
        ld    a,0C3h          ; opcode "JP"
        ld    [HTIMI],a
        ei
Edité par Metalion Le 16/10/2014 à 16h51


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

Villageois

Rang

Avatar

Inscrit le : 17/05/2013 à 22h52

Messages: 987

Le 16/10/2014 à 20h49
Metalion :


Tout ce qu'on sait (grâce à l'interview d'un développeur), c'est que KONAMI utilisait des HP 64000 pour l'émulation hardware du Z80. C'était des grosses machines qui émulaient des processeurs en fonction des cartes électroniques qu'on leur branchait. Mais il restait tout le reste : développement graphiques et sonore ... Bref, qu'ils réussissaient à développer un jeu en une dizaine de mois semble maintenant un véritable exploit.


Pour Titeuf sur Gameboy color, on l'a fait en 3 mois et 15 jours entre l'ecriture du game design et l'aproval de Nintendo.

:tchin Edité par z80 Le 16/10/2014 à 20h50


TurboR GT (1Mo), CANON V20! ( en kit, modif 2+ en cours) :top
Pas encore retrouvés: V9990, Grafx9000, SUNRISE IDE 2x CF, SUNRISE MOONSOUND, FM PAC, MUSIC MODULE, NMS8280, SD SNATCHER,... :\'(
   
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 18/10/2014 à 21h12
Metalion :
[

Moi je fais comme ça (VBLANK étant le nom de ma routine de gestion d'interruption, et VBLANK_OLD un espace libre de 5 octets en RAM) :



Code :
; Sauvegarde du hook original H.TIMI
        ld    hl,HTIMI
        ld    de,VBLANK_OLD
        ld    bc,5
        ldir

; Mise en place de la dérivation de l'interruption VBLANK
        di
        ld    hl,VBLANK
        ld    [HTIMI+1],hl
        ld    a,0C3h          ; opcode "JP"
        ld    [HTIMI],a
        ei




Ok ldir, il aurait vraiment fallu que je relise mes classique sur l'asm MSX avant d'attaquer ces posts :gne



J'ai la dernière version de ASMSX mais elle ne reconnait "HTIMI" :hum


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 19/10/2014 à 09h52
Alors pour finir sur la tempo qui aurait mérité un post à part :gne . Je vais aussi un peu mieux structuré mes posts pour que ce soit un peu plus clair. :oups

Mise en place d'une tempo



Sur la base de ce qu'a conseillé Metalion

données et variables à mettre en place


Il y a juste à réserver un emplacement d'un octet pour la variable de tempo(VAR_TEMPO) et un de 5 octet pour y insérer la gestion d'interrution originale (INTERUP_OLD).
Code ASM :
;
;----------------------------------------------------------
; VARIABLES
;----------------------------------------------------------
        .page   3
; (...)
; variable pour la tempo
VAR_TEMPO:
ds1
;hook original H.TIMI
INTERUP_OLD:
ds5


initialisation


On commence par sauvegader le hook original dans l'endroit qu'on lui a prévu(INTERUP_OLD).
On le remplace par un saut vers celui de la tempo qu'on va créé (INTERUP).
Code ASP :
; Sauvegarde du hook original H.TIMI 
        ld    hl,$fd9f; ou HTIMI pour les intimes 
        ld    de,INTERUP_OLD 
        ld    bc,5 
        ldir 
; Mise en place de la dérivation de l'interruption INTERUP 
        di 
        ld    hl,INTERUP
        ld    [$fd9f+1],hl; ou HTIMI+1 pour les intimes on y dépose l'adresse du saut
        ld    a,0C3h        ; opcode "JP" 
        ld    [$fd9f],a; ou HTIMI pour les intimes on y dépose le "jump"
        ei 


Les sous programme



INTERUP: qui est appelé automatiquement et qui se contente d'incrémenter le compteur tempo à intervale régulier avant de repasser par la gestion d'interrution originale.
Code ASM :
;----------------------------------------------------------
INTERUP:;- on incrémente automatiquement et régulièrement
;----------------------------------------------------------
;        
        ldhl,VAR_TEMPO; la variable de tempo
inc[hl]; est incrémentée
        jpINTERUP_OLD


GST_TEMPO: appelé dans la boucle, on retient ce qu'il reste au compteur et on patiente le temps nécessaire pour avoir une vitesse plus ou moins régulière.
Code ASM :
;----------------------------------------------------------
GST_TEMPO:
;----------------------------------------------------------
;
lda,[VAR_TEMPO];on récupère ce qui reste dans tempo
ldb,a;
lda,50;
subb;on lui soustrait 50
ldb,a;
xora;
ld[VAR_TEMPO],a;remise à zéro de la variable
@@time:;
pushbc;
ldb,50;on
@@time2:;marque
nop;une
djnz@@time2;pause
popbc;jusqu'à  
djnz@@time;0
ret


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1512

Le 19/10/2014 à 10h59
Est-ce qu'un ou plusieurs nop ne seraient pas plus faciles pour régler la temporisation ?
Je crois me souvenir que c'est ce que j'avais fait dans mon propre programme de déplacement de sprite : http://www.msxvillage.fr/forum/topic.php?id=184#m2505



MSX un jour, MSX toujours ! :D
Site web    
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 19/10/2014 à 18h40
granced :
Est-ce qu'un ou plusieurs nop ne seraient pas plus faciles pour régler la temporisation ?

Je crois me souvenir que c'est ce que j'avais fait dans mon propre programme de déplacement de sprite : http://www.msxvillage.fr/forum/topic.php?id=184#m2505


Merci de me rappeler ce post, il pourra me servir à l'occasion ;) . En fait ce que je tente de faire avec ce hook, c'est régler le nombre de nop suivant la "vitesse" de la boucle.


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 19/10/2014 à 18h48
J'avoue ne pas bien comprendre ce que tu fais dans la routine GST_TEMPO, MSXosaure :hum

L'incrémentation d'un compteur à chaque interruption est un bonne solution (et à vrai dire elle existe déjà dans le BIOS, voir la variable 'JIFFY'), mais moi je l'utilise comme un métronome. Je crée une routine qui attend que le compteur change de valeur pour rendre la main, et j'appelle cette routine dans le programme principal pour attendre le 'coup' de métronome. Cela permet de rhytmer les animations à coup de 50e de seconde (ou frames) et d'être sur d'avoir un mouvement régulier. Je vous posterai la structure demain matin.

PS : pour le HTIMI je pense que c'est normal. De mémoire, asMSX reconnait automatiquement les noms des routines BIOS, mais pas les noms des variables ou des hooks.




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

Villageois

Rang

Avatar

Inscrit le : 17/05/2013 à 22h52

Messages: 987

Le 19/10/2014 à 20h33
granced :
Est-ce qu'un ou plusieurs nop ne seraient pas plus faciles pour régler la temporisation ?

Je crois me souvenir que c'est ce que j'avais fait dans mon propre programme de déplacement de sprite : http://www.msxvillage.fr/forum/topic.php?id=184#m2505




Mauvaise idée, trop dépendant de la vitesse du CPU.

Il y a des moyens plus fin pour gérer la vitesse de déplacement. Utilisez les nombres à virgules fixe.

Je suis sur mon téléphone, mais à l'occasion je peux poster une explication quand je serais devant mon PC.


TurboR GT (1Mo), CANON V20! ( en kit, modif 2+ en cours) :top
Pas encore retrouvés: V9990, Grafx9000, SUNRISE IDE 2x CF, SUNRISE MOONSOUND, FM PAC, MUSIC MODULE, NMS8280, SD SNATCHER,... :\'(
   
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1512

Le 19/10/2014 à 20h59
Volontiers (que ce soit Metalion ou z80), je suis toujours friand de ce genre d'info ! :)


MSX un jour, MSX toujours ! :D
Site web    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie