[WIP]ASM C64
Modérateurs : Papy.G, fneck, Carl
[WIP]ASM C64
Bonjour à tous,
Ce topic fait suite à ma présentation : viewtopic.php?f=1&t=14180&p=225100#p225100
Pour résumer, j'essaie de développer un shooter à défilement vertical sur commodore 64.
Pour cela je vais écrire le moteur du jeux en ASM 6502 et en ce moment je suis sur l'algorithme du scrolling vertical de haut vers le bas.
Je vais y aller par objectif histoire de ne pas m'éparpiller, dès que celui-ci est atteint, je passerai à un nouvel objectif .
Tous les graphismes en pixel art seront réalisés en fin de projet.
Objectif : Écrire un algorithme pour un scrolling fluide avec effet parallax.
Contrainte :
-Défilement de 1 pixel minimum.
-Deux plans superposés BG1 et BG2 de 1000 tiles (8x8px) (BG1 en priorité haut)
-Pré-calcule de l'image.
-Optimisation des cycles pour la fenêtre Raster (Vblank)
La ou cela va être coton c'est pour la superposition des deux plans.
Pour le pré-calcule je vais tenter de codé l'idée suivante en fusionnant BG2 et BG1 :
Un 0 représentera un pixel transparent sur BG1. BG2 n'aura pas de pixel transparent car c'est le niveau le plus bas
Organigramme des opérations :
Pré-calcul de BG2 avec décalage de X pixels vers le bas.
Pré-calcul de BG1 avec décalage de X pixels vers le bas.
Parcours de BG1 et BG2 simultanément, lecture des pixels de BG1, tant que sa valeur est autre que 0, je copie ce pixel
dans un troisième tableau en mémoire (rendu final), si se pixel = 0, c'est le pixel de BG2 que je copie à la place. Normalement, avec cette organisation à deux plans, je devrais avoir des effets de profondeur sympa.
BG2 défilera plus lentement que BG1, je pourrai même ajusté individuellement ou par groupe la vitesse de défilement
de chaque ligne ou colonne de pixel.
Dans un premier temps, je vais validé cette idée avec des tiles de 8 pixel.
J'aurai surement des questions et merci par avance pour toutes aides/conseils apportés.
Ce topic fait suite à ma présentation : viewtopic.php?f=1&t=14180&p=225100#p225100
Pour résumer, j'essaie de développer un shooter à défilement vertical sur commodore 64.
Pour cela je vais écrire le moteur du jeux en ASM 6502 et en ce moment je suis sur l'algorithme du scrolling vertical de haut vers le bas.
Je vais y aller par objectif histoire de ne pas m'éparpiller, dès que celui-ci est atteint, je passerai à un nouvel objectif .
Tous les graphismes en pixel art seront réalisés en fin de projet.
Objectif : Écrire un algorithme pour un scrolling fluide avec effet parallax.
Contrainte :
-Défilement de 1 pixel minimum.
-Deux plans superposés BG1 et BG2 de 1000 tiles (8x8px) (BG1 en priorité haut)
-Pré-calcule de l'image.
-Optimisation des cycles pour la fenêtre Raster (Vblank)
La ou cela va être coton c'est pour la superposition des deux plans.
Pour le pré-calcule je vais tenter de codé l'idée suivante en fusionnant BG2 et BG1 :
Un 0 représentera un pixel transparent sur BG1. BG2 n'aura pas de pixel transparent car c'est le niveau le plus bas
Organigramme des opérations :
Pré-calcul de BG2 avec décalage de X pixels vers le bas.
Pré-calcul de BG1 avec décalage de X pixels vers le bas.
Parcours de BG1 et BG2 simultanément, lecture des pixels de BG1, tant que sa valeur est autre que 0, je copie ce pixel
dans un troisième tableau en mémoire (rendu final), si se pixel = 0, c'est le pixel de BG2 que je copie à la place. Normalement, avec cette organisation à deux plans, je devrais avoir des effets de profondeur sympa.
BG2 défilera plus lentement que BG1, je pourrai même ajusté individuellement ou par groupe la vitesse de défilement
de chaque ligne ou colonne de pixel.
Dans un premier temps, je vais validé cette idée avec des tiles de 8 pixel.
J'aurai surement des questions et merci par avance pour toutes aides/conseils apportés.
Re: [WIP]ASM C64
J'ai fais des tests de scrolling avec la méthode à deux plans comme je l'ai expliqué précédemment, et bien c'est encourageant !
Alors, j'ai bien un rendu sur deux plans, c'est assez bluffant
Pour la suite, LAYER1 = plan1, LAYER2 = plan2, BG = fusion de LAYER1 et LAYER2
J'ai testé :
-LAYER2 fixe, LAYER1 en mode scrolling.
-LAYER1 fixe, LAYER2 en mode scrolling
-Mode Scrolling simultané de LAYER1 et LAYER2 à des vitesses différentes.
J'ai utilisé une barre horizontale de 24px sur la largeur de l'écran pour le LAYER1, le LAYER2 est plus complexe, ce sont des tiles disposés au hasard (C'est pour les tests )
Un aperçu du mode scrolling simultané des deux plans.
(On se rend bien compte que LAYER1 est prioritaire, LAYER2 glisse en dessous)
https://www.youtube.com/embed/aQ0HYf67k7U
Je vais continuer à explorer ce que je peux faire avec cette méthode avant de porter ça au pixel près.
Il faut que je vois comment gérer la ram couleur, il me faut aussi une vrai interruption Raster et un Timer.
Si vous avez des suggestions n’hésitè pas !
Alors, j'ai bien un rendu sur deux plans, c'est assez bluffant
Pour la suite, LAYER1 = plan1, LAYER2 = plan2, BG = fusion de LAYER1 et LAYER2
J'ai testé :
-LAYER2 fixe, LAYER1 en mode scrolling.
-LAYER1 fixe, LAYER2 en mode scrolling
-Mode Scrolling simultané de LAYER1 et LAYER2 à des vitesses différentes.
J'ai utilisé une barre horizontale de 24px sur la largeur de l'écran pour le LAYER1, le LAYER2 est plus complexe, ce sont des tiles disposés au hasard (C'est pour les tests )
Un aperçu du mode scrolling simultané des deux plans.
(On se rend bien compte que LAYER1 est prioritaire, LAYER2 glisse en dessous)
https://www.youtube.com/embed/aQ0HYf67k7U
Je vais continuer à explorer ce que je peux faire avec cette méthode avant de porter ça au pixel près.
Il faut que je vois comment gérer la ram couleur, il me faut aussi une vrai interruption Raster et un Timer.
Si vous avez des suggestions n’hésitè pas !
Re: [WIP]ASM C64
Sur C64 tu à la possibilité de caler une interruption sur le Raster,
mais j'ai du mal à ma rappeler de mémoire
Je le faisait à l'époque pour les effets de barres colorées
mais j'ai du mal à ma rappeler de mémoire
Je le faisait à l'époque pour les effets de barres colorées
-
- Messages : 1293
- Inscription : 24 déc. 2021 09:46
- Localisation : Région parisienne
Re: [WIP]ASM C64
Voici un exemple d'utilisation d'interruption Raster :
https://github.com/joakimkarlsson/c64/b ... errupt.asm
https://github.com/joakimkarlsson/c64/b ... errupt.asm
Re: [WIP]ASM C64
Merci pour ces infos
En fait, cela fait quelques jours que je travail sur cette interruption Raster dès que j'ai du temps libre.
J'ai écris une routine qui initialise une interruption Raster sur la ligne 0, puis modifie la valeur du pointer $FFFE - $FFFF
pour qu'il pointe vers ma routine IRQ.
Dans cette routine IRQ, j'ai une variable global que j'ai nommée ''FrameRate" et que j’incrémente à chaque interruption sur la ligne 0. Quand cette variable atteint une certaine valeur, je lance un scroll vertical d'un pas de 1 pixel via les bits 0,1,2 du registre $D011 du VIC II.
Une fois que l'écran a été décalé de 8 pixels vers le bas, je met à jours le tilmap en le décalant de 1 ligne de tile vers le bas, la ligne du bas est copier dans la première ligne du haut et ainsi de suite...
Mon souci actuel est que pour faire glisser le tilmap de haut en bas (en gros c'est un tableau de 40 x 25) je dois partir de la dernière ligne de tile en bas (ligne 25), la sauvegarder, puis copier sa ligne précédente à sa place. Je remonte comme ça jusqu'à la ligne 2 et copie la ligne 25 sauvegarder dans la ligne 1.
Le souci c'est l'algorithme pour calculer les pointers de début de chaque ligne, il faut soustraire $0028 du pointer 16 bits (40 en décimal) de l'adresse actuelle.
Et il faut gérer le cas ou l'octet de poids faible est inférieur à $28 ( exemple $5118 - $0028 = Poids faible $18-$28 et Poids fort $51-$00 )
Ma routine de soustraction ne fonctionne pas et j'obtiens une belle bouillie de pixels
En fait, cela fait quelques jours que je travail sur cette interruption Raster dès que j'ai du temps libre.
J'ai écris une routine qui initialise une interruption Raster sur la ligne 0, puis modifie la valeur du pointer $FFFE - $FFFF
pour qu'il pointe vers ma routine IRQ.
Dans cette routine IRQ, j'ai une variable global que j'ai nommée ''FrameRate" et que j’incrémente à chaque interruption sur la ligne 0. Quand cette variable atteint une certaine valeur, je lance un scroll vertical d'un pas de 1 pixel via les bits 0,1,2 du registre $D011 du VIC II.
Une fois que l'écran a été décalé de 8 pixels vers le bas, je met à jours le tilmap en le décalant de 1 ligne de tile vers le bas, la ligne du bas est copier dans la première ligne du haut et ainsi de suite...
Mon souci actuel est que pour faire glisser le tilmap de haut en bas (en gros c'est un tableau de 40 x 25) je dois partir de la dernière ligne de tile en bas (ligne 25), la sauvegarder, puis copier sa ligne précédente à sa place. Je remonte comme ça jusqu'à la ligne 2 et copie la ligne 25 sauvegarder dans la ligne 1.
Le souci c'est l'algorithme pour calculer les pointers de début de chaque ligne, il faut soustraire $0028 du pointer 16 bits (40 en décimal) de l'adresse actuelle.
Et il faut gérer le cas ou l'octet de poids faible est inférieur à $28 ( exemple $5118 - $0028 = Poids faible $18-$28 et Poids fort $51-$00 )
Ma routine de soustraction ne fonctionne pas et j'obtiens une belle bouillie de pixels
Code : Tout sélectionner
;Pointer de la dernière ligne
LDA #$0C
STA LastLine
LDA #$50
STA LastLine + 1
LDA LastLine ;Charge l'octet de poids faible
SEC ;Met une retenue
SBC #$28 ;Soustrait $28 de l'octet de poids faible
STA LastLine ;Met à jour l'octet de poids faible
BMI HigtVal ;Si le résultat de la soustraction est négatif saute au label HighVal
RTS
HighVal
LDX LastLine +1 ;Charge l'octet de poids fort
DEX ;Décrémente l'octet de poids fort de 1
STX LstLine +1 ; Met à jours l'octet de poids fort.
RTS
Re: [WIP]ASM C64
Pour la soustraction simple à faire avec la retenue
Si carry est positionné alors tu décrémente l'octet de poids fort
Mais il faut pas mettre la retenue avant la soustraction met la mettre à zéro
Si carry est positionné alors tu décrémente l'octet de poids fort
Mais il faut pas mettre la retenue avant la soustraction met la mettre à zéro
Re: [WIP]ASM C64
D'accord,
Du coup :
Du coup :
Code : Tout sélectionner
;Update pointers
LDA PTR_LASTLINE;Load low bit to pointer LastLine
CLC
SBC #$28;Subtraced $28
STA PTR_LASTLINE
BCC HO_SUB1
HO_SUB1 DEC PTR_LASTLINE+1
- fneck
- Site Admin
- Messages : 17531
- Inscription : 01 avr. 2007 12:03
- Localisation : Drôme Provençale (26)
- Contact :
Re: [WIP]ASM C64
Une question de grand néophyte, ça veut dire quoi le [WIP] mis en exergue dans le titre du sujet ?
Fabien https://www.system-cfg.com
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Re: [WIP]ASM C64
Work in progress... foutu jargon.
- fneck
- Site Admin
- Messages : 17531
- Inscription : 01 avr. 2007 12:03
- Localisation : Drôme Provençale (26)
- Contact :
Re: [WIP]ASM C64
Of course
Je ne pense pas que j'étais le seul à ne pas comprendre.
Je ne pense pas que j'étais le seul à ne pas comprendre.
Fabien https://www.system-cfg.com
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Re: [WIP]ASM C64
En effet,
WIP = Works In Progress, pour " En cours de construction ".
Ce sigle est assez fréquent sur le net.
WIP = Works In Progress, pour " En cours de construction ".
Ce sigle est assez fréquent sur le net.
Re: [WIP]ASM C64
Quelqu'un sait comment faire pour avoir une routine RASTER stable ?
J'utilise une double interruption pour mon scrolling mais je n'arrive pas à calibrer les interruptions au nombre de cycles, j'ai un souci de clipping sur quelques lignes.
Voici mon code :
J'utilise une double interruption pour mon scrolling mais je n'arrive pas à calibrer les interruptions au nombre de cycles, j'ai un souci de clipping sur quelques lignes.
Voici mon code :
Code : Tout sélectionner
;-------------INTERRUPTION IRQ_SCROLL
IRQ_SCROLL
;Sauvegarde des registres
PHA
TXA
PHA
;Démarre sur la ligne Raster 247
Ip LDX $D012
CPX #$F7
BNE Ip
;Confirmation l'interruption Raster
ASL $D019
LDX SMOOTH ;boucle de test, décalage de 7 PX max
CPX #$08
BNE scroll
;
LDA #$FF ; 2émé interruption définit sur la ligne 255
STA $D012
LDA #<IRQ_SHIT
STA $FFFE
LDA #>IRQ_SHIT
STA $FFFF
; Remise à 0 de l'index de décalage
LDX #$00
STX SMOOTH
; +--------------
scroll ; scrolling de 1PX
LDA $D011
AND #%11111000
STA $D011
LDX SMOOTH
INX
STX SMOOTH
PLA
TAX
PLA
RTI
;2émé interruption
IRQ_SHIT
ASL $D019
IIp LDX $D012
CPX #$FF
BNE IIp
;Rettour à l'interruption d'origine
LDA #$F7
STA $D012
LDA #<IRQ_SCROLL
STA $FFFE
LDA #>IRQ_SCROLL
STA $FFFF
JSR SHIFTMAP ; Décale le Tilemap vers le bas de 1 tiles
RTI
;-----------FIN
Re: [WIP]ASM C64
De mémoire j'utilisais les interruption sur $314 et $315 et ca fonctionnais très bien.
Mais bon c'est des souvenir de 40 ans
Il me semble qu'il faille désactivé l'int du CIA avant toute chose en encadrant par SEC et SEI.
Mais bon c'est des souvenir de 40 ans
Il me semble qu'il faille désactivé l'int du CIA avant toute chose en encadrant par SEC et SEI.
Re: [WIP]ASM C64
Salut 6502Man,
C'est bien ce que j'ai fais !
Sauf que moi j'ai désactivé le Kernal et la rom basique via le registre $01, puis modifier le vecteur des interruptions $FFFE-$FFFF pour le rediriger vers mon interruption Raster.
Comme ceci :
C'est bien ce que j'ai fais !
Sauf que moi j'ai désactivé le Kernal et la rom basique via le registre $01, puis modifier le vecteur des interruptions $FFFE-$FFFF pour le rediriger vers mon interruption Raster.
Comme ceci :