[WIP]ASM C64

Cette catégorie traite de développements récents destinés à nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Izidor
Messages : 13
Inscription : 01 mars 2023 15:38

[WIP]ASM C64

Message par Izidor »

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.
Capture.JPG
Capture.JPG (22.72 Kio) Consulté 3090 fois
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.
Izidor
Messages : 13
Inscription : 01 mars 2023 15:38

Re: [WIP]ASM C64

Message par Izidor »

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 :wink: )
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 !
Avatar de l’utilisateur
6502man
Messages : 12329
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [WIP]ASM C64

Message par 6502man »

Sur C64 tu à la possibilité de caler une interruption sur le Raster,
mais j'ai du mal à ma rappeler de mémoire :oops:

Je le faisait à l'époque pour les effets de barres colorées :lol:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Bernouilli92
Messages : 1293
Inscription : 24 déc. 2021 09:46
Localisation : Région parisienne

Re: [WIP]ASM C64

Message par Bernouilli92 »

Voici un exemple d'utilisation d'interruption Raster :
https://github.com/joakimkarlsson/c64/b ... errupt.asm
Izidor
Messages : 13
Inscription : 01 mars 2023 15:38

Re: [WIP]ASM C64

Message par Izidor »

Merci pour ces infos :wink:

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 :lol:

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
         
Avatar de l’utilisateur
6502man
Messages : 12329
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [WIP]ASM C64

Message par 6502man »

Pour la soustraction simple à faire avec la retenue :wink:
Si carry est positionné alors tu décrémente l'octet de poids fort :D
Mais il faut pas mettre la retenue avant la soustraction met la mettre à zéro :wink:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Izidor
Messages : 13
Inscription : 01 mars 2023 15:38

Re: [WIP]ASM C64

Message par Izidor »

D'accord,
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
Avatar de l’utilisateur
6502man
Messages : 12329
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [WIP]ASM C64

Message par 6502man »

Oui c'est exactement ca ;)
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Avatar de l’utilisateur
fneck
Site Admin
Messages : 17531
Inscription : 01 avr. 2007 12:03
Localisation : Drôme Provençale (26)
Contact :

Re: [WIP]ASM C64

Message par fneck »

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
Zebulon
Messages : 2806
Inscription : 02 nov. 2020 14:03

Re: [WIP]ASM C64

Message par Zebulon »

Work in progress... foutu jargon. :roll:
Avatar de l’utilisateur
fneck
Site Admin
Messages : 17531
Inscription : 01 avr. 2007 12:03
Localisation : Drôme Provençale (26)
Contact :

Re: [WIP]ASM C64

Message par fneck »

Of course :(
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
Izidor
Messages : 13
Inscription : 01 mars 2023 15:38

Re: [WIP]ASM C64

Message par Izidor »

En effet,
WIP = Works In Progress, pour " En cours de construction ".
Ce sigle est assez fréquent sur le net. :mrgreen:
Izidor
Messages : 13
Inscription : 01 mars 2023 15:38

Re: [WIP]ASM C64

Message par Izidor »

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 :

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       
Avatar de l’utilisateur
6502man
Messages : 12329
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [WIP]ASM C64

Message par 6502man »

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 :o :roll:

Il me semble qu'il faille désactivé l'int du CIA avant toute chose en encadrant par SEC et SEI.
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Izidor
Messages : 13
Inscription : 01 mars 2023 15:38

Re: [WIP]ASM C64

Message par Izidor »

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 :
Capture.JPG
Capture.JPG (49.17 Kio) Consulté 2410 fois
Répondre