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 15/04/2011 à 01h21
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 ?)

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 ? :hum Edité par aoineko Le 15/04/2011 à 01h23


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 15/04/2011 à 07h51
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 ;)


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 15/04/2011 à 08h30
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 ;)




Je pensai pourtant avoir bien cherché... :gne



En tout cas, ça a l'air parfait ; y a même la copy direct en VRAM ! :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: 2699

Le 16/04/2011 à 00h37
Bon, j'y arrive pas. :moue

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

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 16/04/2011 à 08h41
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 ?)


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 :
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
Edité par GDX Le 16/04/2011 à 11h50
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 16/04/2011 à 10h29
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 ? :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 16/04/2011 à 12h22
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 ? :hum

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

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 16/04/2011 à 23h22
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 :
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.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 17/04/2011 à 21h20
Quelqu'un a une expérience d'utilisation de la commande BIOS BLTVD ? :hum


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 18/04/2011 à 13h22
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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 18/04/2011 à 20h28
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 ?). :hum


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

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1487

Le 19/04/2011 à 08h09
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 ...


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

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 19/04/2011 à 08h29
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. :top


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

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10337

Le 19/04/2011 à 14h04
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


:noel
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2699

Le 19/04/2011 à 14h39
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    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie