CODINGSDCC TUT'S PAR STEPHBB75 ★ Lire un fichier sur une disquette ★

Sdcc - 06 - Lire un FichierCoding Sdcc Tut's Par Stephbb75

Aller on va s'attaquer à la lecture sur la disquette. Une fonction qui lit un fichier binaire. On charge le contenue du fichier en mémoire.
Cette fonction ne peut pas lire un ficher ASCII, car celui ci n'a pas d'en-tête AMSDOS.
Cela peut paraitre simple à première vue, il suffi d'utiliser les fonctions système qui sont :
  • BC77 CAS IN OPEN ouverture d'un fichier d'entrée.
  • BC7A CAS IN CLOSE fermeture correcte d'un fichier d'entrée.
  • BC7D CAS IN ABANDON fermer immédiatement fichier d'entrée.
  • BC83 CAS IN DIRECT amener fichier entier dans la mémoire.
Je n'est pas mis toutes les fonctions existantes, seulement celle que l'on vas utiliser.
Donc la fonction vas être bien sur full assembleur, cela seras plus rapide et elles existent à foison sur le net...
Mais avant, il faut savoir qu'il faut initaliser la ROM 7 pour pouvoir utiliser les disquettes, ce qui est fait dans la fonction de lecture.
J'ai bien commenté de source, je pense que toutes les explication se trouve dedans.
A si, une chose, avec la dernière version de SDCC 3.2.0a (quand j'ai écris cette page SDCC en était à la version 3.2a) il faut ajouter une option de compilation, c'est "--oldralloc", sinon la gestion de la pile ne se fait plus de la même façon...

#include
#include

#define KM_WAIT_CHAR_s \
__asm \
call #0xBB06 \
__endasm

#define SCR_SET_MODE1_s \
__asm ld a,#1 \
call #0xBC0E \
__endasm;

// nom du fichier que l'on vas ouvrir, ne pas oublier le "0" à la fin !
const char FileName[13] = {'T','E','S','T','F','I','L','E','.','S','C','R',0};


// IL FAUT UTILISER "--oldralloc" POUR COMPILER !
// code retout :
// 0 Ok
// -1 Erreur
int ReadFileBin(char* filename, char* readbuffer)
{

__asm

; Initialisation de l amsdos (ROM 7) avant le changement d un fichier
ld hl,(#0xBE7D) ; adresse de la zone réservée AMSDOS
ld a,(hl) ; drive
push hl
push af
ld de,#0x40 ;DE-HL contient la plage dans laquelle la ROM doit être recherchée
ld hl,#0xABFF
ld c,#7 ;contient l'adresse de sélection de ROM à tester
call #0xBCCE ;initialisation d'une ROM de second plan
pop af
pop hl
ld (hl),a ; on remet le drive courant

; récupere le parametre char* filename
LD L, 4(IX)
LD H, 5(IX)
;LD B, 8(IX)

; calcule la longeur du nom de fichier
call getfilenamesize

; B = longueur du nom de fichier en caractères
; HL = l adresse de début du nom de fichier

;; DE = l adresse d'un tampon 2k
;; En mode disque: cette mémoire tampon n'est pas utilisé lorsque Fonction firmware
;; CAS EN DIRECT est utilisé, il est donc prudent de le mettre nulle (0)
;; Vous le souhaitez.
ld de,#0

;; fonction du firmware pour ouvrir un fichier en lecture
call #0xbc77

;; cas_in_open retour:
;; si le fichier a été ouvert avec succès:
;; - carry est vrais
;; - HL contient l adresse de l en-tête du fichier s AMSDOS
;; - DE contient l adresse de chargement du fichier (à partir de l en-tête)
;; - BC contient la longueur du fichier (à partir de l en-tete du fichier)
;; - A contient le type de fichier (2 pour les fichiers binaires)
; si une erreur on sort le la fonction
JR NC,ERRDRIV
JR Z,ERRDRIV

;; fonction du firmware pour charger le fichier en entier
;; cela fonctionne avec les fichiers qui ont un en-tête AMSDOS (les
;; fichiers ASCII n'ont pas un en-tête)

; récupere le parametres char* readbuffer
LD L, 6(IX)
LD H, 7(IX)

;; Lecture du fichier
call #0xbc83

;; fonction du firmware pour fermer un fichier ouvert en lecture
call #0xbc7a

jp asmFin

ERRDRIV:
;LD (FLGERR),A ;Sort ici si erreur drive
CALL #0xBC7D
; il y a une erreur, on retourne cette erreur....
; enfin pour le moment juste la valeur -1
ld hl,#0xFFFF
pop ix
ret

; Calcule la longeur du nom de fichier.
getfilenamesize:
push de
push hl
ld e,#0
getfilenamesizeloop:
ld a, (hl)
or a
jp z, getfilenamesizeend
inc hl
inc e
jp getfilenamesizeloop
getfilenamesizeend:
pop hl
ld b, e
pop de
ret

asmFin:

__endasm;

return 0;
}

void main()
{
SCR_SET_MODE1_s

// ouvre le fichier "TESTFILE.SCR" qui est une images et la met en mémoire video (C000 = 49152)
ReadFileBin( (char*)FileName, 49152 );

printf("une touche pour finir");
KM_WAIT_CHAR_s;

}

Voila, comme d'hab, le tout se trouve dans se ZIP, bonne lecture ;-)

stephbb75

Page précédente : Sdcc - 05 - Ecrire du Text

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Sdcc - 21 - 3D - Face Plaine 2
» Coding » Sdcc - 09 - Cls Ultra Rapide
» Coding » Sdcc - 24 - Bezier
» Coding » Sdcc - 22 - Afficher uneImage
» Coding » Sdcc - 17 - 3D - Trace Points
» Coding » Sdcc - 14 - Animation Par Couleur
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 222 millisecondes et consultée 2071 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.