Logicielsmoto.com

Nous sommes le 03 Juil 2022, 19:59

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 420 messages ]  Aller à la page Précédente  1 ... 21, 22, 23, 24, 25, 26, 27, 28  Suivante
Auteur Message
MessagePosté: 05 Avr 2022, 09:08 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 307
Localisation: Var
Je n’y avais pas du tout pensé …
Super idée Sam !

Bon du coup j'ai repris et un peu factorisé la suite :
Code:
_MountObject MACRO
        ; param 1 : ObjID_
        ; manual mount of an object from the resident page 1
        lda   Obj_Index_Page+\1
        _SetCartPageA
        ldx   Obj_Index_Address+2*\1
 ENDM

_RunObject MACRO
        ; param 1 : ObjID_
        ; param 2 : Object data RAM address
        ; manual launch of an object from the resident page 1
        _MountObject \1
        ldu   #\2       
        jsr   ,x
 ENDM


L'avantage de ces modifs c'est qu'elles se répercutent automatiquement sur toutes les démos ;-)


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 05 Avr 2022, 10:42 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
Est-ce que tu peux ajouter
Code:
    PRAGMA autobranchlength
en début de source et voir si ca change quelque chose ? (ca devrait transformer les sauts longs en courts si possible.)

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 05 Avr 2022, 13:28 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 307
Localisation: Var
Oui j'ai essayé, mais il faut ajouter aussi noforwardrefmax pour que autobranchlength fonctionne (j'ai eu une discussion avec l'auteur sur le sujet, il a ajouté l'info dans la doc du coup).

Le problème c'est que ça met la nuit des temps pour compiler avec ces options ...

Bon du coup j'ai géré comme ça :
Code:
DrawChunk
   lda   c_h_tl
 IFDEF T2
   lbeq  EndOfChunk
 ELSE
   beq   EndOfChunk
 ENDC


C'est la routine de commutation de page pour T.2 qui nécessite bcp d'instructions et qui rallonge le code quand on build la version T.2, du coup avec la solution ci dessus ça passe et la version disquette est OK.
Ceci dit je pense que je vais modifier la routine pour forcer le chargement des tiles et des maps en RAM dans le cas de la T.2,
et ne pas utiliser la commutation de page T.2 dans cette partie du code.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 05 Avr 2022, 13:47 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
Ah tiens, je n'aurais pas cru que cela avait un impact sur la vitesse de compilation. Est-ce que au moins cela a un impact sur la vitesse du moteur ?

Quant au fait que la routine de commutation de T2 soit grosse, pourquoi ne fais tu pas simplement un routine plutôt que de l'inliner ? A la louche il y a pas loin de 70 cycles dans cette commutation, alors ajouter quelques cycles pour un couple JSR/RTS mais gagner plein d'octets peut être intéressant.

Sinon, quelques petites optims sur la taille du code de cette macro: tu as LDA #$AA et plus loin LDA #$55. Tu peux remplacer le dernier LDA par un simple LSRA, tu aura la même valeur mais avec un seul octet. Ensuite dans les deux chemins d'execution suivant le résultat du TSTA au début on écrit juste après A en glb_Page. Aussi on peut avancer ce STA glb_Page au début et se passer du TSTA
Code:
_SetCartPageA MACRO
 IFDEF T2
        sta   glb_Page
        bpl   RAMPg@
       
        lda   $E7E6
        anda  #$DF                     ; passe le bit5 a 0 pour cartouche au lieu de 1 pour RAM
        sta   $E7E6
       
        lda   #$F0                     ; sortie du mode commande T.2
        sta   $0555                    ; dans le cas ou l'irq intervient en cours de changement de page
               
        lda   #$AA                     ; sequence pour commutation de page T.2
        sta   $0555
        lsra                            ; (était: lda   #$55)
        sta   $02AA
        lda   #$C0
        sta   $0555
        lda   glb_Page
        anda  #$7F                     ; le bit 7 doit etre a 0       
        sta   $0555                    ; selection de la page T.2 en zone cartouche
        bra   End@
RAMPg@  sta   $E7E6                    ; selection de la page RAM en zone cartouche (bit 5 integre au numero de page)
End@    equ   *
 ELSE
        sta   $E7E6                    ; selection de la page RAM en zone cartouche
 ENDC
 ENDM     
C'est pas grand chose, mais c'est déjà ca.

On pourrait aller plus loin si DP valait $E7, car du coup le STA $E7E6 se ferait en un cycle et un octet de moins. De plus si X était trashé à la sortie, on pourrait sauter au dessus de ce STA en un seul octet: $8E (et toujours 3 cycles) car ca ferait un LDX #nnnn (si c'est B qui est trashé un LDD #nnnn ferait aussi l'affaire). Et puisque qu'on est dans l'hypothèse où X serait trashé, on peut lui faire charger la valeur #$0555 (3 cycles) au début et remplacer les quatre STA $0555 par quatre "STA ,X" ce qui ferait un gain total de 1 octet et 1 cycle (oui bon.. les petits ruisseaux font les grosses rivières.)

Enfin une bizarrerie. Il y a une lecture en $0000 (via le direct-page) en $6123
Code:
611E 8E98A1           (_RunObjectRoutine):00006 [3]     50              ldx   #Obj_Index_Address
6121 58               (_RunObjectRoutine):00007 [2]     52              aslb
6122 3A               (_RunObjectRoutine):00008 [3]     55              abx
6123 9600             (_RunObjectRoutine):00009 [4]     59              lda   0        <=== lecture en $0000 via DP !!!!
6125 AD94             (_RunObjectRoutine):00010 [10]    69              jsr   [,x]
Ce 0 vient de l'appel à _RunObjectRoutine avec un "0" en second paramètre.
Code:
                      (C:\Users\bhrou\gi):00028                         _RunObjectRoutine ObjID_EHZ,0
Je ne crois pas que c'est ce qui était souhaité, mais plutôt un #0 en second paramètre ou un # devant le \2 de la macro non ?

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 05 Avr 2022, 15:10 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 307
Localisation: Var
Pas de gros impact sur la vitesse du moteur, mais comme tu le dis si bien : les petits ruisseaux font les grosses rivières (j'y pense à chaque fois que je code ;-).

Oui c'est vrai que je pourrais faire une routine pour la commutation T.2, je gagnerai plein de place tu as raison.

Citation:
tu as LDA #$AA et plus loin LDA #$55. Tu peux remplacer le dernier LDA par un simple LSRA

C'est le genre d'optim auquel je ne pense pas encore de manière automatique ... bien vu !
Bon je vais mettre en place tt ça.

Citation:
On pourrait aller plus loin si DP valait $E7

C'est vrai que je ne n'utilise le DP que dans l'IRQ parce que je sais qu'il vaut $E7
mais je ne l'utilise nulle par ailleurs dans le code sauf pour du stack blast, donc oui bonne idée je vais le positionner en début d'exécution à $E7.

Citation:
Enfin une bizarrerie

Oui désolé, j'ai eu la flème d'ajouter une macro et j'ai réutilisé une macro existante. Le code est appelé une fois au démarrage, la routine appelée n'a que faire du registre A ...
Je ne l'ai pas fait car je veux les renommer proprement avant.

ça fait du bien d'avoir tes retours d'expert, merci bcp !

Bon j'ai un peu réfléchi à mon optim a base buffer pour le rendu des tiles, et je suis convaincu d'un gain énorme sur le rendu.
Non seulement on update que les nouveaux tiles sur une seule rangée verticale et/ou horizontale (dans la direction de déplacement), mais en plus on ne le fait que tous les déplacements de 8px en largeur et 16px en hauteur. sur des déplacements intermédiaires je n'ai juste qu'a repositionner les coordonnées de rendu et parcourir le buffer déjà rempli avec les page/addr des routines de dessin.
A l'heure actuelle dès qu'on bouge de 2px, on recalcule tous les tiles à partir des groupes de tiles et tout le Bazard ... Je pense que la routine actuelle prend env. 22500 cycles pour calculer tout ça.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 05 Avr 2022, 15:43 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
DP peut aussi s'évérer intéressant si tu as regroupé toutes les variables globales (glb_xxx) au même endroit. Gagner un cycle et un octet pour chaque accès mémoire est non négligeable. Tu peux même débuter ta routine de commutation de ROM T2 sur les derniers octet de la page (ca peut déborder sur les pages suivantes sans soucis), car ainsi au lieu de faire un JSR $XXYY, tu ferais JSR <$YY en gagnant 1 octet et 1 cycle à chaque fois. En gros les variables et routines fréquentes ont toutes intérêt d'être accessible en page directe.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 06 Avr 2022, 14:59 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 479
Comment peut on lire les .sd sur dcmoto ? Faut-il un disquette pour booter la SD ?


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 06 Avr 2022, 15:15 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
C'est tout simple. Regardes ce que j'ai indiqué >>là<< pour charger des SD contenant une vidéo (coucou Pulko!). C'est plus ou moins la même procédure pour Sonic.

_________________
Good morning, that's a nice Tnetennba


Dernière édition par Samuel Devulder le 06 Avr 2022, 17:16, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 06 Avr 2022, 15:58 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 479
Rooo ... C'etait tout bete. Je n'avais pas selectionne le controleur externe :areuh:


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 06 Avr 2022, 17:30 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 479
Je viens d'essayer le dernier sonic2.sd ... Je n'aurais jamais pensé voir quelque chose comme ca sur thomson. Sonic est un jeu compliqué, qui voulait demontrer les capacites impressionnante de la megadrive, notament la vitesse fulgurante du jeu. C'est d'ailleur ce qui m'a pousse a acheter une megadrive a l'epoque, apres avoir vu une demo dans un super marche (C'etait le Rally/Geant a Brest, Sam connaitra).

Quand je vois ca sur Thomson, avec un scrolling de jamais vu dans aucun jeu, j'allucine total.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 06 Avr 2022, 19:49 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 307
Localisation: Var
Je suis content que ça vous plaise, ce scroll c'était un rêve d'enfant, je me souviens de mes premiers essais en basic en mode bm4 en 93 :lol: c'était vraiment naze !

En 90 j'avais une master system et je rêvais d'une megadrive fraichement sortie. J'ai eu la chance de participer au jeu TV "les chevaliers du labyrinthe" ce qui m'a permis de gagner une seconde master system. J'ai revendu les deux et ainsi financé la megadrive.

Si vous êtes toujours sur Brest, il se peut que j'y fasse un tour pour le boulot dans qq semaines, je loge en général en bas de la rue de Siam, si vous voulez boire une bière je paye ma tournée (voir un fût pour Sam qui le mérite bien pour toute son aide).


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Avr 2022, 08:05 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 479
Bentoc a écrit:
Je suis content que ça vous plaise, ce scroll c'était un rêve d'enfant, je me souviens de mes premiers essais en basic en mode bm4 en 93 :lol: c'était vraiment naze !

En 90 j'avais une master system et je rêvais d'une megadrive fraichement sortie. J'ai eu la chance de participer au jeu TV "les chevaliers du labyrinthe" ce qui m'a permis de gagner une seconde master system. J'ai revendu les deux et ainsi financé la megadrive.

Si vous êtes toujours sur Brest, il se peut que j'y fasse un tour pour le boulot dans qq semaines, je loge en général en bas de la rue de Siam, si vous voulez boire une bière je paye ma tournée (voir un fût pour Sam qui le mérite bien pour toute son aide).


Desole, je vis a Amsterdam :D


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 08 Avr 2022, 14:42 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 307
Localisation: Var
j'ai appliqué l'idée de Sam de regrouper les globales et d'utiliser DP.
Résultat : gain global de 1,5% en moyenne, c'est très bien.
et je ne l'ai fait que sur 9 variables !

J'ai ouvert un Excel pour suivre les cycles de la boucle principale sur 12 tours (en cours de scroll en suivant le même protocole) pour pouvoir comparer les gains des différentes optims.

J'ai également avancé sur l'idée du buffer. Je n'ai réalisé que la partie lecture du buffer et dessin des tiles.
Le code fonctionne, on scroll donc "à l'infini" dans ce buffer.
On doit surement pouvoir encore optimiser la chose ... (le code ci dessous)
Seul point négatif pour le moment: le buffer fait 2ko

Après il faudra faire l'autre partie, le code qui va décoder la map et remplir ce buffer seulement pour les nouveaux tiles, c'est sur ma todo list.
Je vais être offline pendant 3 jours à partir de ce soir ... rdv semaine prochaine pour la suite.

Code:
DrawBufferedTile

        lda   glb_force_sprite_refresh
        bne   @a
        rts
@a

        ; compute number of tiles to render
        ; saves one tile row or col when camera pos is a multiple of tile size
        ; ---------------------------------------------------------------------
        ldb   #18-1                         ; nb of tile in screen width
        lda   <glb_camera_x_pos+1
        anda  #%00000111
        bne   @skip
        decb
@skip   stb   DBT_ccpt
        stb   DBT_ccpt_bck

        ldb   #11                           ; nb of tile in screen height
        lda   <glb_camera_y_pos+1
        anda  #%00001111
        bne   @skip
        decb
@skip   stb   DBT_lcpt

        ; compute top left tile position on screen
        ; position is rounder to 2 px horizontally beacuse of 2px per byte
        ; and vertically beacuse of interlacing
        ; ---------------------------------------------------------------------
        lda   <glb_camera_x_pos+1
        anda  #%00000110                    ; mask for 8px tile in width
        nega
        adda  #12                           ; on screen position of camera

        ldb   <glb_camera_y_pos+1
        andb  #%00001110                    ; mask for 16px tile in height
        negb
        addb  #20                           ; on screen position of camera

        lsra                                ; x=x/2, sprites moves by 2 pixels on x axis
        lsra                                ; x=x/2, RAMA RAMB interlace 
        bcs   @RAM2First                    ; Branch if write must begin in RAM2 first
@RAM1First
        sta   @dyn1
        lda   #40                           ; 40 bytes per line in RAMA or RAMB
        mul
        addd  #$C000                        ; (dynamic)
@dyn1   equ   *-1       
        std   <glb_screen_location_2
        pshs  d
        std   s_loc2
        subd  #$2000
        std   <glb_screen_location_1     
        bra   @end
@RAM2First
        sta   @dyn2
        lda   #40                           ; 40 bytes per line in RAMA or RAMB
        mul
        addd  #$A000                        ; (dynamic)
@dyn2   equ   *-1       
        std   <glb_screen_location_2
        pshs  d
        std   s_loc2
        addd  #$2001
        std   <glb_screen_location_1
@end
        pshs  d
        std   s_loc1

        ; compute position in cycling buffer
        ; ---------------------------------------------------------------------
        ldd   <glb_camera_x_pos
        anda  #%00000000                    ; col mask (0-32)
        andb  #%11111000                    ; tile width 8px (>>3)
        _lsrd                               ; col size 4 bytes (<<2)
        std   @dyn2
        anda  #%00000000
        ldb   <glb_camera_y_pos+1
        andb  #%11110000                    ; line mask (0-16)
        _lsld                               ; tile height 16px (>>4)
        _lsld                               ; line skip 128 bytes (<<7)
        _lsld
        addd  #0                            ; (dynamic) add x position to index
@dyn2   equ   *-2
        addd  #tile_buffer
        tfr   d,u

; **************************************
; * Tile rendering Loop
; **************************************

DBT_lloop
        std   ls_pos
        andb  #%10000000
        std   l_pos

        ; tiles in col
        ; ****************
DBT_cloop
        pulu  d,x
        pshs  u
        stb   $E7E6
        beq   @skip
        ldu   <glb_screen_location_2
        jsr   ,x
@skip   puls  d,x,u
        leau  2,u
        stu   <glb_screen_location_2
        leax  2,x
        stx   <glb_screen_location_1
        pshs  x,u
        anda  #%00000000
        andb  #%01111100 ; cycle thru this line (0-127) by 4 bytes
        addd  #0
l_pos   equ   *-2
        tfr   d,u

        dec   DBT_ccpt
        bne   DBT_cloop

        lda   #0
DBT_ccpt_bck equ   *-1
        sta   DBT_ccpt
 
        ; last tile in col
        ; ****************

        pulu  d,x
        pshs  u
        stb   $E7E6
        beq   @skip
        ldu   <glb_screen_location_2
        jsr   ,x
@skip   puls  d,x,u

 
        ; next line
        ; ****************

        ldu   #0
s_loc2  equ   *-2
        leau  40*16,u
        stu   <glb_screen_location_2
        stu   s_loc2
        ldx   #0
s_loc1  equ   *-2
        leax  40*16,x
        stx   <glb_screen_location_1
        stx   s_loc1
        pshs  x,u
       
        ldd   #0
ls_pos  equ   *-2              ; line start pos
        addd  #128
        anda  #%00000111
        adda  #tile_buffer/256 ; add base address
        tfr   d,u

        dec   DBT_lcpt
        bne   DBT_lloop
@rts    puls  x,u
        rts

DBT_lcpt     fcb   0
DBT_ccpt     fcb   0

        align 2048
tile_buffer
        ;fill  0,16*128


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 08 Avr 2022, 14:51 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 307
Localisation: Var
Voila ce que ça donne en mettant des valeurs de test dans le buffer cyclique :

phpBB [video]

https://youtu.be/PrW-mSaoMJM

Le pas de scroll est à 2px en largeur et 4 en hauteur (en réalité 2px à cause de l'entrelacement).
C'est le pas minimum pour ce moteur de scroll, ça va plutôt vite du coup.
Mais il reste a faire la partie "valorisation du buffer" donc je ne donne pas de chiffres pour le moment, mais ça sent très bon ...


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 08 Avr 2022, 15:38 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
Tu sais que tu n'es pas obligé de forcer l'adressage DP en faisant <label. Normalement l'assembleur peut forcer de lui même le mode direct-page partir de l'info donnée dans le SETDP pour les adresses ce cette page (optimisation lors de la compilation).

Quelques suggestions d'optims mineures (quoique...)
Code:
DrawBufferedTile

        lda   glb_force_sprite_refresh
        bne   @a
        rts
@a

        ; compute number of tiles to render
        ; saves one tile row or col when camera pos is a multiple of tile size
        ; ---------------------------------------------------------------------

********************************************************
* Ici je vois des LDA et LDB qui peuvent être regroupés en LDD:
*        ldb   #18-1                         ; nb of tile in screen width
*        lda   <glb_camera_x_pos+1
*        anda  #%00000111
LDiAB MACRO
        LDD  #(\0)*256+(\1)
        ENDM
; une MACRO LDiAB <valA>,<valB> rendrait cela plus lisible:
;        LDD  #%000000111*256+18-1
        LDiAB %000000111,18-1
        ANDA <glb_camera_x_pos+1
********************************************************
        bne   @skip
        decb
@skip   stb   DBT_ccpt
        stb   DBT_ccpt_bck
********************************************************
* Idem:
*       ldb   #11                           ; nb of tile in screen height
*       lda   <glb_camera_y_pos+1
*        anda  #%00001111
        LDiAB %00001111,11
        ANDA <glb_camera_y_pos+1
********************************************************
        bne   @skip
        decb
@skip   stb   DBT_lcpt

        ; compute top left tile position on screen
        ; position is rounder to 2 px horizontally beacuse of 2px per byte
        ; and vertically beacuse of interlacing
        ; ---------------------------------------------------------------------

********************************************************
* Idée travavailler sur le couple A/B au max
*        lda   <glb_camera_x_pos+1
*        anda  #%00000110                    ; mask for 8px tile in width
*        nega
*        adda  #12                           ; on screen position of camera
*
*        ldb   <glb_camera_y_pos+1
*        andb  #%00001110                    ; mask for 16px tile in height
*        negb
*        addb  #20                           ; on screen position of camera
        LDiAB %00000110,%00001110
        ANDA <glb_camera_x_pos+1
        ANDB <glb_camera_y_pos+1
* il est toujours bon d'avoir des temporaires en direct page
* plutôt que de passer par la pile plus lente:
        STD <temporaire_16bits_directpage
        LDiAB %00001100,%00010100  ; A=12 B=20
* pas de débordement possible car le masquage %0001110 rends B<=20,
* donc pas de propagation de retenue et on peut soustraire A et B
* ensembles en parallèles:
        SUBD <temporaire_16_bits_directpage
********************************************************
        lsra                                ; x=x/2, sprites moves by 2 pixels on x axis
        lsra                                ; x=x/2, RAMA RAMB interlace
        bcs   @RAM2First                    ; Branch if write must begin in RAM2 first
@RAM1First
        sta   @dyn1
        lda   #40                           ; 40 bytes per line in RAMA or RAMB
        mul
        addd  #$C000                        ; (dynamic)
@dyn1   equ   *-1       
        std   <glb_screen_location_2
        pshs  d
        std   s_loc2

********************************************************
* Evidemment!
*        subd  #$2000
        SUBA  #$20
********************************************************
        std   <glb_screen_location_1     
        bra   @end
@RAM2First
        sta   @dyn2
        lda   #40                           ; 40 bytes per line in RAMA or RAMB
        mul
        addd  #$A000                        ; (dynamic)
@dyn2   equ   *-1       
        std   <glb_screen_location_2
        pshs  d
        std   s_loc2
        addd  #$2001
        std   <glb_screen_location_1
@end
        pshs  d
        std   s_loc1

        ; compute position in cycling buffer
        ; ---------------------------------------------------------------------

********************************************************
*        ldd   <glb_camera_x_pos
*        anda  #%00000000                    ; col mask (0-32)
*        andb  #%11111000                    ; tile width 8px (>>3)
* LDD force A=0 en 1 cycle au lieu de "anda #0000" plus haut
        LDiAB 0,%11111000
        ANDB <glb_camera_x_pos+1
********************************************************
        _lsrd                               ; col size 4 bytes (<<2)
        std   @dyn2
********************************************************
* Meme truc ? Nan on peut meme se passer des LSLD !!!
*        anda  #%00000000
*        ldb   <glb_camera_y_pos+1
*        andb  #%11110000                    ; line mask (0-16)
*        _lsld                               ; tile height 16px (>>4)
*        _lsld                               ; line skip 128 bytes (<<7)
*        _lsld
        LDiAB 8,%11111000
        ANDB <glb_camera_y_pos+1
; comme A=8, le MUL (11 cycles) contient les 3 LSLD (12 cycles)
; c'est donc un peu plus rapide et beaucoup plus compact
        MUL                                 
********************************************************
        addd  #0                            ; (dynamic) add x position to index
@dyn2   equ   *-2
        addd  #tile_buffer
        tfr   d,u

; **************************************
; * Tile rendering Loop
; **************************************

DBT_lloop
        std   ls_pos
        andb  #%10000000
        std   l_pos

        ; tiles in col
        ; ****************
DBT_cloop
        pulu  d,x
        pshs  u
        stb   $E7E6
        beq   @skip
        ldu   <glb_screen_location_2
        jsr   ,x
@skip   puls  d,x,u
        leau  2,u
        stu   <glb_screen_location_2
        leax  2,x
        stx   <glb_screen_location_1
        pshs  x,u
* CLRA plutôt ? (1 octet gagné)
        anda  #%00000000
        andb  #%01111100 ; cycle thru this line (0-127) by 4 bytes
        addd  #0
l_pos   equ   *-2
        tfr   d,u

        dec   DBT_ccpt
        bne   DBT_cloop

* Pas dynamic?
        lda   #0
DBT_ccpt_bck equ   *-1
        sta   DBT_ccpt
 
        ; last tile in col
        ; ****************

        pulu  d,x
        pshs  u
        stb   $E7E6
        beq   @skip
        ldu   <glb_screen_location_2
        jsr   ,x
@skip   puls  d,x,u

 
        ; next line
        ; ****************

        ldu   #0
s_loc2  equ   *-2
        leau  40*16,u
        stu   <glb_screen_location_2
        stu   s_loc2
        ldx   #0
s_loc1  equ   *-2
        leax  40*16,x
        stx   <glb_screen_location_1
        stx   s_loc1
        pshs  x,u
       
        ldd   #0
ls_pos  equ   *-2              ; line start pos
        addd  #128
        anda  #%00000111
        adda  #tile_buffer/256 ; add base address
        tfr   d,u

        dec   DBT_lcpt
        bne   DBT_lloop
@rts    puls  x,u
        rts

DBT_lcpt     fcb   0
DBT_ccpt     fcb   0

        align 2048
tile_buffer
        ;fill  0,16*128

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 420 messages ]  Aller à la page Précédente  1 ... 21, 22, 23, 24, 25, 26, 27, 28  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com