La Place des Développeurs Bonne pratique pour l'adresse de la pile
aoineko
Membre non connecté
Conseiller Municipal
Plus je cherche d'infos sur la "bonne" valeur à donner au pointer de pile (stack pointer), et plus je suis perdu...
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é :
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 :
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.
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.
Sector28
Membre non connecté
Villageois
aoineko
Membre non connecté
Conseiller Municipal
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.
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.
Sector28
Membre non connecté
Villageois
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.
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
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.
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...
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.
aoineko
Membre non connecté
Conseiller Municipal
Je comprends toujours pas comment fonctionne la zone de mémoire « réservée » au système !
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.
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.
On est toujours ignorant avant de savoir.
Sector28
Membre non connecté
Villageois
aoineko
Membre non connecté
Conseiller Municipal
Ca y est, j'ai enfin compris, merci
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.
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.
Sector28
Membre non connecté
Villageois
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
Pour m'entrainer à l'assembleur (je suis débutant, ma spécialité c'est le C++ ), j'ai essayé d'optimiser le code.
J'ai bon ?
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.
Sector28
Membre non connecté
Villageois
"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
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 !
aoineko
Membre non connecté
Conseiller Municipal
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 ?)
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.
Sector28
Membre non connecté
Villageois
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.
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