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 11 sur 34
Page 11 sur 34 • 1 ... 7 ... 10, 11, 12 ... 22 ... 34
Re: Mr ToutLeMonde et la programmation NES...
LOL, non on échange aussi, voir le topic sur la compression .C'est ironique vincent2105 code sur nes mais ne va pas discuté sur nesdev , et je vois touko et stef discuté sur nesdev mais qui eux ne code ni sur nes ni sur SNES
Oui ça permet de se synchroniser avec le faisceau de balayage sur une ligne bien précise .l'interruption c'est pour savoir quand tu vas changer le scrool non ?
Oui, il utilise le trick de collision pour se positionner sur une ligne bien précise, et ensuite il utilise des boucles pour se synchroniser sur les autres lignes, c'est (pour moi) quasi inutilisable sorti d'une demo, car tu perds trop de CPU qui dépense des cycles à attendre .Oui, mais il a réservé 7 octets pour sa variable scroll, il arrive ainsi a splitter son background en 7 et à les faire scroller horizontalement à 7 vitesses différentes.
C'est d'ailleurs pour ça que les mappers évolués sur nes ont des systèmes d'interruption h-sync, qui permettent de générer une interruption sur les lignes souhaitées, donc potentiellement sur chacune des lignes écran .
Non car comme tu ne peux pas repositionner le sprite en cours de frame, ça ne génère qu'une seule interruption/frame,donc 1 seul split écran possible,le reste est du code timé pour se synchroniser .Ca me donne l'impression que tout est possible avec le "sprite 0 hit" non ?
Pourtant y'a des mecs très calé en nes là bas .Merci pour ton avis éclairé (concernant nesdev, j'y vais de temps en temps en tant que visiteur, mais je préfère discuter en français, c'est pourquoi je continue ici )
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Alors là, un grand merci Touko, c'est beaucoup plus clair pour moi maintenant ! Après je dis pas que je posterai pas aussi sur nesdev de temps à autreOui, il utilise le trick de collision pour se positionner sur une ligne bien précise, et ensuite il utilise des boucles pour se synchroniser sur les autres lignes, c'est (pour moi) quasi inutilisable sorti d'une demo, car tu perds trop de CPU qui dépense des cycles à attendre .Oui, mais il a réservé 7 octets pour sa variable scroll, il arrive ainsi a splitter son background en 7 et à les faire scroller horizontalement à 7 vitesses différentes.
C'est d'ailleurs pour ça que les mappers évolués sur nes ont des systèmes d'interruption h-sync, qui permettent de générer une interruption sur les lignes souhaitées, donc potentiellement sur chacune des lignes écran .Non car comme tu ne peux pas repositionner le sprite en cours de frame, ça ne génère qu'une seule interruption/frame,donc 1 seul split écran possible,le reste est du code timé pour se synchroniser .Ca me donne l'impression que tout est possible avec le "sprite 0 hit" non ?
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
L'avantage c'est qu'ils pourraient te filer tout un tas d'infos est d'astuces utiles que tu trouveras pas ici .Après je dis pas que je posterai pas aussi sur nesdev de temps à autre
Mais bon si tu n'aimes pas poster en anglais, faut pas te formaliser non plus .
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Vite fait, je partage un lien d'un topic que j'ai trouvé hyper intéressant au cours de mes lectures sur les parallaxes, on y découvre entre autres Battletoads sur NES vu par upsilandre (message 80)... http://desbitsetdespixels.forumactif.org/t146p75-nes-vs-master-system-fiiiiiiiight
On apprend un tas de trucs et on en prend plein les yeux ! D'une manière générale, les posts d'upsilandre sont une mine d'informations, je l'en remercie au passage :)
On apprend un tas de trucs et on en prend plein les yeux ! D'une manière générale, les posts d'upsilandre sont une mine d'informations, je l'en remercie au passage :)
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 suis guère intéresser par nesdev aussi , j'y vais parce que la SNES est pas simple et que j'aime bien avoir de manière ponctuel des réponses a mes interrogations mais je trouve en général les discussions sur SNESDev trop inintéressant ça parle plus d'algorhytme de manière général que de la SNES et perso c'est pas ou je vais pour apprendre la prog ou l'algo.
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
En même temps c'est pas le but, c'est utile par contre si tu veux savoir certaines choses sur le hard, tricks ou autres joyeuseté hardware sur les machines nintendo.perso c'est pas ou je vais pour apprendre la prog ou l'algo.
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Clairement mais si tu vas sur SNESDev il y a plus des topic sur ces question la que sur le HardEn même temps c'est pas le but, c'est utile par contre si tu veux savoir certaines choses sur le hard, tricks ou autres joyeuseté hardware sur les machines nintendo.
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
J'ai trouvé un exemple d'utilisation d'interruption avec le mmc3 : https://github.com/ahefner/tenes/blob/master/tech/mmc3irqs.txt
Y'a juste un point à éclaircir : apparemment le code est écrit en "nbasic", je pense avoir compris que :
set est la suite d'opérations LDA / STA
gosub => JSR
goto => JMP
return => RTS
par contre est ce que je fais une boulette si je fais l'impasse sur "resume" ? (je peux pas tester le code, c'est surtout pour comprendre)
Y'a juste un point à éclaircir : apparemment le code est écrit en "nbasic", je pense avoir compris que :
set est la suite d'opérations LDA / STA
gosub => JSR
goto => JMP
return => RTS
par contre est ce que je fais une boulette si je fais l'impasse sur "resume" ? (je peux pas tester le code, c'est surtout pour comprendre)
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Je dirais que resume, c'est un retour d'interruption.
La fonction d'interruption se termine, et ça retourne à l'endroit du programme où s'était déclenchée l'interruption.
Pour reprendre l'execution normale du programme...
Un rts mais d'interruption quoi...
La fonction d'interruption se termine, et ça retourne à l'endroit du programme où s'était déclenchée l'interruption.
Pour reprendre l'execution normale du programme...
Un rts mais d'interruption quoi...
nemokantio- Patient contaminé
- Nombre de messages : 345
Age : 48
Localisation : Delgastan
Date d'inscription : 23/01/2013
Re: Mr ToutLeMonde et la programmation NES...
ok le rts pour l'interruption sur 6502 c'est rti
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Oui resume c'est rti en asm,vu que NMI est une interruption donc il faut un RTI et non un RTS .
D'ailleurs resume sous entend une interruption,dans le sens "reprendre une action interrompue" .
D'ailleurs resume sous entend une interruption,dans le sens "reprendre une action interrompue" .
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Ok, merci à tous les 3
J'ai recopié le code en asm, et j'ai pu l'assembler et voir la rom tourner sur émulateur (fceuxd ok, nestopia non).
A présent, je vais pouvoir faire quelques essais :)
Pour ceux qui voudraient également faire quelques tests, voici le code :
J'ai recopié le code en asm, et j'ai pu l'assembler et voir la rom tourner sur émulateur (fceuxd ok, nestopia non).
A présent, je vais pouvoir faire quelques essais :)
Pour ceux qui voudraient également faire quelques tests, voici le code :
- Spoiler:
.inesprg 1 ;//one PRG bank
.ineschr 0 ;//zero CHR bank
.inesmir 0 ;//mirroring type 0
.inesmap 4 ;//memory mapper 4 (MMC3)
.org $C000
.bank 0
start:
LDA #$80
STA $2000 ; NMI generation on
LDA #$08
STA $2001 ; turn the BG on so that MMC3 can count
LDA #$40
STA $4017 ;disable frame counter IRQs
CLI ; enable IRQ processing
gameloop:
JMP gameloop
;// NMI routine
nmi:
LDA #$3F
STA $2006
LDA #$00
STA $2006 ;set the BG color to red
LDA #$06
STA $2007
LDA #$01
STA $E000
LDA #$78
STA $C000 ;setup MMC3 to generate an IRQ after
LDA #$78
STA $C001 ;120 scanlines
LDA #$01
STA $E000
LDA #$01
STA $E001
LDA #$00
STA $2006
LDA #$00
STA $2006
LDA #$08
STA $2001 ;BG on to enable counting for MMC3
RTI
irq:
pha
txa
pha ; save A,X and Y. you have to do this because
tya ; IRQs interrupt your main thread of code. having your
pha ; register values change in the middle of that main thread
; would be bad...
LDA #$00
STA $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
LDA #$00
STA $2006 ;set the BG color to green
LDA #$0A
STA $2007
LDA #$01
STA $E000 ;acknowledge the IRQ and disable further IRQ generation
LDA #$00
STA $2006
LDA #$00
STA $2006
pla
tay ; get your register values back
pla
tax
pla
RTI
;//wait until screen refresh
vwait:
lda $2002
bpl vwait ;//wait for start of retrace
vwait_1:
lda $2002
bmi vwait_1 ;//wait for end of retrace
RTS
;//jump table points to NMI, Reset, and IRQ start points
.bank 1
.org $fffa
.dw nmi
.dw start
.dw irq
Dernière édition par vincent2105 le Mer 27 Avr 2016 - 23:09, é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...
Afin d'avoir plusieurs interruptions et de changer la couleur de fond à chacune d'entre elle, j'ai conservé le code de la nmi et j'ai tenté de modifier la routine "IRQ" mais sans succès...
Autrement dit je n'arrive pas à déclencher d'autres interruptions :/ Je me replongerai la dedans demain...
Autrement dit je n'arrive pas à déclencher d'autres interruptions :/ Je me replongerai la dedans demain...
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Normal, je pense que la modif de l'interruption se fait dans le NMI (vblank sur nes ??) ..
Donc il faut que tu paramètres la prochaine scanline sur le mmc3 dans irq .
ton exemple ne change la couleur qu'un foi, à la ligne 120, donc le code qui indique au mmc3 quand générer une irq est dans le NMI, toi il faut que tu le mettes dans irq.
En gros tu dois faire :
NMI: ; On remet tout par defaut
je remets la couleurs du fond par defaut
je paramètre le mmc3 pour la ligne ou je veux ma première interruption
rti
irq: ; On modifie la couleur de fond et génére une nouvelle interruption dans la frame en cours
je change la couleur du fond
je paramètre le mmc3 pour la prochaine ligne
rti
Donc il faut que tu paramètres la prochaine scanline sur le mmc3 dans irq .
ton exemple ne change la couleur qu'un foi, à la ligne 120, donc le code qui indique au mmc3 quand générer une irq est dans le NMI, toi il faut que tu le mettes dans irq.
En gros tu dois faire :
NMI: ; On remet tout par defaut
je remets la couleurs du fond par defaut
je paramètre le mmc3 pour la ligne ou je veux ma première interruption
rti
irq: ; On modifie la couleur de fond et génére une nouvelle interruption dans la frame en cours
je change la couleur du fond
je paramètre le mmc3 pour la prochaine ligne
rti
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
C'est ce que je voulais faire :) en gras, c'est la où je coince...En gros tu dois faire :
NMI:
je remets la couleurs du fond par defaut
je paramètre le mmc3 pour la ligne ou je veux ma première interruption
rti
IRQ:
je change la couleur du fond
je paramètre le mmc3 pour la prochaine ligne
RTI
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Ok, je dirai
120 est mis en $20(low) et $01 (partie high)
- Code:
LDY #$01
STY $E000
LDX index
LDA tab_lignes , X
STA $C000 ;setup MMC3 to generate an IRQ
STA $C001
STY $E000
STY $E001
INC index
120 est mis en $20(low) et $01 (partie high)
Dernière édition par TOUKO le Jeu 28 Avr 2016 - 9:37, édité 1 fois
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Non non excuse moi, j'avais fait un test avant... j'ai remplacé la valeur $78(120) par $20 juste pour tester et j'ai oublié de rectifier après
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Oui ,non je déconne.Pour moi, y'a pas à utiliser 2 octets (on a pas plus de $FF scanlines)... Après de dis p'tet des aneries.
En fait tu as 262 lignes en tout dont 224 visibles sur nes je crois,le reste ce sont les lignes du vblank,mais si le mmc3 permet comme sur PCE de générer des interruptions sur les ligne du vblank, tu peux avoir les 262 lignes(utile pour jouer des samples par exemple ).
Par contre si il ne sait générer des interruptions que pendant l'affichage tu as raison 256 valeurs suffisent .
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Lol, j'ai pas mal pris la raillerie, tu peux y aller
Je regarderai cette histoire de scanlines plus tard, par contre dans ton code, y'a un truc qui diffère du tuto. tu écris des valeurs différentes en $c000 et $c001 (alors quelles sont identiques dans le tuto), idem pour $e000 et $e001...
PS : je sais pas si tu as vu mon message précédent, ça aura p'tet une incidence
Je regarderai cette histoire de scanlines plus tard, par contre dans ton code, y'a un truc qui diffère du tuto. tu écris des valeurs différentes en $c000 et $c001 (alors quelles sont identiques dans le tuto), idem pour $e000 et $e001...
PS : je sais pas si tu as vu mon message précédent, ça aura p'tet une incidence
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Ah oui, l'habitude de la pce dsl .
Non tu as raison, vu qu'il écrit 2x la même valeur dans les 2 registres semble montrer que tu ne peux que mettre une valeur 8 bits pour les lignes .
Je modifie le code.
Ensuite dans irq le fait d'acquiter l'interruption (lire/écrire dans $E000) va copier le contenu de $C001 dans $C000, ensuite tu mets la ligne suivante dans $C001(qui sera recopiée dans $C000 à la prochaine interruption) .
Version optimisée(comme une lecture/écriture suffit, peut importe la valeur dans $E000/$E001):
Non tu as raison, vu qu'il écrit 2x la même valeur dans les 2 registres semble montrer que tu ne peux que mettre une valeur 8 bits pour les lignes .
Je modifie le code.
- Code:
; Acquitte l'interruption, et copie la ligne/interruption suivante dans $c000
LDY #$01
STY $E000
; On paramètre pour la prochaine interruption
LDX index
LDA tab_lignes , X
STA $C001
STY $E000 ;Write to $E000 again to latch in the countdown value
STY $E001 ; Write to $E001 to enable the IRQ counter
INC index
; Peut être nécessaire pour lancer le décompte des ligne,mais pas sur
LDA #$08
STA $2001
Ensuite dans irq le fait d'acquiter l'interruption (lire/écrire dans $E000) va copier le contenu de $C001 dans $C000, ensuite tu mets la ligne suivante dans $C001(qui sera recopiée dans $C000 à la prochaine interruption) .
Version optimisée(comme une lecture/écriture suffit, peut importe la valeur dans $E000/$E001):
- Code:
; Acquitte l'interruption, et copie la ligne/interruption suivante dans $C000
LDX index
STX $E000
; On paramètre pour la prochaine interruption
LDA tab_lignes , X
STA $C001
STX $E000 ;Write to $E000 again to latch in the countdown value
STX $E001 ; Write to $E001 to enable the IRQ counter
INC index
; Peut être nécessaire pour lancer le décompte des ligne ,mais pas sur
LDA #$08
STA $2001
Dernière édition par TOUKO le Jeu 28 Avr 2016 - 11:21, édité 9 fois
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Je pense que le compteur de scanline est sur 8 bits.
D'après le tuto, tu écris d'abord le nombre de lignes avant la prochaine interruption en $C000, puis en $C001.
Dans $E000 et $E001, j'ai l'impression qu'il suffit d'y écrire une valeur, peu importe laquelle (dans le tuto ils écrivent des 1).
Ensuite, tu veux qu'il y ait plusieurs irq qui se déclenchent.
Dans la routine nmi tu dois choisir à quelle ligne se déclenche la première interruption irq.
Dans la routine irq, il te faut un compteur pour savoir où tu en es.
Et il te faut définir le nombre de lignes avant la prochaine.
Si tu es sur la dernière interruption irq, il faut faire juste la partie qui arrête les irq (comme dans le tuto).
EDIT :
Donc avec ce qu'à fait Touko, tu as ton compteur avec index.
D'après le tuto, tu écris d'abord le nombre de lignes avant la prochaine interruption en $C000, puis en $C001.
Dans $E000 et $E001, j'ai l'impression qu'il suffit d'y écrire une valeur, peu importe laquelle (dans le tuto ils écrivent des 1).
Ensuite, tu veux qu'il y ait plusieurs irq qui se déclenchent.
Dans la routine nmi tu dois choisir à quelle ligne se déclenche la première interruption irq.
Dans la routine irq, il te faut un compteur pour savoir où tu en es.
Et il te faut définir le nombre de lignes avant la prochaine.
Si tu es sur la dernière interruption irq, il faut faire juste la partie qui arrête les irq (comme dans le tuto).
EDIT :
Donc avec ce qu'à fait Touko, tu as ton compteur avec index.
nemokantio- Patient contaminé
- Nombre de messages : 345
Age : 48
Localisation : Delgastan
Date d'inscription : 23/01/2013
Re: Mr ToutLeMonde et la programmation NES...
Oui c'est exactement ça .
Donc pour résumer :
$C000 : contient la ligne où doit avoir l'interruption (à initialiser 1 foi pendant le NMI).
$C001: contient la valeur de la ligne suivante où générer une interruption, copié automatiquement dans $C000 lors de la lecture/écriture dans $E000,donc doit être initialisée pendant le NMI.
$E000: désactive/acquitte les interruptions du MMC3 si on lit/écrit (peut importe la valeur, elle sert à rien),et copie le contenu de $C001 dans $C000 .
$E001:active les interruptions du MMC3 si on lit/écrit (peut importe la valeur, elle sert à rien).
PS: Bien sur cela ne prend pas en compte la conf correcte des vecteurs d'interruptions qui doit être faite avant .
Donc pour résumer :
$C000 : contient la ligne où doit avoir l'interruption (à initialiser 1 foi pendant le NMI).
$C001: contient la valeur de la ligne suivante où générer une interruption, copié automatiquement dans $C000 lors de la lecture/écriture dans $E000,donc doit être initialisée pendant le NMI.
$E000: désactive/acquitte les interruptions du MMC3 si on lit/écrit (peut importe la valeur, elle sert à rien),et copie le contenu de $C001 dans $C000 .
$E001:active les interruptions du MMC3 si on lit/écrit (peut importe la valeur, elle sert à rien).
PS: Bien sur cela ne prend pas en compte la conf correcte des vecteurs d'interruptions qui doit être faite avant .
Dernière édition par TOUKO le Jeu 28 Avr 2016 - 13:45, édité 1 fois
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Merci à tous les 2
En utilisant ta routine Touko, j'ai réussi à déclencher plusieurs interruptions mais visiblement pas avec les valeurs que j'avais déclarées dans tab_lignes (il semblerait que ca ne prenne en compte que la valeur de la première écriture à $c000 dans le NMI) et pas à chaque frame...
Je vais essayer d'assimiler toutes vos explications
En utilisant ta routine Touko, j'ai réussi à déclencher plusieurs interruptions mais visiblement pas avec les valeurs que j'avais déclarées dans tab_lignes (il semblerait que ca ne prenne en compte que la valeur de la première écriture à $c000 dans le NMI) et pas à chaque frame...
- Spoiler:
Je vais essayer d'assimiler toutes vos explications
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 déjà un début, quand ça sera maîtrisé, tu feras ce que tu veux avec .
Sinon si tu peux mettre ton code, peut être qu'on verra ce qui cloche .
EDIT: en regardant mon code y'a un truc qui me parait bizarre .
Il faut sortir du NMI avec index = index + 2, car:
nmi:
$C000 = tab_lignes , index = ligne 1 (première interruption)
$C001 = tab_lignes , index + 1 = ligne suivant
irq:
$C001 = tab_lignes , index + 2 = 1ere ligne suivante dans irq .
inc index
Essayes ça :
Sinon si tu peux mettre ton code, peut être qu'on verra ce qui cloche .
EDIT: en regardant mon code y'a un truc qui me parait bizarre .
Il faut sortir du NMI avec index = index + 2, car:
nmi:
$C000 = tab_lignes , index = ligne 1 (première interruption)
$C001 = tab_lignes , index + 1 = ligne suivant
irq:
$C001 = tab_lignes , index + 2 = 1ere ligne suivante dans irq .
inc index
Essayes ça :
- Code:
; Acquitte l'interruption, et copie la ligne/interruption suivante dans $C000
STX $E000
; On paramètre pour la prochaine interruption
LDX index
LDA tab_lignes , X
STA $C001
STX $E001 ; Write to $E001 to enable the IRQ counter
INC index
Dernière édition par TOUKO le Jeu 28 Avr 2016 - 14:00, édité 5 fois (Raison : n)
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
Je t'avertis c'est brut de coffre.J'ai vraiment fait ça à l'arrache
J'étais juste content de voir qu'il y avait eu plusieurs interruptions
J'ai vu que t'avais édité, j'ai remplacé, mais apparemment pas de changement...
J'étais juste content de voir qu'il y avait eu plusieurs interruptions
J'ai vu que t'avais édité, j'ai remplacé, mais apparemment pas de changement...
- Spoiler:
.inesprg 1 ;//one PRG bank
.ineschr 0 ;//zero CHR bank
.inesmir 0 ;//mirroring type 0
.inesmap 4 ;//memory mapper 4 (MMC3)
.org $C000
.bank 0
index .rs 1
start:
LDA #$80
STA $2000 ; NMI generation on
LDA #$08
STA $2001 ; turn the BG on so that MMC3 can count
LDA #$40
STA $4017 ;disable frame counter IRQs
CLI ; enable IRQ processing
gameloop:
JMP gameloop
;// NMI routine
nmi:
LDA #$3F
STA $2006
LDA #$00
STA $2006 ;set the BG color to red
LDA #$06
STA $2007
LDA #$01
STA $E000
LDA #$30
STA $C000 ;setup MMC3 to generate an IRQ after
;LDA #$30
;STA $C001 ;120 scanlines
LDA #$01
STA $E000
LDA #$01
STA $E001
LDA #$00
STA $2006
LDA #$00
STA $2006
LDA #$08
STA $2001 ;BG on to enable counting for MMC3
RTI
irq:
pha
txa
pha ; save A,X and Y. you have to do this because
tya ; IRQs interrupt your main thread of code. having your
pha ; register values change in the middle of that main thread
; would be bad...
LDA #$00
STA $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
LDA #$00
STA $2006 ;set the BG color to green
LDA #$00
STA $2007
;****************************
; Acquitte l'interruption, et copie la ligne/interruption suivante dans $C000
STX $E000
; On paramètre pour la prochaine interruption
LDX index
LDA tab_lignes , X
STA $C001
STX $E001 ; Write to $E001 to enable the IRQ counter
INC index
; Peut être nécessaire pour lancer le décompte des ligne,mais pas sur
;LDA #$08
;STA $2001
;****************************
LDA index
CMP #$00
BNE suite1
LDA #$00
STA $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
LDA #$00
STA $2006 ;set the BG color
LDA #$0A
STA $2007
JMP fin
suite1:
LDA index
CMP #$01
BNE suite2
LDA #$00
STA $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
LDA #$00
STA $2006 ;set the BG color
LDA #$22
STA $2007
JMP fin
suite2:
LDA index
CMP #$02
BNE suite3
LDA #$00
STA $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
LDA #$00
STA $2006 ;set the BG
LDA #$28
STA $2007
LDA #$01
STA $E000 ;acknowledge the IRQ and disable further IRQ generation
JMP fin
suite3:
fin:
; Peut être nécessaire pour lancer le décompte des ligne,mais pas sur
LDA #$08
STA $2001
; LDA #$01
;STA $E000 ;acknowledge the IRQ and disable further IRQ generation
LDA #$00
STA $2006
LDA #$00
STA $2006
pla
tay ; get your register values back
pla
tax
pla
RTI
;//wait until screen refresh
vwait:
lda $2002
bpl vwait ;//wait for start of retrace
vwait_1:
lda $2002
bmi vwait_1 ;//wait for end of retrace
RTS
tab_lignes:
.db $40, $50, $60
;//jump table points to NMI, Reset, and IRQ start points
.bank 1
.org $fffa
.dw nmi
.dw start
.dw irq
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Ouhla, la suite après inc index, je vois pas à quoi ça pourrait servir ..
EDIT:Ah oui à changer la couleurs du bckgnd .
Essayes ça(j'ai un peu optimisé aussi) :
EDIT:Ah oui à changer la couleurs du bckgnd .
Essayes ça(j'ai un peu optimisé aussi) :
- Code:
Ouhla, la suite après inc index, je vois pas à quoi ça pourrait servir ..
EDIT:Ah oui à changer la couleurs du bckgnd .
Essayes ça(j'ai un peu optimisé aussi) :
.inesprg 1 ;//one PRG bank
.ineschr 0 ;//zero CHR bank
.inesmir 0 ;//mirroring type 0
.inesmap 4 ;//memory mapper 4 (MMC3)
.org $C000
.bank 0
index .rs 1
start:
LDA #$80
STA $2000 ; NMI generation on
LDA #$08
STA $2001 ; turn the BG on so that MMC3 can count
LDA #$40
STA $4017 ;disable frame counter IRQs
CLI ; enable IRQ processing
gameloop:
JMP gameloop
;// NMI routine
nmi:
LDA #$3F
STA $2006
LDA #$00
STA $2006 ;set the BG color to red
STA index ; remet l'index à 0
LDA #$06
STA $2007
STA $E000
LDA #$20
STA $C000 ;setup MMC3 to generate an IRQ after
LDA #$30
STA $C001 ;120 scanlines
STA $E001
LDA #$00
STA $2006
STA $2006
LDA #$08
STA $2001 ;BG on to enable counting for MMC3
RTI
irq:
pha
txa
pha ; save A,X and Y. you have to do this because
tya ; IRQs interrupt your main thread of code. having your
pha ; register values change in the middle of that main thread
; would be bad...
;****************************
; Acquitte l'interruption, et copie la ligne/interruption suivante dans $C000
STX $E000
LDY #$00
STY $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
STY $2006 ;set the BG color to green
STY $2007
; On paramètre pour la prochaine interruption
LDX index
LDA tab_lignes , X
CPX #$FF ; Fin du tableau ??
BEQ .exit_interruption ; Si oui on quitte l'interruption
STA $C001
INC index
; Peut être nécessaire pour lancer le décompte des ligne,mais pas sur
;LDA #$08
;STA $2001
;****************************
LDX index
BNE suite1
STX $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
STY $2006 ;set the BG color
LDA #$0A
STA $2007
JMP fin
suite1:
CPX #$01
BNE suite2
STY $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
STY $2006 ;set the BG color
LDA #$22
STA $2007
JMP fin
suite2:
CPX #$02
BNE suite3
STY $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
STY $2006 ;set the BG
LDA #$28
STA $2007
suite3:
fin:
; Peut être nécessaire pour lancer le décompte des ligne,mais pas sur
LDA #$08
STA $2001
STY $2006
STY $2006
STX $E001 ; Write to $E001 to enable the IRQ counter
.exit_interruption:
pla
tay ; get your register values back
pla
tax
pla
RTI
;//wait until screen refresh
vwait:
lda $2002
bpl vwait ;//wait for start of retrace
vwait_1:
lda $2002
bmi vwait_1 ;//wait for end of retrace
RTS
tab_lignes:
.db $40, $50, $60 , $FF
;//jump table points to NMI, Reset, and IRQ start points
.bank 1
.org $fffa
.dw nmi
.dw start
.dw irq
Dernière édition par TOUKO le Jeu 28 Avr 2016 - 14:59, édité 1 fois
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
J'obtiens "en continu" le resultat suivant :
BNE continue
JMP exit_interruption ; Si oui on quitte l'interruption
continue:
- Spoiler:
- Code:
BEQ .exit_interruption ; Si oui on quitte l'interruption
BNE continue
JMP exit_interruption ; Si oui on quitte l'interruption
continue:
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Mr ToutLeMonde et la programmation NES...
Attention je viens de mettre à jour le code ..
Ok, je mets le nouveau code(j'ai supprimé du code inutile et remis le BEQ .exit_interruption):
Ah mince je pensais pas que le saut faisait plus de 127 octets ..Un détail pour pouvoir assembler, j'ai remplacé :
Ok, je mets le nouveau code(j'ai supprimé du code inutile et remis le BEQ .exit_interruption):
- Code:
.inesprg 1 ;//one PRG bank
.ineschr 0 ;//zero CHR bank
.inesmir 0 ;//mirroring type 0
.inesmap 4 ;//memory mapper 4 (MMC3)
.org $C000
.bank 0
index .rs 1
start:
LDA #$80
STA $2000 ; NMI generation on
LDA #$08
STA $2001 ; turn the BG on so that MMC3 can count
LDA #$40
STA $4017 ;disable frame counter IRQs
CLI ; enable IRQ processing
gameloop:
JMP gameloop
;// NMI routine
nmi:
LDA #$3F
STA $2006
LDA #$00
STA $2006 ;set the BG color to red
STA index ; remet l'index à 0
LDA #$06
STA $2007
STA $E000
LDA #$20
STA $C000 ;setup MMC3 to generate an IRQ after
LDA #$30
STA $C001 ;120 scanlines
STA $E001
LDA #$00
STA $2006
STA $2006
LDA #$08
STA $2001 ;BG on to enable counting for MMC3
RTI
irq:
pha
txa
pha ; save A,X and Y. you have to do this because
tya ; IRQs interrupt your main thread of code. having your
pha ; register values change in the middle of that main thread
; would be bad...
;****************************
; Acquitte l'interruption, et copie la ligne/interruption suivante dans $C000
STX $E000
LDY #$00
STY $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
STY $2006 ;set the BG color to green
STY $2007
; On paramètre pour la prochaine interruption
LDX index
LDA tab_lignes , X
CMP #$FF
BEQ .exit_interruption
STA $C001
INX
STX index
CPX #$01
BNE suite2
STY $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
STY $2006 ;set the BG color
LDA #$22
STA $2007
JMP fin
suite2:
CPX #$02
BNE suite3
STY $2001 ;BG off to force stupid emulators to realize i'm changing the BG color
LDA #$3F
STA $2006
STY $2006 ;set the BG
LDA #$28
STA $2007
suite3:
fin:
; Peut être nécessaire pour lancer le décompte des ligne,mais pas sur
LDA #$08
STA $2001
STY $2006
STY $2006
STX $E001 ; Write to $E001 to enable the IRQ counter
.exit_interruption:
pla
tay ; get your register values back
pla
tax
pla
RTI
;//wait until screen refresh
vwait:
lda $2002
bpl vwait ;//wait for start of retrace
vwait_1:
lda $2002
bmi vwait_1 ;//wait for end of retrace
RTS
tab_lignes:
.db $40, $50, $60 , $FF
;//jump table points to NMI, Reset, and IRQ start points
.bank 1
.org $fffa
.dw nmi
.dw start
.dw irq
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
C'est kifkif
Après c'est peut-être un problème d'émulation non ?
Après c'est peut-être un problème d'émulation non ?
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 possible ,cependant on voit bien qu'il y a les 3 interruptions, donc ça marche déjà pas mal .
Reste à savoir si par exemple la ligne 10, est bien la 10, par exemple sur PCE (et autres), il faut rajouter 64 pour avoir la vraie ligne écran car l'affichage commence à la ligne 64 (la taille verticale max des sprites),sur Md c'est 32 .
Reste à savoir si par exemple la ligne 10, est bien la 10, par exemple sur PCE (et autres), il faut rajouter 64 pour avoir la vraie ligne écran car l'affichage commence à la ligne 64 (la taille verticale max des sprites),sur Md c'est 32 .
Invité- Invité
Re: Mr ToutLeMonde et la programmation NES...
On a perdu une interruption en route (background vert), mais là je pense pas que ce soit un pb d'émulation, je pense qu'on peut encore "creuser"... hein touko ?!
vincent2105- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Page 11 sur 34 • 1 ... 7 ... 10, 11, 12 ... 22 ... 34
Sujets similaires
» Programmation CPS-1
» La programmation Megadrive
» Mr ToutLeMonde et la programmation NES...
» Programmation Nintendo SWITCH ?
» Mr ToutLeMonde et la programmation GameBoy...
» La programmation Megadrive
» Mr ToutLeMonde et la programmation NES...
» Programmation Nintendo SWITCH ?
» Mr ToutLeMonde et la programmation GameBoy...
Page 11 sur 34
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum