La Place des Développeurs Lire le contenu d'un fichier en ASM
aoineko
Membre non connecté
Conseiller Municipal
Reprise du message précédent
Code ASM :
; copie en RAM de paramètre pour BLTVD ;... ldIXBLTVD ; 019Dh ldIY00000011b ; Slot 3-0 (toujours la?) callCALSLT ; 1Ch ei
Un truc comme ça ?
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Ça marche toujours pas.
Voici ce que je fait :
Sachant que mon image contient un entête de 7 bytes contenant FEh, 0000h, <fileSize>, 0000h (le même que celui généré par BMP2MSX).
Une idée ?
EDIT : Et sachant qu'un...
... fonctionne bien. Comment faire l'équivalent en ASM !? Edité par aoineko Le 20/04/2011 à 00h23
Voici ce que je fait :
Code ASM :
;// Dans la pile: Adresse du fichier (2 bytes, ""TRACK_01.SC8""), Destination X (2 bytes, 0), Destination Y (2 bytes, 0) ldL,4(ix) ldH,5(ix) ld(FNPTR), HL;// FNPTR=F562h ldL,6(ix) ldH,7(ix) ld(DX), HL;// DX=F566h ldL,8(IX) ldH,9(IX) ld(DY), HL;// DX=F568h xorA ld(ARG), A;// ARG=F56Fh, ARG doit toujours être mis à zéro ld(LOGOP), A;// LOGOP=F570h, Idem LOGOP ldHL, FNPTR;// FNPTR=F562h ldIX,BLTVD;// BLTVD=019Dh ldIY,#0x3;// 00000011b, Slot 3-0 (toujours la?) callCALSLT;// CALSLT=1Ch ei
Sachant que mon image contient un entête de 7 bytes contenant FEh, 0000h, <fileSize>, 0000h (le même que celui généré par BMP2MSX).
Une idée ?
EDIT : Et sachant qu'un...
Code TEXT :
10 SCREEN 8 20 BLOAD"TRACK_01.SC8",S
... fonctionne bien. Comment faire l'équivalent en ASM !? Edité par aoineko Le 20/04/2011 à 00h23
On est toujours ignorant avant de savoir.
Je te joins un exemple que j'ai réalisé (image sur le disque en SC8 issue de BMP2MSX). Dans le zip tu as le DSK pour BlueMSX ou autre émulateur, le fichier .BIN, le .SYM et le .ASM (attention, le codage suit la syntaxe d'asMSX). Y a plus qu'à insérer le DSK, puis un bon bload"bltvd.bin",r
bltvd.zip
bltvd.zip
MSX un jour, MSX toujours !
aoineko
Membre non connecté
Conseiller Municipal
Merci beaucoup ; je teste ça !
Par contre, ça marchera pareil en lançant depuis une ROM (sachant que la page 1 et 2 sont sur le slot de la cartouche) ?
Par contre, ça marchera pareil en lançant depuis une ROM (sachant que la page 1 et 2 sont sur le slot de la cartouche) ?
On est toujours ignorant avant de savoir.
De mémoire, lancer un fichier disque depuis une ROM est impossible je crois. Mais ça demande confirmation à d'autres personnes plus expérimentées que moi...
MSX un jour, MSX toujours !
Pour que ça marche, faut faire attention aux points suivants :
- Le BIOS est dans le Bank 0 donc ton programme ne peut être dans ce bank.
- Lorsqu'on fait un appel à la SubROM, le Bank 1 est utilisé donc la routine qui fait un appel à la SubROM ne peut être dans ce bank.
- Il faut savoir que l'instruction BLTVD utilise comme buffer la zone de mémoire libre. Il ne faut pas mettre ta routine dans cette zone.
- Il faut que la ROM Disk soit initialisée comme j'ai indiqué plus haut dans ce poste (c'est la routine utilisée dans Metal Gear 2).
Voici un exemple simplifié à l'extreme :
file2vram.zip
Pour tester, il faut mettre la disquette dans le lecteur A: et la ROM dans un port cartouche. Il y a aussi un programme Basic qui fait la même chose sans la ROM. (Il y a aussi un autre test en fichier binaire que j'ai oublié d'effacer.)
Pour voir le programme en assembleur, utilise le débuggeur de BlueMSX avec un point d'arrêt en 04010h. L'entête du fichier TEST.PIC fait 4 octets (largeur, hauteur) Edité par GDX Le 20/04/2011 à 10h52
- Le BIOS est dans le Bank 0 donc ton programme ne peut être dans ce bank.
- Lorsqu'on fait un appel à la SubROM, le Bank 1 est utilisé donc la routine qui fait un appel à la SubROM ne peut être dans ce bank.
- Il faut savoir que l'instruction BLTVD utilise comme buffer la zone de mémoire libre. Il ne faut pas mettre ta routine dans cette zone.
- Il faut que la ROM Disk soit initialisée comme j'ai indiqué plus haut dans ce poste (c'est la routine utilisée dans Metal Gear 2).
Voici un exemple simplifié à l'extreme :
file2vram.zip
Pour tester, il faut mettre la disquette dans le lecteur A: et la ROM dans un port cartouche. Il y a aussi un programme Basic qui fait la même chose sans la ROM. (Il y a aussi un autre test en fichier binaire que j'ai oublié d'effacer.)
Pour voir le programme en assembleur, utilise le débuggeur de BlueMSX avec un point d'arrêt en 04010h. L'entête du fichier TEST.PIC fait 4 octets (largeur, hauteur) Edité par GDX Le 20/04/2011 à 10h52
aoineko
Membre non connecté
Conseiller Municipal
granced :
De mémoire, lancer un fichier disque depuis une ROM est impossible je crois. Mais ça demande confirmation à d'autres personnes plus expérimentées que moi...
Ça marchait dans King's Valley 2 par exemple (pour l'éditeur de niveau).
GDX :
Voici un exemple simplifié à l'extreme : file2vram.zip
Merci, je teste ça à midi. Edité par aoineko Le 20/04/2011 à 11h31
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
J'ai recopié le code ASM depuis BlueMSX.
J'ai qq questions :
1) Déjà, la 1re ligne avec le [add a,c] qui met [4010h] dans [AF] est un grand mystère.
2) Ensuite, le code qui suit n'est pas clair du tout pour moi mais ça semble avoir un rapport avec les slots
3) Le code en [4040h] semble copier le code en [4050h] vers la RAM et saut la-bas. J'ai pas besoin de copier tous mon code en RAM, non ? Faut copier juste l'appel au [call EXTROM], non ?
4)Le code en [4050h] s'occupe de l'appel au BLTVD ; mais je vois pas ou sont initialisé les paramètres (pointeur vers nom de fichier, DX, DY, etc.). J'ai trouvé le nom de fichier en [4100h] mais je vois pas comment il est transféré à BLTVD. Trouvé ; c'est copier en [4040h] et ça se retrouve donc en [C0C0h].
Dur dur l'assembleur... Edité par aoineko Le 20/04/2011 à 14h40
Code ASM :
4010: adda,c ld(bc),a ldbc,#8002 or#f3 call#0138 ; RSLREG: Lit l'état courant du registre du slot primaire. rrca rrca and#03 ldc,a ldb,#00 ldhl,#fcc1 addhl,bc or(hl) ldc,a inchl inchl inchl inchl lda,(hl) and#0c orc ld(#c399),a di ldh,a ldl,#f7 ld(#feda),hl ldhl,#4040 ld(#fedc),hl ret 4040: ldhl,#4050 ldde,#c000 ldbc,#00d0 ldir jp#c000 nop nop 4050: lda,#08 call#005f ; CHGMOD: Changement de mode d'écran. ldhl,#c0c0 ldde,#f562 ldbc,#000f ldir ldix,#019d ldhl,#f562 call#015f ; EXTROM: Effectue un appel à la ROM secondaire (Sub-ROM). 406a: jr#406a 4100: db022h,"A:TEST.PIC",022h,00h
J'ai qq questions :
1) Déjà, la 1re ligne avec le [add a,c] qui met [4010h] dans [AF] est un grand mystère.
2) Ensuite, le code qui suit n'est pas clair du tout pour moi mais ça semble avoir un rapport avec les slots
3) Le code en [4040h] semble copier le code en [4050h] vers la RAM et saut la-bas. J'ai pas besoin de copier tous mon code en RAM, non ? Faut copier juste l'appel au [call EXTROM], non ?
4)
Dur dur l'assembleur... Edité par aoineko Le 20/04/2011 à 14h40
On est toujours ignorant avant de savoir.
1) Oups, c'est un déchet que j'ai oublié d'effacer. Tu peux retirer la partie qui précède le call 0138h donc.
2) C'est pour pouvoir revenir au programme de ta ROM après l'initialisation de la ROM Basic.
3) Non, seulement les données et le code exécuté pendant que la SubROM est là.
4) Tu as oublié un petit bout à la fin.
Edit :
Le "ld (#c399),a" ne sert pas dans l'exemple mais devrait servir par la suite. Ça correspond au "LD (mem-slot),A" de mon exemple précédent. Edité par GDX Le 28/04/2011 à 16h22
Code ASM :
4010: adda,c ld(bc),a ldbc,#8002 or#f3
2) C'est pour pouvoir revenir au programme de ta ROM après l'initialisation de la ROM Basic.
3) Non, seulement les données et le code exécuté pendant que la SubROM est là.
4) Tu as oublié un petit bout à la fin.
Code ASM :
4100: db022h,"A:TEST.PIC",022h,00h 4100: 4110: db0,0,020h,0,020h,0,0,0,0,0,0,0; data du BLTVD qui sont copiés vers 0f562h avec un ldir
Edit :
Le "ld (#c399),a" ne sert pas dans l'exemple mais devrait servir par la suite. Ça correspond au "LD (mem-slot),A" de mon exemple précédent. Edité par GDX Le 28/04/2011 à 16h22
aoineko
Membre non connecté
Conseiller Municipal
La méthode de Jipe via CALSLT ne permettait pas d'appeler la commande BLTVD sans avoir à déplacer le code en RAM ? Et puis, mon programme saute tout de suite en Page 2 (les premiers 16K sont rempli de data) ; ça devrait marcher sans modification, non ?
@GDX, tu as un [di] mais pas de [ei] ; est-ce normal ? Edité par aoineko Le 20/04/2011 à 23h51
@GDX, tu as un [di] mais pas de [ei] ; est-ce normal ? Edité par aoineko Le 20/04/2011 à 23h51
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Bon, l'init du hook H.STKE semble fonctionner (en tout cas ça plante pas) mais par contre 1) mon programme marche à moitié, 2) l'image se charge toujours pas depuis le disque.
Déjà, j'essaye de comprendre ce que fait la fonction d'init, mais j'ai un peu de mal... Je pourrais avoir qq explications ?
De plus, j'ai cru comprendre que le fait d'activer la Sub-ROM faisait qu'une partie de la RAM était réservé ; c'est le cas ?
Déjà, j'essaye de comprendre ce que fait la fonction d'init, mais j'ai un peu de mal... Je pourrais avoir qq explications ?
De plus, j'ai cru comprendre que le fait d'activer la Sub-ROM faisait qu'une partie de la RAM était réservé ; c'est le cas ?
On est toujours ignorant avant de savoir.
Pour faire un programme en cartouche de plus de 16Ko, il faut savoir gérer au minimum les Slot primaires. Et pour gérer plus de 32Ko de RAM, il faut savoir aussi gérer les Slot secondaires car au démarrage seule la RAM des bank 2 et 3 sera sélectionnée par défaut (en Basic, c'est le fameux poke&HFFFF,x qui permet de sélectionner la RAM en bank 0 et 1 pour faire fonctionner certains jeux MSX1 sur un MSX aux slot étendus).
Le DI est la pour s'assurer que les interruptions soient coupées. Les interruptions sont rétablies après un appel à une routine des Slot aussi après l'initialisation du MSX.
Je te conseille que rejeter un coup d'oeuil à mon explication des Slot que j'ai modifiée entre temps.
Slot Primaires :
http://www.msxvillage.fr/forum/topic.php?id=596&pt=1#m8430
Slot Secondaires
http://www.msxvillage.fr/forum/topic.php?id=596&pt=2#m8486
Voici une explication du code plus détaillée :
Heureusement que tu l'as désassemblé. J'avais eu la flemme. Edité par GDX Le 28/04/2011 à 06h19
Le DI est la pour s'assurer que les interruptions soient coupées. Les interruptions sont rétablies après un appel à une routine des Slot aussi après l'initialisation du MSX.
Je te conseille que rejeter un coup d'oeuil à mon explication des Slot que j'ai modifiée entre temps.
Slot Primaires :
http://www.msxvillage.fr/forum/topic.php?id=596&pt=1#m8430
Slot Secondaires
http://www.msxvillage.fr/forum/topic.php?id=596&pt=2#m8486
Voici une explication du code plus détaillée :
Code ASM :
4010: di call#0138; RSLREG: Lit l'état actuel du registre du slot primaire. rrca rrca and#03 ldc,a; Sauvegarde l'état du slot primaire du Bank 1 (qui contient la ROM) ldb,0 ldhl,#fcc1; Hl = 0fcc1h (pour slot 0) addhl,bc; Hl = valeur pour slot actuel (EXBRSA) or(hl); met le bit 7 à 1 si Slot 0 est étendu ldc,a inchl inchl inchl inchl lda,(hl); Lit l'état actuel du registre du slot secondaire du Slot actuel (EXPTBL) and#0c; Garde l'état du slot secondaire du Bank 1 orc; Ajoute l'état du slot primaire du Bank 1 ld(mem_slot),a ; Sauvegarde l'adresse du Slot de la ROM di ldh,a ldl,#f7 ld(#feda),hl; place l'intruction RST 30 + numéro de slot + adresse de saut ldhl,#4040; dans le hook H.STKE ld(#fedc),hl; pour revenir à l'adresse 04040h de la ROM ret 4040: ldhl,#4050 ldde,#c000 ldbc,#00d0 ldir; Copie de la routine de chargement, du nom de fichiers et des données BLTVD. jp#c000 4050: lda,#08 call#005f ; CHGMOD: Changement de mode d'écran. (A=8 donc screen8) ldhl,#c0c0 ldde,#f562 ldbc,#000f ldir ldix,#019d; Routine de transfère d'un fichier vers la VRAM (BLTVD) ldhl,#f562 call#015f ; EXTROM: Effectue un appel à la routine de la Sub-ROM. 406a: jr#406a ; fin de l'exemple (reste sur place). 4100: db022h,"A:TEST.PIC",022h,00h; L'entête du fichier TEST.PIC fait 4 octets (largeur, hauteur) 4110: dW0C0D0h db020h,0,020h,0,0,0,0,0,0,0; données du BLTVD (qui sont copiées en 0C0C0h avec un ldir)
Heureusement que tu l'as désassemblé. J'avais eu la flemme. Edité par GDX Le 28/04/2011 à 06h19
aoineko
Membre non connecté
Conseiller Municipal
Merci pour les explications.
Concrètement, qu'est-ce que ça fait d'activer l'accès disque ? Certaines routines sont déplacés en RAM ? Des buffers y sont réservé ? En fait, je vois pas en quoi lancer le code d'init fait qu'un BLTVD fonctionnera ensuite.
EDIT : Et vous pouvez confirmer que tout ceci est sans rapport avec les fonctions du DOS ? Les open/read/close, sont bien inutilisable en bootant depuis une cartouche ? Edité par aoineko Le 21/04/2011 à 15h50
Concrètement, qu'est-ce que ça fait d'activer l'accès disque ? Certaines routines sont déplacés en RAM ? Des buffers y sont réservé ? En fait, je vois pas en quoi lancer le code d'init fait qu'un BLTVD fonctionnera ensuite.
EDIT : Et vous pouvez confirmer que tout ceci est sans rapport avec les fonctions du DOS ? Les open/read/close, sont bien inutilisable en bootant depuis une cartouche ? Edité par aoineko Le 21/04/2011 à 15h50
On est toujours ignorant avant de savoir.
aoineko :
Concrètement, qu'est-ce que ça fait d'activer l'accès disque ? Certaines routines sont déplacés en RAM ? Des buffers y sont réservé ? En fait, je vois pas en quoi lancer le code d'init fait qu'un BLTVD fonctionnera ensuite.
Ça initialise les variables systèmes concernant le disque (placées avant 0F380h, des Hook et sans doutes d'autres paramètres.
aoineko :
EDIT : Et vous pouvez confirmer que tout ceci est sans rapport avec les fonctions du DOS ? Les open/read/close, sont bien inutilisable en bootant depuis une cartouche ?
Tout ceci est en rapport avec les fonctions du DOS et du Disk Basic. Les open/read/close, sont utilisable comme je l'ai déjà indiqué plus haut.
aoineko
Membre non connecté
Conseiller Municipal
GDX :
Tout ceci est en rapport avec les fonctions du DOS et du Disk Basic. Les open/read/close, sont utilisable comme je l'ai déjà indiqué plus haut.
Alors la, je comprends vraiment plus rien.
Sur MSX2, le DOS n'était pas une cartouche ROM séparé ? Si oui, comment pourrait t'on utiliser des instructions DOS sans quelles soient présente ?
Qu'appelles tu le Disk Basic ? Les instructions du Basic liés aux accès disque et situé dans le Page 1 du Slot 0 (ou PAge 0 du Slot 3-0) ?
EDIT : Par contre, je viens de comprendre le code. En fait, c'est le fait que le MSX initialise chaque ROM séquentiellement (dans l'ordre des slots) tant qu'elles font des return qui fait que pour initialiser la Sub-ROM (slot 3), il faut que la cartouche (slot 1 ou 2) fasse un return ; sinon elle garde la main et la Sub-ROM ne sera pas initialiser. Le mécanisme d'initialisation est maintenant plus clair.
Par contre, ce que je comprends toujours pas, c'est le rapport entre Sub-ROM, Disk-Basic et DOS. Edité par aoineko Le 21/04/2011 à 16h33
On est toujours ignorant avant de savoir.
sur un MSX de base il n'y a pas de commandes pour le disque mais juste pour faire fonctionner la cassette
le disk basic et le dos sont dans la romdisk de l'interface du disque qui était en option sur les MSX1
sur les MSX2 avec lecteur de disquette incorporé les routines sont dans la rom disk de la machine
le disk basic est accessible sur des machines de 16k ou 32k de RAM ( voir les commandes dans un livre MSX )
pour faire fonctionner le DOS il faut obligatoirement 64K de RAM et une disquette contenant le DOS1
le MSXDOS2 est encore une extension et les commandes sont une version étendue de celle du DOS1 et un mapper 256k est nécessaire
le disk basic et le dos sont dans la romdisk de l'interface du disque qui était en option sur les MSX1
sur les MSX2 avec lecteur de disquette incorporé les routines sont dans la rom disk de la machine
le disk basic est accessible sur des machines de 16k ou 32k de RAM ( voir les commandes dans un livre MSX )
pour faire fonctionner le DOS il faut obligatoirement 64K de RAM et une disquette contenant le DOS1
le MSXDOS2 est encore une extension et les commandes sont une version étendue de celle du DOS1 et un mapper 256k est nécessaire
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie