MSX Village forum

La Place des Développeurs Problème ASM - DOS vs ROM

ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 04/12/2020 à 18h17
Bonsoir
j'ai un problème que je ne sais pas résoudre...

Voici une routine en assembleur qui permet de faire une rotation de 90 degrés à droite ou à gauche d'un Pattern ou d'un Sprite de 8x8
Cette routine fait partie de Fusion-C 1.3.

Code ASM :
 
 
 ;--------------------------------------------
            ;Rotate 8x8 Pattern 
            ;input:
            ;DE = 8x8 Pattern address  
            ;HL = 8 bytes buffer
            ;A   =  0x17 equals Clockwise (R)
            ;       0x1F equals Counter Clockwise (L)
            ;
            ;Output:
            ; Rotates a Pattern 90° left or right into a buffer
            ;
 
                Push ix
                ld ix,#0
                add ix,sp
                ld e,4(ix)
                ld d,5(ix)
                ld l,6(ix)
                ld h,7(ix)
                ld a,8(ix)
                pop ix
 
                and #1
                ld a,#0x17
                jr  z,rotate        ; If direction is right (=0)
                ld a,#0x17
 
            rotate:
               ld (rotloop),a
               xor #0x09
               ld (rotloop+#2),a
               ld c,#8
            rotbigloop:
               ld a,(de)
               inc de
               push hl
               ld b,#8
            rotloop:
               rra
               rl (hl)
               inc hl
               djnz rotloop
               pop hl
               dec c
               jr nz,rotbigloop
               ret
 
 
 


Comme indiqué, on rentre dans DE l'adresse RAM où se trouve le Pattern de 8x8 d'origine, dans HL, l'adresse d'un buffer pour recevoir le résultat de la rotation. Et A permet d'indiquer si la rotation de 90 degrés se fait vers la droite, dans ce cas A reçoit 0x17 et si vers la gauche il reçoit 0x1F.

Mon problème est le suivant.
La routine fonctionne très bien lorsque je compile mon programme de test pour MSX-DOS.
Par contre, lorsque je compile le programme pour réaliser une ROM, la rotation se fait uniquement vers la gauche. Même si j'indique un autre paramètre. Même si je mets en dur dans le code, la bonne valeur dans le registre A.

Alors je m'arrache les cheveux (J'en ai bientôt plus), pour essayer de comprendre pourquoi, ce code fonctionne sous dos et pas pour une ROM.

Quelque pour m'aider à comprendre ? et à garder mes quelques cheveux survivants ? :gne


banniere-ericb59e
Site web    
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 561

Le 04/12/2020 à 20h58
Code :
               ld (rotloop),a
               xor #0x09
               ld (rotloop+#2),a

on peut vivre sans cheveux ... :siffle


DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
   
Franck Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 22h54

Messages: 3345

Le 04/12/2020 à 22h22
Il avait encore des cheveux ? :D
   
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 561

Le 04/12/2020 à 23h04
il faut choisir, les cheveux ou la programmation .. :siffle


DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 04/12/2020 à 23h09
"ld (rotloop),a" écrit à l'intérieur de ton programme. Je sais pas comment ça peut fonctionner sous DOS, mais en tout cas, en version ROM ton programme est dans... la ROM, donc impossible d'y écrire. Il faudrait stocker ces infos en RAM si y en a vraiment besoin (mais à mon avis, il doit y avoir largement moyen de n'utiliser que les registres ; tu peux utiliser les registres alternatifs af', bc', etc.).

EDIT : OK, je crois avoir compris comment fonctionne le programme. En fait il modifie son propre code en cours d'exécution. C'est donc juste impossible de faire ça depuis une ROM. Ce que tu peux faire c'est copier ce code en RAM et l'y exécuter.


On est toujours ignorant avant de savoir.
Github    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 05/12/2020 à 10h07
Alors là... Je vois que tout le monde se fou totalement de mes cheveux ! Merci bien quoi ! Bonjour la solidarité !

Heureusement dès qu'il s'agit de programmation, la solidarité est là ;)

J'ai pigé !! Oui effectivement ca veut modifier dans la Rom et c'est pas possible ! ok ok !
J'ai donc scindé le prog en 2 parties distinctes :

Code ASM :
 
;--------------------------------------------
            ;Rotate 8x8 Pattern 
            ;input:
            ;DE = 8x8 Pattern address  
            ;HL = 8 bytes buffer
            ;A   =  0 Clockwise (R)
            ;       1 equals Counter Clockwise (L)
            ;
            ;Output:
            ; Rotates a Pattern 90° left or right into a buffer
            ;
                Push ix
                ld ix,#0
                add ix,sp
                ld e,4(ix)
                ld d,5(ix)
                ld l,6(ix)
                ld h,7(ix)
                ld a,8(ix)
                pop ix
                ld c,#8
                and #1
 
                jr  z,rotbigloopR        ; If direction is right (=0)
            ; Left Rotation
            rotbigloopL:
               ld a,(de)
               inc de
               push hl
               ld b,#8
            rotloopL:
               rra
               rl (hl)
               inc hl
               djnz rotloopL
               pop hl
               dec c
               jr nz,rotbigloopL
               ret
            ; Right Rotation 
            rotbigloopR:
               ld a,(de)
               inc de
               push hl
               ld b,#8
            rotloopR:
               rla
               rr (hl)
               inc hl
               djnz rotloopR
               pop hl
               dec c
               jr nz,rotbigloopR
               ret
 



Déjà que j'ai eu du mal à me faire au DOS, il faut que je pense encore autrement pour que ma librairie fonctionne pour les ROM.
C'est dure la vie !

Merci ! :top Edité par ericb59 Le 05/12/2020 à 10h07


banniere-ericb59e
Site web    
Franck Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 22h54

Messages: 3345

Le 06/12/2020 à 21h40
Tu vas pouvoir garder tes cheveux grâce au talent d'Aoineko :top
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 06/12/2020 à 21h53
Franck :
Tu vas pouvoir garder tes cheveux grâce au talent d'Aoineko :top


Rendons à Sector28 ce qui appartient à Sector28... c'est lui qui a mis le doigt sur le problème en premier. :)


On est toujours ignorant avant de savoir.
Github    
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 561

Le 06/12/2020 à 23h25
Éric , pourquoi ne pas créer 2 libs, une pour le msxdos, l'autre pour les roms ou autre.


DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 07/12/2020 à 08h17
Sector28 :
Éric , pourquoi ne pas créer 2 libs, une pour le msxdos, l'autre pour les roms ou autre.


Oui c’est ce que je suis en train de réaliser.
Je reprends tout le code de ma lib Msx-dos pour l’adapter à la ROM, dans une « side library ».

Le script de compilation s’adaptera en fonction des directives indiquées par le codeur pour compiler avec tel ou tel lib.

Mon objectif est ici, de pouvoir compiler du code pour Dos ou ROM, avec quasi aucune modification du code source.
(Sous entendu de ne pas utiliser des fonctions dédiées msx-dos, bien sur)


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 07/12/2020 à 09h32
Si ça peux t'aider, voici quelques liens sur ma lib.
C'est encore très "work-in-progress" mais le système de configuration automatique pour générer un programme ROM, DOS ou (Basic) BIN est fonctionnel.
Pour un projet, il y a deux fichiers de config :


Les scripts de build en eux-mêmes sont dans : https://github.com/aoineko-fr/cmsx/tree/master/cmsx/script


On est toujours ignorant avant de savoir.
Github    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 07/12/2020 à 10h27
Merci aoineko, je regarderai ça à tête reposée.
Masi que veux tu dire par "pour gagner de la place, par ex., on peut retirer le support des Screen modes qu'on ne compte pas utiliser"
qu'est-ce que tu enlèves ou ajoute selon les cas ?


J'essaie pour ma part de faire en sorte de ne pas avoir à aller éditer des fichiers de configurations. Je préfère l'approche d'ajouter des "directives" dans le code source à compiler. J'y perd sans doute en customisation, mais j'y gagne en terme de facilité d'usage. Je reste sur une approche "user-friendly", à la Apple, en limitant autant que possible les "frictions". En tout cas... c'est mon objectif. Tu as une autre approche, plus "pro" du codage, qui me fait penser plus à la façon de travailler sur linux, si j'ose une analogie. ;) Edité par ericb59 Le 07/12/2020 à 10h34


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 07/12/2020 à 13h59
En fait, je prends juste les décisions de design qui servent mon objectif : pouvoir faire des jeux compacts et les plus rapides possible.
Et oui, même si ça rends la lib pas très user-friendly (pour ça les gens ont déjà Fusion-C ^^).

Pour ce qui est du support des Screen modes, au lieu d'avoir quasiment un fichier par fonction comme dans Fusion-C, j'ai choisi de regrouper mes fonctions dans des modules (par ex. le module VDP) ; je trouve ça plus "pratique" mais pour un jeu donné, il y a qu'une partie des fonctions qui vont être vraiment utile alors qu'à la base, le Linker va toutes les ajouter dans le binaire final.
Du coup, j'ai deux niveaux de config :
- Dans la config du Build, je choisie quels modules vont être ajouté ;
- Dans la config du Compilo/Linker, je configure ces modules pour ne garder que ce dont à besoin mon projet.

Ah oui, il faut préciser que la grosse différence avec Fusion-C, c'est que ma lib n'existe pas sous forme statique. Elle est linké "à la volé" au moment de build un projet.
C'est ça qui permet à mon programme final de n'embarquer que ce dont il a besoin.


On est toujours ignorant avant de savoir.
Github    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie