MSX Village forum

La Place des Développeurs ROM 48K et slots

Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 18/12/2021 à 10h46

Reprise du message précédent

Salut tertousss ;)

Vous connaissez tous l'adage : 'il ne faut pas vendre la peau de l'ours ....'
Eh bien je me suis réjoui trop vite !!!

Dts fonctionne bien avec MEISEI et Emulicious
Par contre avec BlueMSX et openMSX,c'est une autre histoire : le jeu se lance bien (intro, choix du niveau, nom du player etc...) et quand j'arrive sur la page du jeu et qu'il faut appuyer sur fire, le niveau doit s'afficher et là, "Huston, on a un problème !"

Yes my friends. La routine de lecture interslot telle qu'elle est actuellement ne lit correctement que la première valeur de la table, pour le reste des données, les valeurs sont dans les choux. Alors que ca marche bien sur les autres emus....

Quelqu'un a-t-il deja rencontré ce souci ?
J'y retourne ce soir pour essayer d'y voir plus clair ;)


Merci les zamis et bon weekend


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 18/12/2021 à 11h14
Pour moi, les problèmes qu'on ne trouve que sur certains émulateur, ça a souvent été des problèmes soit de :
- timing (par ex. des transferts trop rapide du CPU vers le VDP sur MSX1)
- initialisation (certains émulateurs initialise la RAM/VRAM à zéro alors que ça ne l'est pas sur (tous/certains) de vrais modèles)

Ricco59 :
"Huston, on a un problème !"


Concrètement c'est quoi le problème ? Ca crash ou ça affiche n'importe quoi ?


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

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 18/12/2021 à 11h41
le problème est que quand meisei affiche bien un niveau complet, openMSX lui, n'affiche correctement que la 1ere valeur de la table.

EDIT :
J'ai remarqué autre chose : son fonctionnement sous Emulicious :
- lorsque je ne mets que les 16 premiers niveaux et que je suis dans le debugger, le jeu s'exécute normalement avec l'affichage du "tracing".
- Si je mets TOUS les niveaux, en mode debugger, ce "tracing" fonctionne très mal. Je dois quitter le debugger pour que le jeu se lance ...

Des zones sont elles ecrasées ? ne faudrait-il pas chercher des slots disponibles ? ché pô



Edité par Ricco59 Le 18/12/2021 à 12h56


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 18/12/2021 à 13h11
Si tes données en page 0 font moins de 16 KB, y a pas de raison que ça écrase le reste de ton jeu.
Surtout que si ça dépassait, ça écraserait le début de la page #1 ou il y a ton entête de ROM et donc ton jeu ne démarrerait pas.
Tu utilises la même fonction de copie inter-slot que tu avais mis ici ? Sinon, tu peux le remettre qu'on puisse voir s'il y a des soucis.


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

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 553

Le 18/12/2021 à 13h55
Sys_SetPage0Slot(cartSlot);

ENASLT ne doit pas être utlilisée pour la page 0 ( H=0)


Toute matrice carrée sur un corps K, dont le polynôme caractéristique est scindé, est semblable à une matrice de Jordan. Cette réduction est unique à l'ordre des blocs près. De plus, toute matrice carrée nilpotente sur un corps K est semblable à une matrice de Jordan dont chaque bloc est associé à la valeur 0. Évidement, cette réduction est encore unique à l'ordre des blocs près...
:)
   
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 18/12/2021 à 13h58
Voici la routine


void D_Fuz(unsigned char lvls) __z88k_fastcall
{
lvls;
__asm

// lit niveau et le multiplie par 72
add hl,hl // x2
add hl,hl // x4
add hl,hl // x8
ld d,h // de = x8
ld e,l
add hl,hl // x16
add hl,hl // x32
add hl,hl // x64
add hl,de ;

ld b,#72
ld de,#_level
push de
boucle_d_fuz:
ld a,#0x01
call #0x000c
ei
inc hl
pop de
ld (de),a
inc de
push de
djnz boucle_d_fuz
pop de

__endasm;

}



MP


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 553

Le 18/12/2021 à 16h16
la fonction D_Fuz() a l'air ok.

Il me faut ton fichier .rom


Toute matrice carrée sur un corps K, dont le polynôme caractéristique est scindé, est semblable à une matrice de Jordan. Cette réduction est unique à l'ordre des blocs près. De plus, toute matrice carrée nilpotente sur un corps K est semblable à une matrice de Jordan dont chaque bloc est associé à la valeur 0. Évidement, cette réduction est encore unique à l'ordre des blocs près...
:)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 18/12/2021 à 18h50
Vu que tu as le slot de ton jeu en dur dans le code, il ne marchera pas si le jeu est dans le port cartouche 2 (slot 2) ou dans un slot étendu (1-0, 2-2, etc.).
Je sais pas si c'est de la que vient ton problème (ça peut être le cas en fonction de la configuration de OpenMSX et BlueMSX) mais en tout cas ça sera un problème pour le jeu final.
Tu peux utiliser ma fonction Sys_GetPageSlot() sur la page 1 (ou 2) pour récupérer le SlotID de ta cartouche (à ma connaissance le Bios n'a pas cette fonctionnalité).

Sinon, je sais pas trop d'où vient le problème.


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

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 553

Le 18/12/2021 à 19h45
void D_Fuz(unsigned char lvls) __z88k_fastcall
{
lvls;
__asm

// lit niveau et le multiplie par 72
add hl,hl // x2
add hl,hl // x4
add hl,hl // x8
ld d,h // de = x8
ld e,l
add hl,hl // x16
add hl,hl // x32
add hl,hl // x64
add hl,de ;

ld b,#72
ld de,#_level
boucle_d_fuz:
ld a,#0x01
PUSH BC
PUSH DE
call #0x000c
POP DE
POP BC
ei
inc hl
ld (de),a
inc de
djnz boucle_d_fuz

__endasm;

}


Toute matrice carrée sur un corps K, dont le polynôme caractéristique est scindé, est semblable à une matrice de Jordan. Cette réduction est unique à l'ordre des blocs près. De plus, toute matrice carrée nilpotente sur un corps K est semblable à une matrice de Jordan dont chaque bloc est associé à la valeur 0. Évidement, cette réduction est encore unique à l'ordre des blocs près...
:)
   
KN2000 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 08/06/2010 à 09h30

Messages: 209

Le 18/12/2021 à 20h03
Sector28 :
Sys_SetPage0Slot(cartSlot);

ENASLT ne doit pas être utlilisée pour la page 0 ( H=0)


Dans son programme ? Parce que sinon, il est toujours possible de récupérer le Bios en page 0.


Nous sommes en 2010 aps JC, toute la Gaule est envahie. Ah ben non, apparement, un village résiste encore aux envahisseurs Personalcomputerum et autres Consoledessalum. Bienvenue dans l'antre du emessix !
   
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 18/12/2021 à 20h49
Bien vu Sector28, la sauvegarde des registres a permis de supprimer ce souci :top

@Aoineko, les registres BC et DE ont été altérés (je n'y ai pas fait attention). Leur sauvegarde à supprimer ce bug
Cela dit, il va falloir que j'essaie sur un vrai MSX car d'autres soucis pointent ;)

@KN2000, le jeu est en slot1 page0,1 et 2 Edité par Ricco59 Le 18/12/2021 à 20h51


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 18/12/2021 à 22h56
Ricco59 :
@KN2000, le jeu est en slot1 page0,1 et 2


Ton jeu est en slot 1 uniquement s'il est insérer dans la port cartouche #1 et que ce slot n'est pas étendu.
Dans tous les autres cas, ton code ne fonctionnera pas.
C'est pas grave pour tes tests, mais il faudra s'en occuper à un moment. ^^


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

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 553

Le 18/12/2021 à 23h51
petit bout de code pour trouver ld Slot-ID de la cartouche:

Code :
    call    RSLREG
    rrca
    rrca
    and    3    
    ld    c,a
    ld    b,0
    ld    hl,EXPTBL
    add    hl,bc
    ld    a,(hl)
    and    80h
    or    c
    ld    c,a
    inc    hl
    inc    hl
    inc    hl
    inc    hl
    ld    a,(hl)
    and    0Ch
    or    c  ; A contient le Slot-ID


Toute matrice carrée sur un corps K, dont le polynôme caractéristique est scindé, est semblable à une matrice de Jordan. Cette réduction est unique à l'ordre des blocs près. De plus, toute matrice carrée nilpotente sur un corps K est semblable à une matrice de Jordan dont chaque bloc est associé à la valeur 0. Évidement, cette réduction est encore unique à l'ordre des blocs près...
:)
   
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 19/12/2021 à 22h40
Hello

Pour en revenir au CALSLT, c'est uniquement réservé aux appels BIOS ou je peux faire ma propre routine de transfert comme par ex

MonTransfert:
ld HL,Source
ld DE,Destination
ld BC,Taille
ldir
ret


ZeTransfert
ld IY,(0xfcc1) //--- suis en train d'essayer de comprendre EXPTBL en lisant ton post sur MRC et d'autres infos glanées par ci par là
ld IX,MonTransfert
call 0x001c


Bonne soirée les zamis ;)
Edité par Ricco59 Le 19/12/2021 à 22h42


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 553

Le 19/12/2021 à 23h12
Ça plante!

LD IY, 1 et non (FCC1).


Toute matrice carrée sur un corps K, dont le polynôme caractéristique est scindé, est semblable à une matrice de Jordan. Cette réduction est unique à l'ordre des blocs près. De plus, toute matrice carrée nilpotente sur un corps K est semblable à une matrice de Jordan dont chaque bloc est associé à la valeur 0. Évidement, cette réduction est encore unique à l'ordre des blocs près...
:)
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 20/12/2021 à 01h09
Ricco59 :
Pour en revenir au CALSLT, c'est uniquement réservé aux appels BIOS ou je peux faire ma propre routine de transfert comme par ex


Ricco, je te conseille TRES fortement d'utiliser des defines pour tous les nombres magiques que tu utilises.
Ca rend le code tellement plus lisible ! :glass
Tu peux utiliser les defines du C dans ton code assembleur en ligne.

Pour ne revenir à 0x001C... heu, à CALSLT, ça permet d'appeler n'importe quel bout code dans n'importe quel slot.
Donc pas forcement le Bios.

D'ailleurs, c'était LA technique proposée sur MRC :
- Tu te créé une fonction de copie de tes données de la ROM vers la RAM en assembleur,
- Tu la place quelque part en page 0 (à ma connaissance c'est pas possible en C, mais tu peux mettre cette fonction dans ton ctr0 en le plaçant ou tu veux avec un .org ),
- Au moment de lire les 72 octets de ton tableau, tu mets les paramètres de ta fonction dans les registres qui vont bien (adresse source, destination et quantité à copier, ou juste l'index de ton tableau),
- ensuite tu mets le slot de ta cartouche dans IY (les 8-bits de poids forts), l'adresse de ta fonction dans IX, puis tu call CALSLT,
- Le BIOS va switcher la page 0 (ou se trouve ton code) vers le slot de ta cartouche et exécuter ta fonction,
- Après le .org de ta fonction, le BIOS va rétablir les slots comme il était avant l'appel à CALSLT et redonner la main à ton programme (en page 1 ou 2).

Et voilà, tu peux copier toutes tes données d'un coup.

Code ASM :
 
;== Dans ton crt0 ==
    .org 0x0000 ; faudrait mettre tes données plus loin pour pas écraser ce code
CopyFromRomPage0::
    ldir
    ret
 
;== Dans ton code C (en linge par ex.) ==
#define CALSLT 0x001C
 
ZeTransfert:
    ld HL, Source
    ld DE, Destination
    ld BC, Taille
    ld IY, CartoucheSlotID << 8 ; Sous la forme [X000SSPP] ou X=expend, S=slot secondaire, P=slot primaire
    ld IX, CopyFromRomPage0 ; l'adresse doit être entre 0x0000 et 0x3FFF pour que le BIOS switch la page 0
    call CALSLT 
 


Après, je l'ai jamais utilisé donc je suis pas sûr à 100% que les registres soient bien préservés, mais de ce que je comprends de la doc, c'est censé être le but.


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