Mr ToutLeMonde et la programmation NES...
+23
brokestudio
F.L
grostonton
Ned_Flanders
Tryphon
philip
fanoplusplus64K
tfdi
Ricco59_59
Top l'âne
tetsuro
upsilandre
nemokantio
Stef
pckid
ichigobankai
suisseretrogaming
patapouf31
vingazole
koan75
joelabroc
drfloyd
vincent2105
27 participants
Page 1 sur 34
Page 1 sur 34 • 1, 2, 3 ... 17 ... 34
Mr ToutLeMonde et la programmation NES...
Bonjour à tous,
Après quelques semaines de programmation en QB64, j'ai eu envie de "changer d'air" et réaliser un rêve de gosse : apprendre à programmer pour la NES.
J'avais déjà effleuré la chose il y a 6 mois, et j'étais tout content de réussir à afficher une tile. Mais la découverte de QB64 a rapidement eu raison de ma volonté d'apprendre le langage assembleur (asm).
J'ouvre donc ce topic pour me motiver, pour poser des questions aux pros de l'asm ou si je le peux : éclairer les néophytes avec des mots de néophyte (quitte à être corrigé par les pros)...
J'ai commencé mon apprentissage avec les tutos "nerdy nights".
Ils sont très progressifs et un petit exercice clôture chaque chapitre. http://nintendoage.com/forum/messageview.cfm?catid=22&threadid=7155
J'en suis actuellement au chapitre 7, mais j'ai déjà repéré d'autres tutos (notamment sur le scrolling), toujours sur le même site. http://nintendoage.com/forum/messageview.cfm?catid=22&threadid=33287
Bref, la documentation est là, à moi de suivre ! Pour l'instant, ca me botte même si je mets souvent un moment à comprendre !
Mon premier projet sera un petit jeu sans prétention : on incarnera un gardien de but et on devra arrêter un maximum de tirs. Différentes vitesses et trajectoires compliqueront la tâche.
Pour l'instant, j'arrive à afficher des sprites et un background... J'arrive aussi à déplacer mon gardien mais pas comme je le souhaiterais.
En effet, il se déplace tant que le bouton est enfoncé or je souhaiterais qu'il ne se déplace qu'à chaque fois que l'on appuie sur le bouton.
Voici un petit screenshot de mon travail sur émulateur. Le rendu n'est pas le même sur une vraie NES
" />
Pour les curieux, une petite info concernant le choix des couleurs parmi celles disponibles sur la NES et pour avoir une idée des contraintes :
On ne peut utiliser que 4 couleurs par tile de 8x8 pixels.
On appelle ce "groupe de couleurs" une palette.
On dispose de 4 palettes pour les sprites et autant pour le background.
Une couleur est commune aux 4 palettes (dans l'exemple ci dessous : vert).
Pour le background, pour une zone de 32 * 32 px on peut utiliser plusieurs palettes à condition que le nombre de couleur utilisées ne soit pas supérieur à 4.
En effet, à la fin de notre programme, on crée une base de donnée "attribut" qui permet à la machine de savoir quelle palette elle doit utiliser pour chaque tile qu'elle doit afficher.
" />
Enfin, j'en reviens aux tutos "nerdy nights", et je me demande : avec plus de 116000 vues pour ces tutos, y'a forcément des gamopats qui ont fouiné la bas ou ailleurs et qui ont pondu quelquechose sur NES non ? Allez les barbus montrez nous tout !
PS : Je remercie avec du retard le Doc et Vetea pour leurs encouragements dans mon dernier topic.
Après quelques semaines de programmation en QB64, j'ai eu envie de "changer d'air" et réaliser un rêve de gosse : apprendre à programmer pour la NES.
J'avais déjà effleuré la chose il y a 6 mois, et j'étais tout content de réussir à afficher une tile. Mais la découverte de QB64 a rapidement eu raison de ma volonté d'apprendre le langage assembleur (asm).
J'ouvre donc ce topic pour me motiver, pour poser des questions aux pros de l'asm ou si je le peux : éclairer les néophytes avec des mots de néophyte (quitte à être corrigé par les pros)...
J'ai commencé mon apprentissage avec les tutos "nerdy nights".
Ils sont très progressifs et un petit exercice clôture chaque chapitre. http://nintendoage.com/forum/messageview.cfm?catid=22&threadid=7155
J'en suis actuellement au chapitre 7, mais j'ai déjà repéré d'autres tutos (notamment sur le scrolling), toujours sur le même site. http://nintendoage.com/forum/messageview.cfm?catid=22&threadid=33287
Bref, la documentation est là, à moi de suivre ! Pour l'instant, ca me botte même si je mets souvent un moment à comprendre !
Mon premier projet sera un petit jeu sans prétention : on incarnera un gardien de but et on devra arrêter un maximum de tirs. Différentes vitesses et trajectoires compliqueront la tâche.
Pour l'instant, j'arrive à afficher des sprites et un background... J'arrive aussi à déplacer mon gardien mais pas comme je le souhaiterais.
En effet, il se déplace tant que le bouton est enfoncé or je souhaiterais qu'il ne se déplace qu'à chaque fois que l'on appuie sur le bouton.
Voici un petit screenshot de mon travail sur émulateur. Le rendu n'est pas le même sur une vraie NES
" />
Pour les curieux, une petite info concernant le choix des couleurs parmi celles disponibles sur la NES et pour avoir une idée des contraintes :
On ne peut utiliser que 4 couleurs par tile de 8x8 pixels.
On appelle ce "groupe de couleurs" une palette.
On dispose de 4 palettes pour les sprites et autant pour le background.
Une couleur est commune aux 4 palettes (dans l'exemple ci dessous : vert).
Pour le background, pour une zone de 32 * 32 px on peut utiliser plusieurs palettes à condition que le nombre de couleur utilisées ne soit pas supérieur à 4.
En effet, à la fin de notre programme, on crée une base de donnée "attribut" qui permet à la machine de savoir quelle palette elle doit utiliser pour chaque tile qu'elle doit afficher.
" />
Enfin, j'en reviens aux tutos "nerdy nights", et je me demande : avec plus de 116000 vues pour ces tutos, y'a forcément des gamopats qui ont fouiné la bas ou ailleurs et qui ont pondu quelquechose sur NES non ? Allez les barbus montrez nous tout !
PS : Je remercie avec du retard le Doc et Vetea pour leurs encouragements dans mon dernier topic.
Dernière édition par vincent2105 le Ven 20 Juin 2014 - 11:53, édité 1 fois
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Ahhh .. L'assembleur ...
En tout cas, je salue ton initiative à faire partager tes expériences surtout pour ce langage qui est à la base de tout.
Passer du QB64 à l'assembleur sur NES, moi je dit CHAPEAU !
Comme les journalistes aiment à dire : Sans transition ! ^^
Pour ma part, après avoir fini Papi Commando sur PC, je me lance dans le développement sur MegaDrive !
A part que je serai toujours avec du bon vieux Basic. ( Et sans doute, un peu d'assembleur ... )
Tu trouveras ici des pros des 1 et des 0 ( Comme Touko qui utilise même des 3 !! Pour dire ! ), pour ma part, je ne te serai pas d'une grande aide car pour moi, l'assembleur a toujours été un truc obscur que j'ai utilisé avec Z80 sans pour autant comprendre ce que je faisais souvent ^^ !
Dans tous les cas, ça fait plaisir de voir la communauté pondre des jeux sur consoles quelque soit la technologie utilisée.
Le principal est avant tout, de se faire plaisir.
Amuses toi bien et fais nous découvrir tes avancées. :)
En tout cas, je salue ton initiative à faire partager tes expériences surtout pour ce langage qui est à la base de tout.
Passer du QB64 à l'assembleur sur NES, moi je dit CHAPEAU !
Comme les journalistes aiment à dire : Sans transition ! ^^
Pour ma part, après avoir fini Papi Commando sur PC, je me lance dans le développement sur MegaDrive !
A part que je serai toujours avec du bon vieux Basic. ( Et sans doute, un peu d'assembleur ... )
Tu trouveras ici des pros des 1 et des 0 ( Comme Touko qui utilise même des 3 !! Pour dire ! ), pour ma part, je ne te serai pas d'une grande aide car pour moi, l'assembleur a toujours été un truc obscur que j'ai utilisé avec Z80 sans pour autant comprendre ce que je faisais souvent ^^ !
Dans tous les cas, ça fait plaisir de voir la communauté pondre des jeux sur consoles quelque soit la technologie utilisée.
Le principal est avant tout, de se faire plaisir.
Amuses toi bien et fais nous découvrir tes avancées. :)
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Salut Vetea et merci pour tes encouragements !
Je suis content de voir que toi aussi tu ai de nouveaux projets et pour la Megadrive qui plus est. Ton papi rame un peu chez moi mais sache que je le trouve bien sympa, le lancer de grenade me plait bien
L'assembleur, de prime abord c'est... différent de qb64 !
Ce que j'aime, c'est qu'à chaque ligne de code on sait "exactement" ce qu'il se passe ! Alors quand je trouve ne seraient-ce que 5 lignes de codes qui m'amènent au résultat escompté, bah c'est jouissif !
Concernant le déplacement des sprites, j'ai lu sur le forum de nesdev que la méthode présentée dans la plupart des tutoriaux pour débutants était déconseillée. Grosso modo comment faire ?
Dwedit wrote: You re-generate all sprites in the sprite table every frame, based on your array of game objects or another metasprite list.
Answer : Yes, this is the professional way to do it.
You shouldn't be doing noob stuff like responding to joystick input by incrementing or decrement values in your sprite memory, some awful tutorials suggest doing that.
Answer : I believe ALL tutorials suggest that, and because of that an insane amount of people here actually do it that way.
Je pense avoir trouvé plus d'explications là => http://nintendoage.com/forum/messageview.cfm?catid=22&threadid=33378
Je verrai ce point là plus tard. Pour l'instant, je reste avec la" méthode de noob" et j'essaie de résoudre mon petit problème ce soir.
Je suis content de voir que toi aussi tu ai de nouveaux projets et pour la Megadrive qui plus est. Ton papi rame un peu chez moi mais sache que je le trouve bien sympa, le lancer de grenade me plait bien
L'assembleur, de prime abord c'est... différent de qb64 !
Ce que j'aime, c'est qu'à chaque ligne de code on sait "exactement" ce qu'il se passe ! Alors quand je trouve ne seraient-ce que 5 lignes de codes qui m'amènent au résultat escompté, bah c'est jouissif !
Concernant le déplacement des sprites, j'ai lu sur le forum de nesdev que la méthode présentée dans la plupart des tutoriaux pour débutants était déconseillée. Grosso modo comment faire ?
Dwedit wrote: You re-generate all sprites in the sprite table every frame, based on your array of game objects or another metasprite list.
Answer : Yes, this is the professional way to do it.
You shouldn't be doing noob stuff like responding to joystick input by incrementing or decrement values in your sprite memory, some awful tutorials suggest doing that.
Answer : I believe ALL tutorials suggest that, and because of that an insane amount of people here actually do it that way.
Je pense avoir trouvé plus d'explications là => http://nintendoage.com/forum/messageview.cfm?catid=22&threadid=33378
Je verrai ce point là plus tard. Pour l'instant, je reste avec la" méthode de noob" et j'essaie de résoudre mon petit problème ce soir.
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Pour ma part, je potasse "tranquillement" un magnifique tuto sur l'ASM 68000 dédié a la MD (http://bigevilcorporation.co.uk/)
Les concepts de registres d0 - d7, a0 - a7, les OPcodes ( dont certain m'était familier ), etc ...
C'est assez enrichissant meme si ça reste rétrograde a notre époque ... Mais on s'en fout !
Et curieusement, je préfère la lecture d'un tuto asm que d'un tuto sur le C, C++, java etc ... De toute manière, Papi Commando s'en occupe pour moi : Pan Pan Boum Boum !
Je suis désolé que Papi rame chez toi ... C'est hélas le cas chez pas mal de personne.
Le jeu est devenu TRES complexe avec énormément de chose a gérer en temps réel. Même si QB64 est véloce, tout est gère en Software donc très lié au CPU.
Et comme j'utilise une résolution HD, ça n'arrange pas les choses.
Je dirai qu'il faut minimum un 2.4 GHz double coeur pour faire tourner le jeu correctement.
J'ai optimise pas mal le moteur mais cela ne sera jamais parfait.
Les concepts de registres d0 - d7, a0 - a7, les OPcodes ( dont certain m'était familier ), etc ...
C'est assez enrichissant meme si ça reste rétrograde a notre époque ... Mais on s'en fout !
Et curieusement, je préfère la lecture d'un tuto asm que d'un tuto sur le C, C++, java etc ... De toute manière, Papi Commando s'en occupe pour moi : Pan Pan Boum Boum !
Je suis désolé que Papi rame chez toi ... C'est hélas le cas chez pas mal de personne.
Le jeu est devenu TRES complexe avec énormément de chose a gérer en temps réel. Même si QB64 est véloce, tout est gère en Software donc très lié au CPU.
Et comme j'utilise une résolution HD, ça n'arrange pas les choses.
Je dirai qu'il faut minimum un 2.4 GHz double coeur pour faire tourner le jeu correctement.
J'ai optimise pas mal le moteur mais cela ne sera jamais parfait.
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
disons qu'avec un jeu réellement retro (c'est à dire en 320x200 par exemple) le jeu n'aurait ramé sur aucune machine. Et je pense que tu perd aussi beaucoup du fait des détails que tu as intégré : comme le passage derrière le décor des sprites via une pseudo 3D... ca bouffe terrible.
Sinon oui je suis d'accord je prefererai me mettre à l'ASM qu'au C... en ASM tu prends le controle de la machine... en C tu te fais chier
Faut avoir du temps libre pour se mettre à l'assembleur, deja pour bien maitriser, et ensuite pour faire le jeu souhaité.
Sinon oui je suis d'accord je prefererai me mettre à l'ASM qu'au C... en ASM tu prends le controle de la machine... en C tu te fais chier
Faut avoir du temps libre pour se mettre à l'assembleur, deja pour bien maitriser, et ensuite pour faire le jeu souhaité.
_______________________________________________________
Re: Mr ToutLeMonde et la programmation NES...
En C tu te fais chier ... J'approuve Doc' à 200% !!
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Doc, en effet, faut du temps libre, personnellement, je code très très peu, mais je lis beaucoup et, inconsciemment, ca rentre.
Parfois, mes lectures n'ont plus trop de rapport avec l'objet de ma recherche, mais cela me donne quelquefois le déclic pour piger une autre notion asm. Bref, quand j'ai assimilé, et que je pense avoir la solution, j'ouvre notepad. Je ne m'acharne pas. Avec QB64, j'avais de mauvaises habitudes, mon code était dég, je voulais aller trop vite, mais j'arrivais à mes fins.
Au passage, si Papi passe en 16 bits, je m'achète une Megadrive
Ma lecture pour ce soir : TUTO COMBOS CONTROLLER, (pas dit que je touche notepad...)
Parfois, mes lectures n'ont plus trop de rapport avec l'objet de ma recherche, mais cela me donne quelquefois le déclic pour piger une autre notion asm. Bref, quand j'ai assimilé, et que je pense avoir la solution, j'ouvre notepad. Je ne m'acharne pas. Avec QB64, j'avais de mauvaises habitudes, mon code était dég, je voulais aller trop vite, mais j'arrivais à mes fins.
Idem ! Sans dénigrer ces autres langages, mes débuts sont beaucoup plus agréables en assembleur.Vetea a écrit:Et curieusement, je préfère la lecture d'un tuto asm que d'un tuto sur le C, C++, java etc ..
Au passage, si Papi passe en 16 bits, je m'achète une Megadrive
Ma lecture pour ce soir : TUTO COMBOS CONTROLLER, (pas dit que je touche notepad...)
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Bonsoir,
Pour déplacer le ballon du pied du buteur jusqu'au but, je souhaite comparer les 2 ordonnées dont l'écart est égal à #$88.
J'ai tenté avec l'opcode CMP mais la limite est semble-t-il de #$80.
J'imagine qu'il y a une histoire de drapeaux, sinon je ne vois pas quelle opcode utiliser.
Quelqu'un pour me donner des explications ?
"CMP : Compare sets flags as if a subtraction had been carried out. If the value in the accumulator is equal or greater than the compared value, the Carry will be set. The equal (Z) and sign (S) flags will be set based on equality or lack thereof and the sign (i.e. A>=$80) of the accumulator."
Pour déplacer le ballon du pied du buteur jusqu'au but, je souhaite comparer les 2 ordonnées dont l'écart est égal à #$88.
J'ai tenté avec l'opcode CMP mais la limite est semble-t-il de #$80.
J'imagine qu'il y a une histoire de drapeaux, sinon je ne vois pas quelle opcode utiliser.
Quelqu'un pour me donner des explications ?
"CMP : Compare sets flags as if a subtraction had been carried out. If the value in the accumulator is equal or greater than the compared value, the Carry will be set. The equal (Z) and sign (S) flags will be set based on equality or lack thereof and the sign (i.e. A>=$80) of the accumulator."
- Code:
- Code:
DeplacementBallon:
LDA $0228,x ;charge position Y du ballon (au départ #$D0)
CMP #$59 ; PROBLEME : Voulu #$48, Max #$59
BMI NouveauTir ; qd le ballon atteint la ligne de but (#$48) nouveau tir
SEC ; "make sure the carry flag is clear"
SBC #$03 ; le ballon avance de 3 px vers le haut
STA $0228,x ; enregistre position x du sprite
INX ; 4 * INX => permet de passer au sprite suivant
INX
INX
INX
CPX #$10 ; Sprite composé de 4 tiles => #$10
BNE DeplacementBallon
RTS
NouveauTir:
LoadSpritesBallon2:
LDX #$00 ; permet de charger la position y du sprite
LoadSpritesLoopBallon2:
LDA spriteBallon, x ; load data from address (sprites + x)
STA $0228, x ; store into RAM address ($0200 + x)
INX ; X = X + 1
CPX #$10 ; Compare X to hex $10, decimal 16
BNE LoadSpritesLoopBallon2
RTS
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Salut sympa ton petit jeu
Sinon pour les comparaisons, tu es limité à #$FF (8 bit quoi ) .
Le seul soucis que je peux voir avec #$80, serai que tu utilises des nombres signés,CAD nombre positifs #$00 à #$79 0 à 127) et nombres négatifs de #$80 à #$FF (128 à 255) .
Sinon pour les comparaisons, tu es limité à #$FF (8 bit quoi ) .
Le seul soucis que je peux voir avec #$80, serai que tu utilises des nombres signés,CAD nombre positifs #$00 à #$79 0 à 127) et nombres négatifs de #$80 à #$FF (128 à 255) .
Dernière édition par TOUKO le Mer 4 Juin 2014 - 21:16, édité 4 fois
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Salut TOUKO et merci pour le p'tit mot ça fait toujours plaisir
En attendant ton aide, le footeux c'était avancé de #$20
Après une rapide recherche sur le forum 6502.org, j'ai trouvé çà :TOUKO a écrit:Le seul soucis que je peux voir avec #$80, serai que tu utilises des nombres signés,CAD nombre positifs #$00 à #$79 0 à 127) et nombres négatifs de #$80 à #$FF (128 à 255) .
J'utilisais l'opcode BMI juste après CMP, en la remplaçant par l'opcode BCC, ça marche comme je le voulais6502.org a écrit:
2.1 THE CMP, CPX, AND CPY INSTRUCTIONS
The CMP, CPX, and CPY instructions are used for comparisons as their mnemonics suggest. The way they work is that they perform a subtraction. In fact,
CMP NUM
is very similar to:
SEC
SBC NUM
Both affect the N, Z, and C flags in exactly the same way. However, unlike SBC, (a) the CMP subtraction is not affected by the D (decimal) flag, (b) the accumulator is not affected by a CMP, and (c) the V flag is not affected by a CMP. A useful property of CMP is that it performs an equality comparison and an unsigned comparison. After a CMP, the Z flag contains the equality comparison result and the C flag contains the unsigned comparison result, specifically:
- If the Z flag is 0, then A <> NUM and BNE will branch
- If the Z flag is 1, then A = NUM and BEQ will branch
- If the C flag is 0, then A (unsigned) < NUM (unsigned) and BCC will branch
- If the C flag is 1, then A (unsigned) >= NUM (unsigned) and BCS will branch
In fact, many 6502 assemblers will allow BLT (Branch on Less Than) and BGE (Branch on Greater than or Equal) to be used as synonyms for BCC and BCS, respectively.
En attendant ton aide, le footeux c'était avancé de #$20
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
C'est ça qui va pas :
il faut utiliser bcc NouveauTir et pas bmi, bmi ne veux pas dire inférieur mais test si négatif .
bcc ,c'est branchement si carry clear, soit si REG (A,X,Y) est inférieur à la valeur comparée .
bcs ,c'est branchement si carry set, soit si REG (A,X,Y) est supérieur ou égal à la valeur comparée .
Mince, je viens de voir que tu as trouvé comme un grand
En tout cas bienvenue dans le monde du 65xx
- Code:
BMI NouveauTir
il faut utiliser bcc NouveauTir et pas bmi, bmi ne veux pas dire inférieur mais test si négatif .
bcc ,c'est branchement si carry clear, soit si REG (A,X,Y) est inférieur à la valeur comparée .
bcs ,c'est branchement si carry set, soit si REG (A,X,Y) est supérieur ou égal à la valeur comparée .
Mince, je viens de voir que tu as trouvé comme un grand
En attendant ton aide, le footeux c'était avancé de #$20
En tout cas bienvenue dans le monde du 65xx
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Merci pour l'info, j'avais survolé la liste d'opcodes pour voir celles qui pourraient me servir et quand j'ai trouvé BMI et BPL, j'ai complètement zappé le reste.TOUKO a écrit:bcc ,c'est branchement si carry clear, soit si REG (A,X,Y) est inférieur à la valeur comparée .
bcs ,c'est branchement si carry set, soit si REG (A,X,Y) est supérieur ou égal à la valeur comparée .
TOUKO a écrit:En tout cas bienvenue dans le monde du 65xx
Ca c'est collector, merci TOUKO !
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Il est génial ce post.
Le premier du genre ou l'on découvre un réel partage d'un projet réalisé en assembleur avec des explications, des liens et une volonté de nous faire découvrir les méandres du très bas niveau.
Merci Vincent. Continues.
Le premier du genre ou l'on découvre un réel partage d'un projet réalisé en assembleur avec des explications, des liens et une volonté de nous faire découvrir les méandres du très bas niveau.
Merci Vincent. Continues.
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
slt
j ai pas tout compris
mais en tout cas cela a l aire bien sympathique
j ai pas tout compris
mais en tout cas cela a l aire bien sympathique
joelabroc- Patient incurable
- Nombre de messages : 1121
Age : 45
Localisation : paris
Date d'inscription : 21/02/2014
Re: Mr ToutLeMonde et la programmation NES...
de plus je suis content
j ai par la meme ocaze teste papi commando
un petit jeu bien fun quand ta 5 min ou 10 a tue au travail
j ai par la meme ocaze teste papi commando
un petit jeu bien fun quand ta 5 min ou 10 a tue au travail
joelabroc- Patient incurable
- Nombre de messages : 1121
Age : 45
Localisation : paris
Date d'inscription : 21/02/2014
Re: Mr ToutLeMonde et la programmation NES...
u trouveras ici des pros des 1 et des 0 ( Comme Touko qui utilise même des 3 !! Pour dire !
Je réagis que maintenant ..
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Merci , ce topic est en tout cas un formidable moteur pour mon apprentissage !Vetea a écrit:Il est génial ce post.
Le premier du genre ou l'on découvre un réel partage d'un projet réalisé en assembleur avec des explications, des liens et une volonté de nous faire découvrir les méandres du très bas niveau.
Je tacherai d'expliquer un peu plus ce que je sais de la NES dans un prochain message Merci pour tes encouragements !Joe la broc a écrit:j ai pas tout compris
mais en tout cas cela a l aire bien sympathique
A ce jour, je ne me suis toujours pas penché sur le problème. Ta remarque me fait cependant dire que plus tard j'aurai besoin de cette technique car je compte bien utiliser "toutes" les capacités de la NES (afficher 64 sprites). Du coup j'imagine que tu seras du même avis.TOUKO a écrit:Ca, c'est pour moi la technique du noob .Dwedit wrote: You re-generate all sprites in the sprite table every frame, based on your array of game objects or another metasprite list.
Si tu n'utilises que 10 sprites, tu vas te taper la maj de la table des 64 sprites !!
Enfin je dis ça ...
J'en profite pour vous faire part de mes intentions graphiques...
Pour l'instant j'ai 22 sprites (4 sprites pour le ballon, 8 sprites pour le gardien, 10 sprites pour le buteur)
Nombre qui va augmenter car je ne suis pas satisfait du look de mes bonhommes. 4 couleurs par sprite c'est un peu restreint. Pour y remédier, je compte doubler leur nombre de couleur.
Il faut forcément utiliser 2 palettes de 4 couleur (dont une couleur commune). Je vais donc créer 2 sprites qui une fois superposés (affichés au même endroit au même moment) créeront l'illusion d'un sprite 6 couleurs.
"Sprite 1 + Sprite 2 = Illusion sprite 6 couleurs. "
Vu que la NES permet d'afficher 8 sprites par ligne et que le gardien a une carrure de 2 sprites, si j'applique mon tour de magie, cela fait 4 sprites sur la ligne, bref Y'A D'LA MARGE ...
Me vient à l'esprit l'ajout d'un mode 2 joueurs en simultané... oui 2 gardiens dans les mêmes cages
Avec la superposition : cela me fait 2 gardiens * 2 sprites *2 ("superpositions") = 8 sprites sur la même ligne.
En principe ca passe mais dites moi si ça risque de clignoter.
Je ne pourrais cependant pas appliquer cette amélioration de la tête au pied car, je ne dois pas oublier que le gardien est sensé arrêter des ballons (soit 2 sprites de plus sur la ligne.)
Je vais donc appliquer "la superposition" pour le buste et me contenterai du sprite "de base" pour les jambes .
Cout de la manoeuvre "2 gardiens + 1 buteur full HD" : environ 40 sprites
Ensuite, je vais créer des tiles de background pour les spectateurs et quelques tiles sprites pour animer les spectateurs.
Et enfin, il faudra que j'affiche le score de chaque joueur. Mais là aussi, il me semble qu'il y a une astuce avec le background...
Bref, tout ca ne sera pas mis en place tant que je n'aurai pas le de jeu jouable avec les sprites actuels.
A+
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
ouai, j'ai modifié mon post car en cherchant j'ai vu qu'il y avait un DMA dédié pour la maj de la table des sprites, donc c'est logique ..
Sinon tu pourrais faire un mode 2 joueurs alterné tireur/gardien ..
Sinon tu pourrais faire un mode 2 joueurs alterné tireur/gardien ..
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Salut,
Bon, là, j'arrive à la première étape importante de mon jeu : les trajectoires.
Comme vous pouvez le voir ci dessous, il y aura 9 trajectoires différentes. (Le tir se fait en 2 étapes : Au pied du buteur, il n'y a que 3 trajectoires mais arrivé à la ligne médiane violette et en fonction de la difficulté on a jusqu'à 9 trajectoires différentes)
en NOIR celles du premier niveau de difficulté
en JAUNE celles débloquées à partir du 2nd niveau de difficulté
en ROUGE celles débloquées à partir du 3eme niveau de difficulté
Pour chaque tir, un "numéro" correspondant à une trajectoire sera tiré au sort.
ICI il est évoqué une méthode très courte permettant de générer des nombres aléatoires.
Il suffirait que j'utilise l'opcode "AND" sur le nombre de mon choix pour que la NES retourne un nombre entre 0 et le nombre que je lui ai fourni.
Voici le passage en question :
J'ai déjà pas mal cherché, mais surement pas au bon endroit
Cette méthode vous parait elle adaptée dans mon cas ?
Merci par avance !
J'y ai pensé, mais le mode 2 gardiens simultanément, ca représente beaucoup moins de boulot Mais avec un peu de volonté ca sera fait !TOUKO a écrit:Sinon tu pourrais faire un mode 2 joueurs alterné tireur/gardien ..
Bon, là, j'arrive à la première étape importante de mon jeu : les trajectoires.
Comme vous pouvez le voir ci dessous, il y aura 9 trajectoires différentes. (Le tir se fait en 2 étapes : Au pied du buteur, il n'y a que 3 trajectoires mais arrivé à la ligne médiane violette et en fonction de la difficulté on a jusqu'à 9 trajectoires différentes)
en NOIR celles du premier niveau de difficulté
en JAUNE celles débloquées à partir du 2nd niveau de difficulté
en ROUGE celles débloquées à partir du 3eme niveau de difficulté
Pour chaque tir, un "numéro" correspondant à une trajectoire sera tiré au sort.
ICI il est évoqué une méthode très courte permettant de générer des nombres aléatoires.
Il suffirait que j'utilise l'opcode "AND" sur le nombre de mon choix pour que la NES retourne un nombre entre 0 et le nombre que je lui ai fourni.
Voici le passage en question :
Avec une remarque cependant :"And it.
and #%00000001
Will make it 0 or 1.
and #%00001111
will make it a number between 0 and 15."
Cela me laisse perplexe, quelqu'un peut m'expliquer ou a un lien à me donner ? Un exemple ne serait pas de refus."Kasumi, that only works if you need a range that's a power of 2.
It's more involved if you need another range, especially if it needs to be uniformly distributed.
Maybe you can adjust your algorithm so that it works for values in a power-of-2 range."
J'ai déjà pas mal cherché, mais surement pas au bon endroit
Cette méthode vous parait elle adaptée dans mon cas ?
Merci par avance !
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Après réflexion, je pense que j'avais mal interprété.
1 et 1 => 1
1 et 0 => 0
0 et 1 => 0
0 et 0 => 0
Exemples de graines que la NES doit générér pour obtenir chacun des nombres compris entre 0 et la "limite"
01010000 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000000 Numéro aléatoire renvoyé "0"
01010001 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000001 Numéro aléatoire renvoyé "1"
01010010 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000010 Numéro aléatoire renvoyé "2"
01010011 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000011 Numéro aléatoire renvoyé "3"
01010100 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000100 Numéro aléatoire renvoyé "4"
01010101 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000101 Numéro aléatoire renvoyé "5"
01010110 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000110 Numéro aléatoire renvoyé "6"
01010111 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000111 Numéro aléatoire renvoyé "7"
Suis-je sur la bonne piste ?
Je pense qu'il faut d'abord que j'arrive à générer une graine ("seed" ou nombre aléatoire en binaire, puis interviendra l'opcode AND avec le "nombre limite"Il suffirait que j'utilise l'opcode "AND" sur le nombre de mon choix pour que la NES retourne un nombre entre 0 et le nombre que je lui ai fourni.
1 et 1 => 1
1 et 0 => 0
0 et 1 => 0
0 et 0 => 0
Exemples de graines que la NES doit générér pour obtenir chacun des nombres compris entre 0 et la "limite"
01010000 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000000 Numéro aléatoire renvoyé "0"
01010001 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000001 Numéro aléatoire renvoyé "1"
01010010 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000010 Numéro aléatoire renvoyé "2"
01010011 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000011 Numéro aléatoire renvoyé "3"
01010100 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000100 Numéro aléatoire renvoyé "4"
01010101 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000101 Numéro aléatoire renvoyé "5"
01010110 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000110 Numéro aléatoire renvoyé "6"
01010111 ; "Graine"("Seed") générée par la NES
and00000111 ; Nombre limite pour le tirage aléatoire (ici 7 en décimal)
00000111 Numéro aléatoire renvoyé "7"
Suis-je sur la bonne piste ?
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Les nombres aléatoire sur ces machines c'est assez la galère .
tu peux utiliser cette fonction
C'est un nombre aléatoire sur 16 bit, mais rien ne t'empêche d'utiliser 1 ou l'autre partie 8 bit .
Le soucis de ta solution c'est d'avoir les mêmes nombres à chaque partie.
tu peux utiliser cette fonction
- Code:
srand:
lda _rndseed + 1
rol A
rol A
rol A
eor _rndseed
ror A
php
lda _rndseed + 1
eor _rndseed
sta _rndseed + 1
lda _rndseed + 2
eor _rndseed
sta _rndseed
plp
rol _rndseed
rol _rndseed + 1
lda _rndseed + 1
eor _rndseed
rts
C'est un nombre aléatoire sur 16 bit, mais rien ne t'empêche d'utiliser 1 ou l'autre partie 8 bit .
Le soucis de ta solution c'est d'avoir les mêmes nombres à chaque partie.
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Merci pour la routine (je la décortiquerai un peu plus tard).
Par contre cette routine sera appelé à chaque frame alors qu'en théorie j'en ai besoin qu'à chaque tir (toutes les secondes je pense), alors pourquoi ca serait l'idéal ? (c'est juste une question)
Bref, j'ai pas du tout avancé pour les trajectoires.
J'ai par contre remplacé les portions de code de lecture des controllers par une routine. Je vais mettre les nombres aléatoires de côté pour l'instant et je vais me concentrer sur la structure du jeu. Concrètement, je vais essayer de faire un menu et d'initialiser mes variables avant de démarrer une partie. Je pense que ca va m'occuper un moment ! Quand je dis un menu, je serai déjà content d'afficher un écran de couleur qui disparait quand on appuye sur "start" et qui nous amène à l'écran de jeu...
Avoir le contrôle sur le NMI ? C'est pouvoir mettre du code entre NMI: et RTI ? Si c'est ça alors "c'est bon". ( J'ai déjà un JSR vers la routine de lecture du controller, que j'aimerai bien sortir de là d'ailleurs pour le mettre après le RTI)Par contre l'idéal serait de l'appeler dans ta routine nmi, donc il faut que tu es le contrôle dessus .
Par contre cette routine sera appelé à chaque frame alors qu'en théorie j'en ai besoin qu'à chaque tir (toutes les secondes je pense), alors pourquoi ca serait l'idéal ? (c'est juste une question)
Bref, j'ai pas du tout avancé pour les trajectoires.
J'ai par contre remplacé les portions de code de lecture des controllers par une routine. Je vais mettre les nombres aléatoires de côté pour l'instant et je vais me concentrer sur la structure du jeu. Concrètement, je vais essayer de faire un menu et d'initialiser mes variables avant de démarrer une partie. Je pense que ca va m'occuper un moment ! Quand je dis un menu, je serai déjà content d'afficher un écran de couleur qui disparait quand on appuye sur "start" et qui nous amène à l'écran de jeu...
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Super post ! Je commence une formation de programmeur en septembre et ce post me parle énormément alors que je suis neophyte ! J'ai juste fait quelque test sur du basic avec une appli telecharger sur l'eshop dsi (Petit computer) mais programmer d'ici 1 ou 2 an un jeu nes me botte bien. Bonne continuation et je serais un fidele lecteur !
Re: Mr ToutLeMonde et la programmation NES...
Salut Koan75, si tu souhaites te lancer dans l'aventure, encore une fois je ne peux que te recommander les tutos nerdy nights ! Bon courage pour la suite et merci pour ton soutien qui m'a un peu plus boosté
Comme prévu, revoir la structure du jeu me donne du fil à retordre.J'ai néanmoins accompli la mission que je m'étais fixée : afficher un "écran titre" qui bascule vers le jeu (au point mort). Comme on dit les petites victoires font les grandes conquêtes
Et puisqu'on lui dit pas souvent, merci au Doc d'avoir créé ce forum
Comme prévu, revoir la structure du jeu me donne du fil à retordre.J'ai néanmoins accompli la mission que je m'étais fixée : afficher un "écran titre" qui bascule vers le jeu (au point mort). Comme on dit les petites victoires font les grandes conquêtes
Et puisqu'on lui dit pas souvent, merci au Doc d'avoir créé ce forum
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
C'est ça, par contre le but d'être appelée à chaque frame est justement d'avoir le nombre le plus aléatoire possible ..vincent2105 a écrit:Merci pour la routine (je la décortiquerai un peu plus tard).Avoir le contrôle sur le NMI ? C'est pouvoir mettre du code entre NMI: et RTI ? Si c'est ça alors "c'est bon". ( J'ai déjà un JSR vers la routine de lecture du controller, que j'aimerai bien sortir de là d'ailleurs pour le mettre après le RTI)Par contre l'idéal serait de l'appeler dans ta routine nmi, donc il faut que tu es le contrôle dessus .
Par contre cette routine sera appelé à chaque frame alors qu'en théorie j'en ai besoin qu'à chaque tir (toutes les secondes je pense), alors pourquoi ca serait l'idéal ? (c'est juste une question)
Bref, j'ai pas du tout avancé pour les trajectoires.
J'ai par contre remplacé les portions de code de lecture des controllers par une routine. Je vais mettre les nombres aléatoires de côté pour l'instant et je vais me concentrer sur la structure du jeu. Concrètement, je vais essayer de faire un menu et d'initialiser mes variables avant de démarrer une partie. Je pense que ca va m'occuper un moment ! Quand je dis un menu, je serai déjà content d'afficher un écran de couleur qui disparait quand on appuye sur "start" et qui nous amène à l'écran de jeu...
Si tu la mets dans ta boucle principale, y'a de fortes chances que tu es toujours les mêmes nombres .
Invité- Invité
Mr ToutLeMonde et la programmation NES...
Salut,
J'ai réussi à créer quelques trajectoires.
Je les appelle en utilisant les boutons droite/gauche.
Pour les 2 premières pas de problème, en revanche lorsque j'ai ajouté la routine de la troisième (même sans l'appeler), j'ai eu un message d'erreur : "Branch address out of range".
Dans chaque routine "trajectoire" (il y en aura 9), j'utilise l'opcode BCC car je compare la position du ballon avec celle de la ligne de but et réinitialise sa position si elle l'atteint.
Vu la manière dont j'appelle les trajectoires, puis-je utiliser un autre opcode , y'a-t-il un truc pour contourner le problème ou dois-je tout remettre à plat ?
Si en plus j'essaie d'appeler la routine "AppelTrajectoire" j'ai une autre erreur.
J'ai réussi à créer quelques trajectoires.
Je les appelle en utilisant les boutons droite/gauche.
Pour les 2 premières pas de problème, en revanche lorsque j'ai ajouté la routine de la troisième (même sans l'appeler), j'ai eu un message d'erreur : "Branch address out of range".
Dans chaque routine "trajectoire" (il y en aura 9), j'utilise l'opcode BCC car je compare la position du ballon avec celle de la ligne de but et réinitialise sa position si elle l'atteint.
Vu la manière dont j'appelle les trajectoires, puis-je utiliser un autre opcode , y'a-t-il un truc pour contourner le problème ou dois-je tout remettre à plat ?
Si en plus j'essaie d'appeler la routine "AppelTrajectoire" j'ai une autre erreur.
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Les branchements conditionnels sont des branchements relatifs codés sur 1 octet signé (codage en complément à 2) : tu ne peux donc brancher que vers une adresse situé entre (adresse de l'instruction de branchement - 128) et (adresse de l'instruction de branchement + 127). [note : pour chicaner c'est peut-être calculé par rapport à l'adresse de l'instruction suivant l'instruction de branchement...].
Je ne crois pas qu'il y ait de branchement conditionnel long sur ce microprocesseur : la solution serait alors d'utiliser un branchement inconditionnel long (JMP) qui serait "évité" par un branchement conditionnel de condition opposée (BCS dans ton cas si j'en crois la liste des opcodes que j'ai trouvée), ça donnerait quelque chose du genre :
Je ne crois pas qu'il y ait de branchement conditionnel long sur ce microprocesseur : la solution serait alors d'utiliser un branchement inconditionnel long (JMP) qui serait "évité" par un branchement conditionnel de condition opposée (BCS dans ton cas si j'en crois la liste des opcodes que j'ai trouvée), ça donnerait quelque chose du genre :
- Code:
LDA $0228,x
CMP #$49
BCS suite
JMP ReinitialisationBallon
suite:
Dernière édition par vingazole le Ven 20 Juin 2014 - 13:00, édité 1 fois
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Mr ToutLeMonde et la programmation NES...
Ahah ! EXCELLENT ! Merci Vingazole !
Du coup pour ma routine AppelTrajectoire, j'ai utilisé la même astuce à savoir :
J'ai donc remplacé l'opcode BEQ (branch if equal) par JMP et je l'évite avec BNE (Branch if not equal)
Merci encore
Du coup pour ma routine AppelTrajectoire, j'ai utilisé la même astuce à savoir :
Vingazole a écrit:la solution serait alors d'utiliser un branchement inconditionnel long (JMP) qui serait "évité" par un branchement conditionnel de condition opposée
J'ai donc remplacé l'opcode BEQ (branch if equal) par JMP et je l'évite avec BNE (Branch if not equal)
- Code:
AppelTrajectoire:
LDA NumeroAleatoireTrajectoire
CMP #$01
BEQ Tir1
LDA NumeroAleatoireTrajectoire
CMP #$02
BEQ Tir2
LDA NumeroAleatoireTrajectoire
CMP #$03
BNE suite
JMP Tir3
suite:
RTS
Merci encore
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
C est un peu HS mais j ai beau m y connaitre en prog c et PHP je comprend rie' a ce que vous dite..
C est quel langage ?
C est quel langage ?
patapouf31- Patient contaminé
- Nombre de messages : 888
Age : 36
Localisation : De retour à toulouse
Date d'inscription : 07/05/2014
Re: Mr ToutLeMonde et la programmation NES...
C'est de l'assembleur 6502 (la NES utilise un 6502 modifié).
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Page 1 sur 34 • 1, 2, 3 ... 17 ... 34
Sujets similaires
» Programmation CPS-1
» La programmation Megadrive
» Mr ToutLeMonde et la programmation NES...
» Mr ToutLeMonde et la programmation GameBoy...
» Vos objectifs de programmation en 2015 ?
» La programmation Megadrive
» Mr ToutLeMonde et la programmation NES...
» Mr ToutLeMonde et la programmation GameBoy...
» Vos objectifs de programmation en 2015 ?
Page 1 sur 34
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum