MSX Village forum

La Place des Développeurs Lire le contenu d'un fichier en ASM

aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 19/04/2011 à 14h39

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 ? :hum


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

Le 20/04/2011 à 00h14
Ça marche toujours pas. :(
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 ? :hum

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.
Github    
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1501

Le 20/04/2011 à 08h06
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


MSX un jour, MSX toujours ! :D
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 20/04/2011 à 10h15
Merci beaucoup ; je teste ça ! :top

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.
Github    
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1501

Le 20/04/2011 à 10h18
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... :oups


MSX un jour, MSX toujours ! :D
Site web    
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 20/04/2011 à 10h45
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
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 20/04/2011 à 11h28
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... :oups




Ç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.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 20/04/2011 à 14h21
J'ai recopié le code ASM depuis BlueMSX.

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) 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... :oups Edité par aoineko Le 20/04/2011 à 14h40


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 20/04/2011 à 14h48
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.

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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 20/04/2011 à 15h45
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 ? :hum Edité par aoineko Le 20/04/2011 à 23h51


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

Le 21/04/2011 à 01h23
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 ? :hum


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 21/04/2011 à 05h30
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 :

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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 21/04/2011 à 15h45
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. :hum

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.
Github    
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 21/04/2011 à 16h03
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. :hum


Ç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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 21/04/2011 à 16h12
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. :hum Edité par aoineko Le 21/04/2011 à 16h33


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10338

Le 21/04/2011 à 16h37
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


:noel
Site web    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie