MSX Village forum

La Place des Développeurs ROM 48K et slots

KN2000 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 08/06/2010 à 09h30

Messages: 209

Le 13/12/2021 à 20h49

Reprise du message précédent

Ricco59 :
Hello les zamis
> 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 Bios Basic du MSX ? :oups Edité par KN2000 Le 13/12/2021 à 21h14


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 13/12/2021 à 20h59
Cette zone correspond au BASIC qui ne me servira pas.

Ricco59 :
Hello les zamis

(...)
> 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


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

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 13/12/2021 à 22h53
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 ;)



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

Villageois

Rang

Avatar

Inscrit le : 08/06/2010 à 09h30

Messages: 209

Le 13/12/2021 à 23h21
Peut-être rajouter un EI après l'appel à #0x0014...

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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2695

Le 13/12/2021 à 23h40
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) :
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.
Github    
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 552

Le 13/12/2021 à 23h44
WRSLT pour une adresse supérieur à $C000, et la pile ?


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...
:)
   
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 552

Le 13/12/2021 à 23h49
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


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: 2695

Le 13/12/2021 à 23h53
Sa RAM est directement accessible par le Z80 en page 3, il n'a pas besoin de passer par de l'écriture inter-slot.


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

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 15/12/2021 à 00h54
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


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;
Edité par Ricco59 Le 15/12/2021 à 00h55


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: 552

Le 15/12/2021 à 10h59
// lit niveau et le multiplie par 72
ld l,4(ix) // bc = lvls
ld h,#0
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 ; hl = x(8+64)


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: 2695

Le 15/12/2021 à 11h30
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.
Github    
TurboSEB Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 08/08/2010 à 20h57

Messages: 5791

Le 15/12/2021 à 12h34
Petite question techno :tea
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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2695

Le 16/12/2021 à 01h37
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 :
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.
Github    
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10328

Le 16/12/2021 à 08h21
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


:noel
Site web    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 16/12/2021 à 22h29
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


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

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 18/12/2021 à 10h46
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    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie