La Place des Développeurs ROM 48K et slots
Reprise du message précédent
Salut tertousssVous 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
aoineko
Membre non connecté
Conseiller Municipal
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)
Concrètement c'est quoi le problème ? Ca crash ou ça affiche n'importe quoi ?
- 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.
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
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
aoineko
Membre non connecté
Conseiller Municipal
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.
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.
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
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
aoineko
Membre non connecté
Conseiller Municipal
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.
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.
Sector28
Membre non connecté
Villageois
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;
}
{
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;
}
DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
Sector28 :
Sys_SetPage0Slot(cartSlot);
ENASLT ne doit pas être utlilisée pour la page 0 ( H=0)
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 !
Bien vu Sector28, la sauvegarde des registres a permis de supprimer ce souci
@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
@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
aoineko
Membre non connecté
Conseiller Municipal
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.
Sector28
Membre non connecté
Villageois
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
DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
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
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
aoineko
Membre non connecté
Conseiller Municipal
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 !
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.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie