La Place des Développeurs ROM 48K et slots
Reprise du message précédent
Ricco59 :
Hello les zamis
> Mettre DATA slot1 page0 en slot0 page1 (de 0x4000 à 0x8000)
> Mettre DATA slot1 page0 en slot0 page1 (de 0x4000 à 0x8000)
Là, je ne suis plus... En slot 0 - page 1, ce n'est pas la ROM
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 !
Cette zone correspond au BASIC qui ne me servira pas.
Je tâtonne, je découvre et en me relisant, je me demande si c'est utile... ca reste encore confus. Ne peut on pas lire directement les données venant de la pag0/slot1 ?
Edité par Ricco59 Le 13/12/2021 à 21h00
Ricco59 :
Hello les zamis
(...)
> Mettre DATA slot1 page0 en slot0 page1 (de 0x4000 à 0x8000)
(...)
(...)
> Mettre DATA slot1 page0 en slot0 page1 (de 0x4000 à 0x8000)
(...)
Je tâtonne, je découvre et en me relisant, je me demande si c'est utile... ca reste encore confus. Ne peut on pas lire directement les données venant de la pag0/slot1 ?
Edité par Ricco59 Le 13/12/2021 à 21h00
Voila ce que j'ai rajouté et j'ai un résultat ... mitigé
__asm
ld a, #0x01 // %00000001 sélection du slot1
ld hl,#0x0000 // adresse d_fuz (début de mes niveaux)
call #0x000c // read slot
ei // enable interrupt
ld e,a // je sauvegarde l'octet lu dans le registre E
ld a,#0x03 // sélection du slot 3
ld hl,#_level // hl pointe sur le tableau de donnée d'un stage
call #0x0014 // j'écris la valeur 'e' dans l'adresse level
__endasm;
Sous openMSX en mode HB501, ca marche
Sous Emulicious, ca marche
Sous meisei, avec ce bout de code, ca plante (et sans, ça marche ! )
Organisation différente de la ram ???
Il faut que je revoie la partie 'écriture' et comme dab, il doit me manquer un truc
__asm
ld a, #0x01 // %00000001 sélection du slot1
ld hl,#0x0000 // adresse d_fuz (début de mes niveaux)
call #0x000c // read slot
ei // enable interrupt
ld e,a // je sauvegarde l'octet lu dans le registre E
ld a,#0x03 // sélection du slot 3
ld hl,#_level // hl pointe sur le tableau de donnée d'un stage
call #0x0014 // j'écris la valeur 'e' dans l'adresse level
__endasm;
Sous openMSX en mode HB501, ca marche
Sous Emulicious, ca marche
Sous meisei, avec ce bout de code, ca plante (et sans, ça marche ! )
Organisation différente de la ram ???
Il faut que je revoie la partie 'écriture' et comme dab, il doit me manquer un truc
Peut-être rajouter un EI après l'appel à #0x0014...
HL aurait quelle valeur ?
HL aurait quelle valeur ?
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 !
aoineko
Membre non connecté
Conseiller Municipal
Tu n'as pas besoin de faire de l'écriture interslot, juste de la lecture.
Normalement, à l'exécution de ton programme le Z80 voit :
- Page 0 : Main-ROM / BIOS
- Page 1 : Ta cartouche (adresses 4000h~7FFFh)
- Page 1 : Ta cartouche (adresses 8000h~BFFFh)
- Page 3 : RAM
Pour la version simple ou tu lis octet par octet, tu devrais avoir (en pseudo code) :
Et voila
Tout à fait.
Normalement, à l'exécution de ton programme le Z80 voit :
- Page 0 : Main-ROM / BIOS
- Page 1 : Ta cartouche (adresses 4000h~7FFFh)
- Page 1 : Ta cartouche (adresses 8000h~BFFFh)
- Page 3 : RAM
Pour la version simple ou tu lis octet par octet, tu devrais avoir (en pseudo code) :
Code C :
u8 buffer[72]; // buffer en RAM u16 addr = 0000h + 72 * numeroDeNiveau; loop(i, 72) { buffer[i] = LectureInterslotEnPage0(addr + i); }
Et voila
KN2000 :
Peut-être rajouter un EI après l'appel à #0x0014...
Tout à fait.
On est toujours ignorant avant de savoir.
Sector28
Membre non connecté
Villageois
Sector28 :
ld a,#0x03 // sélection du slot 3
ld hl,#_level // hl pointe sur le tableau de donnée d'un stage
call #0x0014 // j'écris la valeur 'e' dans l'adresse level
pourquoi pas:
LD HL,#_level
LD (HL),E
ld hl,#_level // hl pointe sur le tableau de donnée d'un stage
call #0x0014 // j'écris la valeur 'e' dans l'adresse level
pourquoi pas:
LD HL,#_level
LD (HL),E
Tu as raison. Merci
Voici la routine que j'ai faite et le niveau s'affiche en appelant D_Fuz(1..112). J'ai eu un gros buuggggg qui était dû au fait que je pilais les valeurs sans dépiler la dernière à la sortie de la boucle. C'est une routine qui peut en effrayer plusieurs mais elle fonctionne
Merci les poto et à bientôt
void D_Fuz(unsigned char lvls)
{
lvls;
__asm
// lit niveau et le multiplie par 72
ld l,4(ix) // bc = lvls
ld h,#0
push hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
push hl
pop de
pop hl
add hl,hl
add hl,hl
add hl,hl
add hl,de // adresse level+lvls*72
ld b,#72
ld de,#_level
push de
boucle_d_fuz:
ld a,#0x01
call #0x000c
inc hl
ei
pop de
ld (de),a
inc de
push de
djnz boucle_d_fuz
pop de
__endasm;
Sector28
Membre non connecté
Villageois
aoineko
Membre non connecté
Conseiller Municipal
Et avec un
void D_Fuz(unsigned short lvls) __z88dk_fastcall { ... }
ta variable
lvls
serait déjà dans HL au début de ta routine.
On est toujours ignorant avant de savoir.
TurboSEB
Membre non connecté
Conseiller Municipal
Petite question techno
Ca existe une ROM de 48ko (forcement oui) ou bien ca sera dans la pratique, une ROM de 64ko que l'on remplie en 48ko plus 16ko de zéros ?
Un peu comme certaines ROMs interne, bios,... qui sont modifiés Edité par TurboSEB Le 15/12/2021 à 13h17
Ca existe une ROM de 48ko (forcement oui) ou bien ca sera dans la pratique, une ROM de 64ko que l'on remplie en 48ko plus 16ko de zéros ?
Un peu comme certaines ROMs interne, bios,... qui sont modifiés Edité par TurboSEB Le 15/12/2021 à 13h17
MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
aoineko
Membre non connecté
Conseiller Municipal
Ricco, j'ai ajouté une fonction de changement de slot de la page 0 à ma lib (
Sys_SetPage0Slot
@ https://github.com/aoineko-fr/CMSX/blob/master/cmsx/src/system.c).
L'intérêt, c'est que comme la fonction est dans notre programme (en page 1 ou 2), on peut switcher la page 0 facilement et copier toutes les données avec 1 seul switch.
Par exemple :
Bon après, je te dis pas qu'il faut forcement que tu l'utilises.
Déjà, voir si ta copie octet par octet n'est pas déjà suffisamment rapide vu que tu n'as que 72 octets à récupérer.
Et même si c'est lent et que tu aimerais une solution plus rapide, vu que tu à l'air de bien t'en sortir en assembleur, je te conseillerai plutôt de passer par la méthode CALSLT :
- Tu ajoutes une fonction de copie en assembleur (avec un ldir ) directement dans ton crt0 en la plaçant dans la page 0 avec un .org 0x0000 (ou une autre adresse qui n'entre pas en conflit avec tes données).
- Au moment de récupérer tes données, tu initialises tes registres comme un call standard, mais au lieu de faire un call à ta fonction, tu appelles CALSLT (il faut mettre ta fonction dans IX et le slot de destination dans IY ).
Comme ça le BIOS s'occupe de switcher le slot de la page 0 pour toi, donne la main à ta fonction de copie, puis restaure le slot de la page 0 et te rend la main à la suite de ton programme.
Aucune idée. J'imagine qu'à l'époque, 16 KB ça avait un certain prix et qu'ils évitaient de gâcher. Si les 48 KB n'existaient pas, peut-être utilisaient-ils 3x16 KB. ¯\_(ツ)_/¯
L'intérêt, c'est que comme la fonction est dans notre programme (en page 1 ou 2), on peut switcher la page 0 facilement et copier toutes les données avec 1 seul switch.
Par exemple :
Code C :
u8 biosSlot = Sys_GetPageSlot(0); // Récupération du slot de la page 0 (la Main-ROM normalement) u8 cartSlot = Sys_GetPageSlot(1); // Récupération du slot de la page 1 (la cartouche normalement) Sys_SetPage0Slot(cartSlot); ////////// La page 0 pointe vers la cartouche ////////// { /* Copier d'un coup toutes les données de la page 0 (la cartouche) vers la page 3 (la RAM) /!\ Deux seuls règles ici : - Ne pas utiliser les fonctions du BIOS (qui n'est plus en page 0) - Ne pas réactiver les interruptions */ for(u8 i = 0; i < 72; i++) RAMBuffer[i] = Page0Data[i]; // Tu peux utiliser une fonction de copie rapide en assembleur Sys_SetPage0Slot(biosSlot); } ////////// La page 0 pointe vers le BIOS ////////// EnableInterrupt(); // Les interruptions sont coupées par les fonctions de changement de slot
Bon après, je te dis pas qu'il faut forcement que tu l'utilises.
Déjà, voir si ta copie octet par octet n'est pas déjà suffisamment rapide vu que tu n'as que 72 octets à récupérer.
Et même si c'est lent et que tu aimerais une solution plus rapide, vu que tu à l'air de bien t'en sortir en assembleur, je te conseillerai plutôt de passer par la méthode CALSLT :
- Tu ajoutes une fonction de copie en assembleur (avec un ldir ) directement dans ton crt0 en la plaçant dans la page 0 avec un .org 0x0000 (ou une autre adresse qui n'entre pas en conflit avec tes données).
- Au moment de récupérer tes données, tu initialises tes registres comme un call standard, mais au lieu de faire un call à ta fonction, tu appelles CALSLT (il faut mettre ta fonction dans IX et le slot de destination dans IY ).
Comme ça le BIOS s'occupe de switcher le slot de la page 0 pour toi, donne la main à ta fonction de copie, puis restaure le slot de la page 0 et te rend la main à la suite de ton programme.
TurboSEB :
Ca existe une ROM de 48ko (forcement oui) ou bien ca sera dans la pratique, une ROM de 64ko que l'on remplie en 48ko plus 16ko de zéros ?
Aucune idée. J'imagine qu'à l'époque, 16 KB ça avait un certain prix et qu'ils évitaient de gâcher. Si les 48 KB n'existaient pas, peut-être utilisaient-ils 3x16 KB. ¯\_(ツ)_/¯
On est toujours ignorant avant de savoir.
pour moi la rom 48k n'existe pas en physique c'est une rom 64k dedans
les jeux japonais utilisent des cartouches
16k page 0000h ou 4000h ou 8000h
32k page 4000h
64k page 0000h
puis ce sont des megaroms avec leur mapper spécifique
les jeux 48k sont arrivés avec le MSXdev
les jeux japonais utilisent des cartouches
16k page 0000h ou 4000h ou 8000h
32k page 4000h
64k page 0000h
puis ce sont des megaroms avec leur mapper spécifique
les jeux 48k sont arrivés avec le MSXdev
Merci Aoineko et Sector28
Le jeu fonctionne
La routine est bcp plus rapide que celle que j'utilisais car
- je transferais 45 octets 'fuzionnés'
- je les defuzionnais dans un buffer de 72 octets (avec rotation de bits et tout le toutim)
- je les affichais
là, je transfère 72 octets sans aucune manipulations et j'affiche
C'est donc parfait
Je vais voir la mise en pratique du CALSLT
Pour le moment je vais essayer de voir comment transferer de la page0 vers la vram (name, pattern et color)
Merci encore les zamis
Merci Jipe pour ces précisions
A pluch'
ps : pour le moment, j'ai gagné 5828 octets. Il me faut un peu plus de place pour la replay et une musique (Au fait, il faut que j'en trouve une et le musicien qui va avec héhéhéhé) Edité par Ricco59 Le 16/12/2021 à 22h30
Le jeu fonctionne
La routine est bcp plus rapide que celle que j'utilisais car
- je transferais 45 octets 'fuzionnés'
- je les defuzionnais dans un buffer de 72 octets (avec rotation de bits et tout le toutim)
- je les affichais
là, je transfère 72 octets sans aucune manipulations et j'affiche
C'est donc parfait
Je vais voir la mise en pratique du CALSLT
Pour le moment je vais essayer de voir comment transferer de la page0 vers la vram (name, pattern et color)
Merci encore les zamis
Merci Jipe pour ces précisions
A pluch'
ps : pour le moment, j'ai gagné 5828 octets. Il me faut un peu plus de place pour la replay et une musique (Au fait, il faut que j'en trouve une et le musicien qui va avec héhéhéhé) Edité par Ricco59 Le 16/12/2021 à 22h30
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
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
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie