La Place des Développeurs Lire le contenu d'un fichier en ASM
aoineko
Membre non connecté
Conseiller Municipal
Je voudrais savoir comment peut t'on charger le contenu d'un fichier en mémoire en assembleur et sans le DOS.
J'avais trouvé un code (ce-dessous, mais il ne fonctionne pas ; besoin du DOS ?)
Y a peut-être un moyen en passant par un appel aux instructions Basic depuis l'ASM.
J'ai que la Page 0 qui contient du Basic (les pages 1-2 sont pour ma ROM et la 3 pour la RAM).
Une idée ? Edité par aoineko Le 15/04/2011 à 01h23
J'avais trouvé un code (ce-dessous, mais il ne fonctionne pas ; besoin du DOS ?)
Code ASM :
_last_error:: .ds 1 ; sur la pile : adresse du nom de fichier (4-5) et flag d'ouverture (6) à 1 pour read-only _open:: push ix ld ix,#0 add ix,sp ; path ld e,4(ix) ld d,5(ix) ; flags ld a,6(ix) ; call ld c,#0x43 call 5 ; check error ld (_last_error),a add a,#0 jp z,_open_ok ld l,#-1 jp _open_end _open_ok: ld l,b _open_end: pop ix ret ; sur la pile : le handle du fichier (4), l'adresse de la RAM pour recevoir les datas (5-6), et la taille à copier (7-8) _read:: push ix ld ix,#0 add ix,sp ; handle ld b,4(ix) ; buffer ld e,5(ix) ld d,6(ix) ; bytes ld l,7(ix) ld h,8(ix) ; call ld c,#0x48 call 5 ; return ld (_last_error),a add a,#0 jp z,_read_end ld h,#-1 ld l,#-1 _read_end: pop ix ret
Y a peut-être un moyen en passant par un appel aux instructions Basic depuis l'ASM.
J'ai que la Page 0 qui contient du Basic (les pages 1-2 sont pour ma ROM et la 3 pour la RAM).
Une idée ? Edité par aoineko Le 15/04/2011 à 01h23
On est toujours ignorant avant de savoir.
BLTMD en BIOS (et non en DOS). Vois Pratique du MSX2 en page 95.
Sinon il faut que tu te dégottes un exemplaire lisible du livre du disque MSX de M. Devos, tu devrais trouver ton bonheur dedans
Sinon il faut que tu te dégottes un exemplaire lisible du livre du disque MSX de M. Devos, tu devrais trouver ton bonheur dedans
MSX un jour, MSX toujours !
aoineko
Membre non connecté
Conseiller Municipal
granced :
BLTMD en BIOS (et non en DOS). Vois Pratique du MSX2 en page 95.
Sinon il faut que tu te dégottes un exemplaire lisible du livre du disque MSX de M. Devos, tu devrais trouver ton bonheur dedans
Sinon il faut que tu te dégottes un exemplaire lisible du livre du disque MSX de M. Devos, tu devrais trouver ton bonheur dedans
Je pensai pourtant avoir bien cherché...
En tout cas, ça a l'air parfait ; y a même la copy direct en VRAM !
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Bon, j'y arrive pas.
J'ai bien mis mon image dans une disquette avec un header contenant la largeur et la hauteur sur 2 octets chacun.
Ensuite, j'essaye de charger l'image vers la VRAM en 0,0 (l'image doit recouvrir toute l'écran) via BLTVD, mais ça crash.
Je crois qu'on peux tester le chargement d'une image en Basic avec un bload et des arguments particuliers ; si qq peut me filer la ligne à écrire (pour screen 8 + load fichier vers VRAM), ça me permettrait déjà de vérifier que mes datas sont ok. Edité par aoineko Le 16/04/2011 à 00h39
J'ai bien mis mon image dans une disquette avec un header contenant la largeur et la hauteur sur 2 octets chacun.
Ensuite, j'essaye de charger l'image vers la VRAM en 0,0 (l'image doit recouvrir toute l'écran) via BLTVD, mais ça crash.
Je crois qu'on peux tester le chargement d'une image en Basic avec un bload et des arguments particuliers ; si qq peut me filer la ligne à écrire (pour screen 8 + load fichier vers VRAM), ça me permettrait déjà de vérifier que mes datas sont ok. Edité par aoineko Le 16/04/2011 à 00h39
On est toujours ignorant avant de savoir.
aoineko :
Je voudrais savoir comment peut t'on charger le contenu d'un fichier en mémoire en assembleur et sans le DOS.
J'avais trouvé un code (ce-dessous, mais il ne fonctionne pas ; besoin du DOS ?)
J'avais trouvé un code (ce-dessous, mais il ne fonctionne pas ; besoin du DOS ?)
Pour pouvoir charger un fichier, il faut que la ROM DISK soit initialisée au démarrage. Donc il faut que lorsque ta ROM est appelée pendant l'initialisation du MSX écrire dans le Hook (0FEDAH) les données nécessaires pour faire un retour à ta ROM en fin d'initialisation puis laisser continuer l'initialisation avec simple RET. Après tu pourras utiliser les routines du disque comme avec le DOS à l'adresse 0F37Dh (au lieu de 0005h).
Voici un exemple pour faire ça :
Header : 41 42 10 40
Code :
Edité par
GDX
Le 16/04/2011 à 11h50
04010h:
DI
CALL #0138
RRCA
RRCA
AND #03
LD C,A
LD B,0
LD HL,#FCC1
ADD HL,BC
OR (HL)
LD C,A
INC HL
INC HL
INC HL
INC HL
LD A, (HL)
OR C
LD (mem-slot),A ; résultat à mettre en mémoire si besoin
DI
LD H,A
LD L,0F7H
LD (#FEDA),HL
LD HL,#4030 ; adresse de départ de ton programme en ROM
LD (#FEDC),HL
RET
aoineko
Membre non connecté
Conseiller Municipal
Quand je fais une recherche MSX ROM DISK sur Google, je tombe que sur des sites warez.
Vous avez une doc décrivant ce qu'est la ROM DISK ?
Vous avez une doc décrivant ce qu'est la ROM DISK ?
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Oula... j'suis complétement perdu.
Pourquoi y aurait besoin de gérer les slots ? Les instructions de copie de fichiers ne se trouve pas dans la Page 0 (que j'ai laissé sur le Slot 0) ?
En 2 mots, tu peux m'expliquer ce qu'est la ROM DISK ? Une ROM contenant les instructions d'I/O ? Elle n'est pas accessible par défaut ?
Sinon, y a pas moyen de s'en sortir avec le BLTMD du BIOS comme le proposait Granced ?
Je cherche "juste" le moyen le plus simple de copier le contenu d'un fichier vers la VRAM (BLTVD) en ASM sur MSX2.
EDIT : Pour les docs en japonais, le premier liste les fonctions utilisables avec le CALL 5h/F37Dh mais ne décrit pas comment initialiser le système.
EDIT 2 : J'ai vu qu'avec bmp2msx, quand on converti une image, il ajoute 7 octets d'entête nécessaire pour pouvoir charger l'image via un [ bload"image.ext",s ] ; ou trouver le signification de cet entête ? (j'ai vu qu'il y avait la hauteur/largueur, mais pour le reste...) Edité par aoineko Le 16/04/2011 à 14h27
Pourquoi y aurait besoin de gérer les slots ? Les instructions de copie de fichiers ne se trouve pas dans la Page 0 (que j'ai laissé sur le Slot 0) ?
En 2 mots, tu peux m'expliquer ce qu'est la ROM DISK ? Une ROM contenant les instructions d'I/O ? Elle n'est pas accessible par défaut ?
Sinon, y a pas moyen de s'en sortir avec le BLTMD du BIOS comme le proposait Granced ?
Je cherche "juste" le moyen le plus simple de copier le contenu d'un fichier vers la VRAM (BLTVD) en ASM sur MSX2.
EDIT : Pour les docs en japonais, le premier liste les fonctions utilisables avec le CALL 5h/F37Dh mais ne décrit pas comment initialiser le système.
EDIT 2 : J'ai vu qu'avec bmp2msx, quand on converti une image, il ajoute 7 octets d'entête nécessaire pour pouvoir charger l'image via un [ bload"image.ext",s ] ; ou trouver le signification de cet entête ? (j'ai vu qu'il y avait la hauteur/largueur, mais pour le reste...) Edité par aoineko Le 16/04/2011 à 14h27
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
J'ai trouvé la signification des 7 octets des fichiers généré par BMP2MSX ; c'est en fait l'entête de tout fichier binaire.
Par contre, pour BLTVD, j'ai trouvé ça :
Du coup, je suppose qu'il faut mettre 4 octets comme entête de mon fichier avec la taille de l'image en X et Y. Mais même avec ça, le BLTVD ne marche toujours pas. Il faut d'autre info dans l'entête ? Y a des init à faire avant de pouvoir utiliser cette fonction ?
Par contre, pour BLTVD, j'ai trouvé ça :
Code TEXT :
BLTVD Address : #019D Function : Copy Diskfile to VRAM Input : SX -Address of filenaam. SX, SY, ARG, L_OP. NX and NY must be in diskfile Registers: All
Du coup, je suppose qu'il faut mettre 4 octets comme entête de mon fichier avec la taille de l'image en X et Y. Mais même avec ça, le BLTVD ne marche toujours pas. Il faut d'autre info dans l'entête ? Y a des init à faire avant de pouvoir utiliser cette fonction ?
On est toujours ignorant avant de savoir.
Extrait du MSX2 Technical Handbook :
Code TEXT :
The filename should be set first to use the disk (specify the filename as BASIC). The following is an example: . . . LDHL,FNAME; Get pointer to file name LD(FNPTR),HL; Set it to parameter area . . . FNAME:DB 22H,"B:TEST.PIC",22H,0 ; "TEST.PIC", end mark When an error occurs, control jumps to the error handler of the BASIC interpreter. Set the hook to handle the error in the user program or to call this routine from MSX-DOS or a ROM cartridge. This hook is H.ERRO (FFB1H). * BLTVD (019DH/SUB) Function:transfers from disk to VRAM Input:HL register <-- F562H The following parameters should be set: * FNPTR (F562H, 2)address of the filename * DUMMY (F564H, 2)dummy (not required to be set) * DX (F566H, 2) X-coordinate of the destination * DY (F568H, 2) Y-coordinate of the destination * NX (F56AH, 2) number of dots in the X direction (not required to be set; this is already in the top of data to be transferred) * NY (F56CH, 2) number of dots in the Y direction (not required to be set; this is already in the top of data to be transferred) * CDUMMY (F56EH, 1)dummy (not required to be set) * ARG (F56FH, 1)selects the direction and expansion RAM (same as VDP R#45) * LOGOP (F570H, 1)logical operation code (same as the logical operation code of VDP) Output:the CY flag is set when there is an error in the parameter Registers:all
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
aoineko
Membre non connecté
Conseiller Municipal
En fait, j'ai déjà lu cette doc ; c'est d'ailleurs la que j'ai vu -- si j'ai bien compris -- que la taille de la zone à copier devait se trouver directement dans les donner à transférer, c-à-d, le fichier (« NX: this is already in the top of data to be transferred »). Par contre, y a pas de détail sur le format que doivent prendre ces informations. J'ai donc mis 2 words (4 bytes) avec la taille X et Y de mon image, mais ça ne marche toujours pas.
Si j'ai bien compris, la Sub-ROM est une ROM dans la Page 0 du Slot 3-0 (toujours?) et dans laquelle se trouve l'instruction BLTVD. Par contre, j'ai pas bien compris si le changement de slot de la Page 0 se faisait automatiquement ou si on doit les gérer manuellement. Je sais pas non plus s'il faut des initialisations particulières pour pouvoir utiliser ces instructions. Enfin, je connais pas le format des données devant être inclu dans le fichier (NX et NY sur des words ? rien d'autre ?).
Si j'ai bien compris, la Sub-ROM est une ROM dans la Page 0 du Slot 3-0 (toujours?) et dans laquelle se trouve l'instruction BLTVD. Par contre, j'ai pas bien compris si le changement de slot de la Page 0 se faisait automatiquement ou si on doit les gérer manuellement. Je sais pas non plus s'il faut des initialisations particulières pour pouvoir utiliser ces instructions. Enfin, je connais pas le format des données devant être inclu dans le fichier (NX et NY sur des words ? rien d'autre ?).
On est toujours ignorant avant de savoir.
Essaie avec un fichier graphique sauvegardé par la commande BSAVE"****.***",S.
C'est le formatage standard de fichiers graphique sauvegardés en données brutes.
Si ça fonctionne, c'est que c'est le bon header (7 octets).
Sinon, il faut poursuivre les recherches ...
C'est le formatage standard de fichiers graphique sauvegardés en données brutes.
Si ça fonctionne, c'est que c'est le bon header (7 octets).
Sinon, il faut poursuivre les recherches ...
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
aoineko
Membre non connecté
Conseiller Municipal
Tu penses que les fichiers à charger avec BLTVD ont le même format que ceux chargé avec le BLOAD du Basic ? Si c'est le cas, je connais le format ; je vais tester.
On est toujours ignorant avant de savoir.
pour utliser les routines de la sub-rom il y a la routine CALSLT en 1CH
en entrée :
IX adresse a appeler
IY numéro du slot sous la forme F000SSPP
F flag 0 si si slot primaire , 1 si slot secondaire
SS numéro du slot secondaire (0-3)
PP numéro du slot primaire (0-3)
existe aussi sous MSX DOS
la page de la subrom est recopiée a l'adresse FAF8H car n'est pas systématiquement au même endroit suivant les machines
en entrée :
IX adresse a appeler
IY numéro du slot sous la forme F000SSPP
F flag 0 si si slot primaire , 1 si slot secondaire
SS numéro du slot secondaire (0-3)
PP numéro du slot primaire (0-3)
existe aussi sous MSX DOS
la page de la subrom est recopiée a l'adresse FAF8H car n'est pas systématiquement au même endroit suivant les machines
aoineko
Membre non connecté
Conseiller Municipal
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.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie