MSX Village forum

La Place des Développeurs Bonne pratique pour l'adresse de la pile

aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 20/11/2020 à 21h58
Plus je cherche d'infos sur la "bonne" valeur à donner au pointer de pile (stack pointer), et plus je suis perdu... :sick

Y a notamment une discussion intéressante sur le sujet sur MSX.org : https://www.msx.org/forum/msx-talk/development/best-way-to-init-sp-rom

Voici les valeurs que j'ai trouvé :
  • AS IT : valeur du register SP après initialisation du système
  • (HIMEM) : valeur stocké en mémoire (0xFC4A) par le système (peut être différent de la valeur AS IT) ; méthode officielle mais qui pose problème dans certains cas particuliers
  • 0xF380 : plus petite adresse de variables systèmes sans DiskROM (RDPRIM)
  • 0xF30F : plus petite adresse de variables systèmes du DiskROM (KANJTABLE)
  • 0xFFFF : osef le Bios !
  • 0x0000 : osef le standard MSX (ne marche pas si le MSX utilise des sub-slots)


D'après OpenMSX, sur MSX2 VG8235, la valeur AS IT de SP est 0xF08E alors que HIMEM vaut 0xF380.
Valeur qui correspond bien MSX2 Technical Handbook :
Code TEXT :
FFFF    ---------------------------
        | slot selection register |
FFFC    |-------------------------|
        |         reserved        |
FFF8    |-------------------------|
FFF7    |  MAIN-ROM slot address  |
        |-------------------------|
        |  register reservation   |
        |      area for new       |
FFE7    |       VDP (9938)        |
        |-------------------------|
        |       program for       |
FFCA    |  expansion BIOS calls   |
        |-------------------------|
        |                         |
        |       hook area         |
FD9A    |                         |
        |-------------------------|
        |                         |
        |    system work area     |
F380    |                         |
        ---------------------------


Mes questions :

1) Est-ce qu'on peut vraiment écraser l'espace des variables systèmes si on n'utilise pas le Bios comme certains semblent le dire ? Ce qui me semble étonnant, c'est qu'avec les interruptions et les Hooks, je vois pas comment on peut être sûr que je système ne va pas essayer d'accéder à cette zone mémoire. Dans mon jeu Carwar, je n'utilisais quasiment pas le Bios (sauf pour le clavier et le joystick) donc je serais pas contre récupérer tout l'espace mémoire alloué au Bios si c'est vraiment possible (et safe).

2) Pourquoi la valeur AS IT est inférieur à la valeur HIMEM sur le VG8235 !? La différence vient de l'espace alloué au DiskROM ? La valeur AS IT est-elle fiable ? Pourquoi presque tous les programmes commencent par changer la valeur de SP si la valeur par défaut est correcte ?

3) Comment calculer la place nécessaire pour le DiskROM ? C'est toujours de 0xF30F à F37F ? Ca dépend du nombre de disques ?

Je cherche pas forcement LA "bonne" solution, mais je serai très intéressé par vos retours d'expérience concrètes. :)


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 20/11/2020 à 23h13
Il est parfaitement possible d'utiliser la ram de f380 a fffe, et ceci sans déconnecter le bios, par contre, beaucoup de routines du bios seront inutilisables. Les routines SNSMAT,GETSTK,GTTRIG sont "safe".


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

Le 21/11/2020 à 12h22
Prenons un exemple : La variable système JIFFY, localisée à l'adresse FC9Eh est décrite comme étant incrémenté à chaque interruption du VDP.
Si je mets mes datas à cette adresse, ils vont être écrasé, non !?
Y a pleins d'autres variables systèmes qui me semblent pouvoir être modifiés à tout moment.
A moins de désactiver toutes les interruptions (je sais pas si c'est possible et si c'est viable), je vois pas comment on pourrait utiliser cette zone mémoire.

EDIT : Y a aussi la table des Hooks qui se trouve en plein milieu de l'espace RAM "réservé" au systè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: 561

Le 21/11/2020 à 20h23
sélectionne de la ram en $0000-$3FFF, place un saut en $38, mais tu n'as plus de bios.

ou bien, place les 4 octets E1,C3,02,0D en $FD9A, alors tu as le bios, mais je ne sais pas si ça fonctionne sur turbo-r ..
en tout cas, ça ne fonctionne pas sur CBIOS.


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

Le 21/11/2020 à 20h51
Sector28 :
sélectionne de la ram en $0000-$3FFF, place un saut en $38, mais tu n'as plus de bios.

ou bien, place les 4 octets E1,C3,02,0D en $FD9A, alors tu as le bios, mais je ne sais pas si ça fonctionne sur turbo-r ..
en tout cas, ça ne fonctionne pas sur CBIOS.


Désolé, j'ai pas compris ta réponse. J'ai de grosses lacunes en programmation MSX... :moue

Qu'est-ce que tu appelles « placer un saut en $38 » ?
Tu veux dire mettre une instruction JP à l'adresse 0038h ? Un saut vers où ?

Pour l'adresse FD9Ah (qui correspond au hook H.KEYI), à quoi correspond les instructions E1,C3,02,0D ?
Si ça permet de court-circuiter ce hook en particulier, quand est-il des autres ?

En fait, je me trompe peut-être (surement ? ^^) mais j'avais cru comprendre qu'indépendamment de notre propre programme, le système MSX faisait des interruptions lors de certains évènements : vblank, clock, appuie d'une touche, réception de données RS232, etc. Et que ces interruptions déclenchaient des hooks et écrivaient dans la mémoire alloué au système.
Je sais pas si l'instruction DI permet de désactiver TOUTES les interruptions du système et si ça marche, est-ce que ça pose pas de problèmes !?


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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 26/11/2020 à 12h04
Je comprends toujours pas comment fonctionne la zone de mémoire « réservée » au système ! :sick

Par exemple, l'espace NEWKEY (11 bytes à partie de 0xFBE5 ) est bien modifié dès qu'on appuis sur une touche, même si j'appelle aucune fonction système.
Si je veux utiliser cette espace mémoire, comment faire pour que le système n'y écrive pas !?
Y a des hook ou autre à désactiver ? Faut désactiver toutes les interruptions ? Si c'est possible, est-ce que ça pose pas de problèmes !?

A contrario, la variable SCRMOD (situé à 0xFCAF ), qui est censé contenir le screen mode actuel, ne semble pas être modifié quand on fait appelle à la routine BIOS pour changer le mode de l'écran ( CHGMOD @ 0x005F ). C'est le cas que quand on passe par le Basic ? Comment savoir quelle variable est modifié par qui et quand ? Les docs que j'ai lu sont bien pauvres en infos à ce sujet. :moue


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 26/11/2020 à 13h50
Si tu veux utiliser la ram de F380 à FFFE, tu sélectionnes de la ram de 0000 à FFFF, place le vecteur d'interruption en 0038 (dans un premier temps tu peux y placer l'octet C9) et n’utilise plus le bios.


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

Le 26/11/2020 à 16h19
Ca y est, j'ai enfin compris, merci :D
Du coup, après avoir mis un RET en 0x0038, autant faire un DI pour que le CPU n'essaye plus de call les interruptions (je sais pas si ça fait gagner un peu de temps) ?

Ensuite, ça veut dire que je dois gérer le clavier, le son et les manettes via les ports PPI & PSG (ce que je fais déjà pour le VDP).
Faudra aussi que je gère le timing à la main (j'ai plus le hook H.TIMI pour synchro la musique ni la variable JIFFY pour gérer le temps qui passe).

S'il n'y a pas d'autres contraintes, ça me semble nickel pour mes besoins. :)


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 26/11/2020 à 16h41
Code :

          ORG     38H

          PUSH    HL
          PUSH    DE
          PUSH    BC
          PUSH    AF
          EXX
          EX      AF, AF'
          PUSH    HL
          PUSH    DE
          PUSH    BC
          PUSH    AF
          PUSH    IY
          PUSH    IX
          IN      A, (99H)
          AND     A
          JP      P, _D02
          CALL    H_TIMI
_D02:     POP     IX
          POP     IY
          POP     AF
          POP     BC
          POP     DE
          POP     HL
          EX      AF, AF'
          EXX
          POP     AF
          POP     BC
          POP     DE
          POP     HL
          EI
          RET

; Finalement, tu l'as retrouvé ton H_TIMI ^^

H_TIMI:

          ...

          RET


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

Le 26/11/2020 à 17h15
Ah oui, tu récupères les interruptions et si c'est celle qui vient du VBlank, tu call H_TIMI.
Super ! :top


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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 26/11/2020 à 17h55
Pour m'entrainer à l'assembleur (je suis débutant, ma spécialité c'est le C++ ^^), j'ai essayé d'optimiser le code.
Code ASM :
 
    .org    0x0038
 
    push    af
 
    in      a, (0x99)
    and     a
    jp      p, _interrupt_end
 
    push    hl
    push    de
    push    bc
    exx
    ex      af, af'
    push    af
    push    hl
    push    de
    push    bc
    push    iy
    push    ix
 
    call    _vblank
 
    pop     ix
    pop     iy
    pop     bc
    pop     de
    pop     hl
    pop     af
    ex      af, af'
    exx
    pop     bc
    pop     de
    pop     hl
 
_interrupt_end:     
    pop     af
 
    ei
    ret
 


J'ai bon ?


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 26/11/2020 à 18h04
"JP P," saute à _D02 si le bit 7 de A est 0, donc H_TIMI est appelé si le bit 7 du registre d'état du VDP est 1.
Ce bit est positionné par le vdp à la fin du balayage de l'écran.
Une lecture du registre d'état ( IN A,(99H) ) réinitialise automatiquement ce bit à 0. Edité par Sector28 Le 26/11/2020 à 18h32


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

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 561

Le 26/11/2020 à 18h12
aoineko :
J'ai bon ?

:top


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

Le 26/11/2020 à 18h27
Reste à sauvegarder qq infos importantes avant d'écraser la mémoire et notamment l'emplacement (slot) des différentes ROM (main, sub, disk) et de la RAM.
J'ai fait un p'tit programme pour détecter ces infos.


J'ai les slots actuellement sélectionnés sur chaque page (via le PPI) et j'ai le slot de la Main-ROM et de la Sub-ROM.
Les infos qu'ils me manques :
- Ou se trouve la RAM (je peux partir du principe que c'est toujours le slot sélectionné sur la Page 3 au démarrage ?)
- Pour chaque slot, ce qu'il contient à chaque page (par ex., même si je sais que la RAM est sur le slot 3-2, comment savoir sur combien de page elle s'étend ?)


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 26/11/2020 à 18h53
https://www.msx.org/wiki/Develop_a_program_in_cartridge_ROM#Search_for_RAM

sur msx avec disque, F341->F344

ENASLT ne fonctionne pas pour la page 0000-3FFF.

La ram du bank 0 doit donc être sélectionnée en dernier par CALSLT qui lancera ton programme.


DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie