Code : Tout sélectionner
LDS #$9fff ; potition of S stack
Modérateurs : Papy.G, fneck, Carl
Code : Tout sélectionner
LDS #$9fff ; potition of S stack
Code : Tout sélectionner
ORG $6200
LDS #$9FFF
LDA #$60
TFR A,DP
LDX >$001E
STX ,S
LDX #$6300
STX <$4F
LDA #$02
STA <$48
LDB #$02
STB <$4C
LDA #$04
LECT0
JSR $E82A
BCS LECT9
INC <$4F
INC <$4C
DECA
BNE LECT0
JMP $6300
LECT9
RTS
Code : Tout sélectionner
*****************************************************************************************************************
* Routine : LOAD_CURRENT_FILE
* Affiche la progress bar, en appelant "DRAW_PROGRESS_BAR"
* Active la bank associée avec le fichier
* Lit le fichier BIN stocké dans CURRENT_FILE et stocke les différentes parties aux adresses indiquée dans le BIN
*****************************************************************************************************************
* Variables
CURRENT_SIZE FCB $00,$00 * Variable pour stocker la taille courante des données à lire (sera décrémenté)
*****************************************************************************************************************
LOAD_CURRENT_FILE
PSHS D,X
BSR DRAW_PROGRESS_BAR * on avance d'un cran en affichant la progress bar
* 1- Ouverture du fichier
LDA #$00
STA $6049 * DK.DRV $6049 <- numéro du drive
LDA #$10
STA $624B * filmod $624B <- $10 (input) ou $40 (accès direct)
EXTRA_CALL #3 * ouverture !
* 2- Lecture du premier octet (le premier secteur du fichier) avec l'extramoniteur
EXTRA_CALL #5 * lecture !
** Un fichier BIN a la structure suivante, on a déjà lu le premier octet
** 00 [00 00] [00 00] [....data ...] [00 00] [00 00] [....data....] [00 00] [00 00]
** taille offset données taille offset données taille (trailer, taille zéro = fini)
* 3- Boucle de lecture d'une partie du fichier BIN
READ_PART
LDA $6178 * ? EOF ?
LBNE CLOSE_FILE
** 3a - lecture de la taille des data à charger, si la taille est égale à 0, on sort, c'est fini
JSR READ_BYTE * on lit l'indicateur de taille poids fort
LDA $6196 * on met la valeur dans A
JSR READ_BYTE * on lit l'indicateur de taille poids faible
LDB $6196 * on met la valeur dans B -> D contient donc la taille des données à lire
CMPD #$0000 *
LBEQ CLOSE_FILE * si la taille est égale à 0, on quitte
STD CURRENT_SIZE * sinon, on stocke la taille à lire dans la variable CURRENT_SIZE
** 3b- lecture de l'adresse d'implantation
JSR READ_BYTE * on lit l'indicateur de taille poids fort
LDA $6196 * on met la valeur dans A
JSR READ_BYTE * on lit l'indicateur de taille poids faible
LDB $6196 * on met la valeur dans B -> D contient donc l'adresse d'implantation en mémoire des données
TFR D,X * X pointe sur l'adresse d'implantation
** 3c - on lit l'octet suivant avant la boucle
JSR READ_BYTE
! ** 3d - Boucle sur tous les octets des DATA de cette partie, on les stocke à l'adresse d'implantation
LDA $6178 * ? EOF ?
BNE > * si pas egal à 0, on sort
LDA $6196 * sinon on lit l'octet
STA ,X+ * on le stocke à l'adresse souhaité et on incrémente l'adresse /!\ C'est le coeur de la copie
JSR READ_BYTE * on avance dans le buffer qui charge automatiquement les secteurs suivants.
LDY CURRENT_SIZE
LEAY -1,Y
STY CURRENT_SIZE
LBEQ READ_PART * on relance une nouvelle partie du fichier BIN (taille, adresse, data)
BRA <
! * Fin de boucle
CLOSE_FILE * 4 - fermer le fichier courant
EXTRA_CALL #6
PULS X,D,PC
*****************************************************************************************************************
*********************************************************************************************
* Routine : READ_BYTE
* Lecture d'un octet sur le fichier courant
*********************************************************************************************
FCBPTR EQU DOS_FCB * pointeur vers le FCB du dernier fichier ouvert
READ_BYTE
PSHS X,B
LDX #FCBPTR+$10 * Pointeur sur le FCB courant (+$10)
LDB $07,X * Si pas de donnée à lire dans le secteur ?
BNE EXIT * fin de la lecture
LDB $08,X * Si la fin du secteur
DECB * est atteinte,
BEQ READ_NEXT_SECTOR * charge un nouveau secteur
STB $08,X * Sauve le décompteur de données
LDB -$0B,X * Récupère l'offset sur la donnée courante
INC -$0B,X * Incrémente l'offset sur la donnée courante
ABX * Calcule le pointeur sur la donnée courante
LDB $0B,X * Lit la donnée courante
STB $6196 * On la met dans le registre adhoc
PULS B,X,PC * On sort (RTS)
READ_NEXT_SECTOR
LDB #$05 * Lit la donnée suivante (en chargeant le secteur suivant)
JSR EXTRAMONITEUR * par l'ExtraMoniteur
LDB $6178 * Si pas de secteur chargé,
BNE EXIT * fin de la lecture
PULS B,X,PC * On sort (RTS)
EXIT
* NO DATA
LDB #$FF * END_OF_FILE Flag
STB $6178 * Register for END_OF_FILE
PULS B,X,PC
Je fais cela dans certains de mes projets: le bootblock charge via les opérations sur les secteurs (bref trackload) un bootloader qui charge le fichier AUTO.BIN en lisant la FAT et le fichier via les fonctions du contrôleur. En plus, pour ceux qui ont fait de la programmation avancée, j’utilisé des continuations (cf méthode yield dans le code).Daniel a écrit : ↑16 août 2022 20:24 @fxrobin: Entre la solution "minidos" et la lecture directe de secteurs physiques, il y a encore une solution intermédiaire avec un programme assembleur faisant tout le travail : lecture du catalogue, recherche dans la FAT, lecture des secteurs, détermination des adresses de chargement et des tailles des fichiers, le tout en utilisant uniquement les fonctions standard du contrôleur de disquette. Beaucoup de jeux commerciaux sont chargés de cette façon. C'est à peine plus compliqué que d'utiliser EXTRAMON, ça évite de charger le DOS en BASIC 1.0, ça fonctionne avec tous les modèles d'ordinateur et c'est nettement plus rapide.