TRANSFERT DE FICHIERS ENTRE DES DISQUETTES A
FORMATAGE STANDARD OU SPECIAL (II)
Le programme proposé est une deuxième version de TRANSFIL, publié dans
CPC Infos no 36 de Septembre dernier. TRANSFIL V1.0 présentait le
facheux défaut de ne pas tourner sur 6128. Mea culpa! L'erreur est
réparée et les possesseurs de 6128 pourront enfin faire des transferts
entre des disquettes de formatages différents.
MISE EN OEUVRE
1) Tapez le programme TRANSFIL.BAS et sauvegardez-le au cas où vous ne
l'auriez pas encore fait. Il se distingue de celui publié en Septembre
uniquement par le changement de "TRANSFIL V1.0" en "TRANSFIL V2.0" en
ligne 500.
2) Remettez à zéro le CPC, puis tapez le programme CHARGEUR.BAS.
Ensuite sauvegardez-le, par prudence, avant de le lancer. Au bout
d'une vingtaine de secondes, si tout va bien, le fichier binaire
TRANSFIL.COD est sauvegardé. Désolé mais dans ce cas il faut en
retaper une bonne part. C'est identique à la version 1.0 jusqu'à la
ligne 1470 (30% de listings identiques).
3) Pour travailler vous n'avez plus besoin désormais que des fichiers
TRANSFIL.BAS et TRANSFIL.COD, sur une même face de disquette
naturellement.
PARTICULARITES DE TRANSFIL V2.0
TRANSFIL V2.0 est identique à son prédecesseur quant à son
fonctionnement. Les changements 'fondamentaux' sont la taille des
fichiers transférables (quoique...) et l'occupation mémoire.
_Buffer de transfert
Il est un peu plus petit que pour TRANSFIL V1.0. Néanmoins tous les
fichiers non-ASCII jusqu'à 42 KO seront transférables (42918 octets de
buffer). Les fichiers ASCII jusqu'à 40 KO le seront de même. Autant
dire que 99.99% des fichiers existant sur CPC seront transférables et
que la différence par rapport à la première version est infime.
_Occupation de la mémoire par TRANSFIL V2.0 (binaire)
* 0000 routine d'affichage d'un texte qui s'achève par un zéro
* 0006
* 0007 type du fichier en transfert
. 0008 sauts standards en RAM/ROM
. 002F
* 0030 TXT OUTPUT (copie du vecteur en BB5A)
* 0032
. 0033 RAM standard
. 003F
* 0040 programme principal de gestion des commandes, de transfert et
* 02FF d'effaçage avec les messages
0300 BUFFER I/O
AAA5
* AAA7 adresses pour FAR CALL des RSXs de lecture/écriture de secteur
* AAB5 recherche de piste, DIR et ERA
* AAB6 Pack des routines de TRANSFIL
* ABFB
. ABFC 4 octets requis par l'AMSDOS
. ABFF
. AC00 début de la RAM du DOS (RAMDOS)
.
* AD64 buffer pour les vecteurs cassette utilisé ici pour stocker les
* AD8A LOC,LEN,EXEC, nom et sa longueur de fichiers + chiffres Hexa
.
. B0FF fin de la RAMDOS
. B100 RAM nécessaire au système d'exploitation
. B8FF
. B900 VECTEURS du système d'exploitation, du BASIC, indirections
. BDF6 du système d'exploitation.
* BE00 DPB numéro 1 et DPB numéro 2
* BE31
* BE32 paramètres pour détermination des lecteur et user source et
* BE3F destination et pour le sens de copie
. BE40 RAM strictement réservée à l'AMSDOS (pas touche)
. BE7F
* BE80 texte du menu
* BF41
. BF42 RAM affectable par la pile
. BFFF
. C000 RAM vidéo
. FFFF
Par rapport à TRANSFIL V1.0, les zones de vecteurs n'ont pas été
recouvertes par des routines ou données. Le plantage sur 6128 (et 664
à coup sûr) venait de la présence en BDF4 d'une indirection liée à la
gestion du clavier, ce qui ne pardonnait pas de la remplacer par des
données.
CONCLUSION
Cette fois plus de problème, cela tourne! Puisse TRANSFIL rendre
bien des services avec l'aide de FORMAT+ et des quelques petits
programmes d'exploitation de formatage spécial présentés dans CPC
Infos de Juillet. Bons DATA+, DB1-198K, DB2-198K, etc...
NOTICE TEXTE n° 2 (9.09 Ko)
;*****************************
;* *
;* TRANSFIL V2.0 - transfert *
;* entre tous formats *
;* copyright Y. GOUR (c)1991 *
;* 06/91-10/91 *
;* *
;*****************************
;adresses de donnees
TYPE: EQU 0007H
RAMDOS: EQU 0AC00H
NOBLOC: EQU RAMDOS+0019H
DPBA: EQU RAMDOS+0190H
SPT: EQU 00H
BLM: EQU 03H
OFF: EQU 0DH
FSC: EQU 0FH
RPS: EQU 15H
PTRVAR: EQU 0AD64H
DESCRI: EQU 0AD66H
BUFFER: EQU 0AD69H
LOC: EQU 0AD75H
LEN: EQU 0AD77H
EXEC: EQU 0AD79H
HEXA: EQU 0AD7BH
LECUSR: EQU 0AB43H
RDSEC: EQU 0AAA7H
WRSEC: EQU 0AAAAH
SEEK: EQU 0AAADH
DIR: EQU 0AAB0H
ERA: EQU 0AAB3H
DPB1: EQU 0BE00H
DPB2: EQU 0BE19H
BANSUP: EQU 0BE32H
TXMENU: EQU 0BE80H
;adresses de routines
INPUT: EQU 0AB4BH
VERIFL: EQU 0AB8EH
STOPIO: EQU 0AB99H
OPENIN: EQU 0ABA3H
SETIN: EQU 0ABADH
SETOUT: EQU 0ABBFH
SWAP03: EQU 0AAB6H
SWAPWI: EQU 0AAB8H
WETKEY: EQU 0AABDH
AFFLU: EQU 0AAC9H
AFFLU2: EQU 0AACDH
GETLEC: EQU 0AAD2H
GETUSR: EQU 0AAD7H
SETLU: EQU 0AAE9H
CATDIR: EQU 0AB1FH
;valeurs et touches
LOMEM: EQU 0300H
HIMEM: EQU 0AAA5H
HAUT: EQU 0F0H
BAS: EQU 0F1H
GAUCHE: EQU 0F2H
DROITE: EQU 0F3H
TAB: EQU 09H
ENTER: EQU 0DH
ESC: EQU 0FCH
DEL: EQU 07FH
F1: EQU 31H
F2: EQU 32H
F4: EQU 34H
F5: EQU 35H
;**********************************
; TRANSFEREUR
ORG 0040H
LOAD 0040H
INSERE:DEFB 12,'Inserer DISC ',00
SOURCE:DEFB 'source ',00
DESTIN:DEFB 'destination ',00
LECTEU:DEFB 'dans le lecteur ',
AOUB: DEFB 00,', puis ',00
PRESSE:DEFB 'presser une touche:',10,00
NOMFIC:DEFB 'entrer le nom du fichier',00
DEFB ': ',10,13,00
EFFACE:DEFB ' a effacer:',10,13,0
MESESC:DEFB 10,13,' * Abandon *',00
LIT: DEFB 10,13,'lit...',00
ECRIT: DEFB 13,'ecrit...',00,00
EFFFIC:DEFB 10,13,'efface...',00
MENU7: CP F1
JR NZ,MENU8
;catalogue source
XOR A
LBL4: CALL CATDIR
PUSH BC
LD DE,LOMEM
CALL 0BC9BH
JR LBL6
MENU8: CP F2
JR NZ,MENU9
;catalogue dest.
LD A,01
JR LBL4
MENU9: CP F4
JR NZ,MENUA
;directory source
XOR A
LBL5: CALL CATDIR
PUSH BC
XOR A
RST 18H
DEFW DIR
LBL6: POP BC
CALL SWAPWI
JR TOUCHE
MENUA: CP F5
JR NZ,TOUCHE
;directory destination
LD A,01
JR LBL5
;affiche le Menu en fenetre 3
MENU: CALL SWAP03
LD HL,TXMENU
RST 00
CALL SWAP03
;attend frappe de touche
TOUCHE:CALL WETKEY
CP GAUCHE
JR NZ,MENU2
;change lecteur source
XOR A
;saisit lecteur
LBL1: CALL GETLEC
;commute lecteur
XOR 01
LD (HL),A
;ecrit lettre A/B
ADD A,41H
LBL7: LD (LECUSR+3),A
;ecrit position de lettre
INC HL
LD A,(HL)
LD (LECUSR+1),A
;remet a jour affichage
CALL AFFLU
JR TOUCHE
MENU2: CP DROITE
JR NZ,MENU3
;change lecteur dest.
LD A,01
JR LBL1
MENU3: CP HAUT
JR NZ,MENU4
;change user source
XOR A
;saisit user
LBL2: CALL GETUSR
;incremente user
INC A
AND 0FH
LD (HL),A
;prepare index BC pour affichage
LD B,00
LD C,A
EX DE,HL
;pointe caractere pour User
LD HL,HEXA
ADD HL,BC
LD A,(HL)
;restaure HL pour position de User
EX DE,HL
JR LBL7
MENU4: CP BAS
JR NZ,MENU5
;change user dest.
LD A,01
JR LBL2
MENU5: CP TAB
JR NZ,MENU6
;change sens de copie
LD HL,BANSUP+8
LD A,(HL)
XOR 80H
LD (HL),A
LD B,A
;ecrit position pour affichage
AND 7FH
LD (LECUSR+1),A
INC HL
;determine sens de la fleche
BIT 7,B
JR NZ,LBL3
INC HL
;recopie fleche pour affichage
LBL3: LD DE,LECUSR+3
LD BC,0004
LDIR
CALL AFFLU2
JR TOUCHE
MENU6: CP ENTER
JR Z,TRANS0
CP DEL
JP NZ,MENU7
;===========================
; EFFACEMENT DE FICHIER
;affiche message
DELETE:CALL SWAP03
CALL SETIN
LD HL,EFFACE
RST 00
;saisit nom de fichier
CALL INPUT
JR NC,FINCOP
;message d'effacage
LD HL,EFFFIC
RST 00
;efface fichier
LD A,01
LD IX,PTRVAR
RST 18H
DEFW ERA
FINCOP:CALL SWAP03
JP MENU
;==================================
; TRANSFERT DE FICHIER
;------------------------------------
;ferme par defaut tout fichier ouvert
TRANS0:CALL SWAP03
TRANSF:CALL 0BC7DH
CALL 0BC92H
;affiche message
CALL SETIN
RST 00
;saisit nom de fichier
CALL INPUT
JR NC,FINCOP
;-------------
;ouvre fichier
;message de lecture
LD HL,LIT
RST 00
LD DE,HIMEM-2048
CALL OPENIN
;si NC, laisse beton pour ce fichier
JR NC,TRANSF
;bifurque selon type de fichier
CP 04
JR C,BASBIN
;*-----------*
;fichier ASCII
;lit tous les octets
LD HL,LOMEM
LD DE,HIMEM-2048
ASCII2:CALL 0BC80H
JR NC,ASCII3
LD (HL),A
INC HL
;verifie si fichier pas trop long
CALL VERIFL
JR C,ASCII2
;trop long:abandon
XOR A
ASCII3:CP 1AH
;erreur imprevue: stop!
JP NZ,STOPIO
;stocke adr. du dernier octet
DEC HL
LD (LOC),HL
;ferme le fichier
CALL 0BC7AH
JP NC,STOPIO
;------------------
;sauvegarde fichier
LD HL,HIMEM-2048
CALL SETOUT
;envoie les octets un par un
LD HL,LOMEM
LD DE,(LOC)
ASCII4:LD A,(HL)
CALL 0BC95H
JP NC,STOPIO
INC HL
CALL VERIFL
JR C,ASCII4
;ferme le fichier
CALL 0BC8FH
JP NC,STOPIO
JR TRANSF
;*-------------------------------*
;stocke LOC/LEN/TYPE pour BAS/BIN
BASBIN:LD (LOC),DE
LD (LEN),BC
LD (TYPE),A
;fichier BASIC/BINAIRE pas trop long?
LD HL,LOMEM
ADD HL,BC
DEC HL
LD DE,HIMEM
CALL VERIFL
JP NC,TRANSF
;--------------
;charge fichier
LD HL,LOMEM
CALL 0BC83H
;abandon si NC
JP NC,STOPIO
;stocke adresse d'EXEC
LD (EXEC),HL
CALL 0BC7AH
;abandon si NC
JP NC,STOPIO
;-------------------------
;sauvegarde fichier
LD HL,LOMEM
CALL SETOUT
LD HL,LOMEM
LD DE,(LEN)
LD BC,(EXEC)
LD A,(TYPE)
CALL 0BC98H
JP NC,STOPIO
;ferme le fichier
CALL 0BC8FH
JP NC,STOPIO
;-------------------------------
;correction du header de fichier
;ouvre fichier pour lire 1er bloc
LD DE,LOMEM
CALL OPENIN
JP NC,STOPIO
;calcule adr. DBP (IX) selon lecteur
;IX=adr. DPB A par defaut
LD IX,DPBA
LD A,(RAMDOS)
CP 00
JR Z,DDA0
;IX=adr. DPB B
LD IX,DPBA+0040H
;releve no de bloc
DDA0: LD A,(NOBLOC)
LD B,A
;nb de records (128 octets) par bloc
LD A,(IX+BLM)
INC A
LD D,0
LD E,A
;nb records de 128 octets <=> NOBLOC
LD HL,0000
DDA1: ADD HL,DE
DJNZ DDA1
;1er record du bloc recherche
INC HL
;lit nb de records par piste
LD A,(IX+SPT)
LD E,A
XOR A
;compte nb de pistes ->NOBLOC
DDA2: SBC HL,DE
INC A
JR NC,DDA2
;rajoute DE pour calcul de no de secteur
ADD HL,DE
;stocke piste
DEC A
LD D,A
;ajoute decalage de piste
LD A,(IX+OFF)
ADD A,D
LD D,A
;lecture du Drive
LD A,(RAMDOS)
LD E,A
;nb de records par secteur
LD A,(IX+RPS)
LD C,A
;recupere reste de piste dans A
LD A,L
;calcule no logique de secteur (H)
DDA3: INC H
SUB C
JR NC,DDA3
;ajuste H
DEC H
;lit no physique du 1er secteur
LD A,(IX+FSC)
;stocke no de secteur du bloc vise
ADD A,H
LD C,A
;lit secteur du HEADER de fichier
LD HL,LOMEM
PUSH IX
PUSH BC
PUSH DE
PUSH HL
RST 18H
DEFW RDSEC
;ecrit vraie adr. de loc.
LD HL,(LOC)
LD (LOMEM+15H),HL
;calcule la CHECKSUM
LD HL,0000
POP DE
PUSH DE
LD B,43H
DDA4: PUSH BC
LD A,(DE)
LD B,00
LD C,A
ADD HL,BC
INC DE
POP BC
DJNZ DDA4
;ecrit la CHECKSUM
LD (LOMEM+43H),HL
;ecrit secteur HEADER modifie
POP HL
POP DE
POP BC
PUSH DE
RST 18H
DEFW WRSEC
;retour en premiere piste
POP DE
POP IX
LD A,(IX+OFF)
LD D,A
RST 18H
DEFW SEEK
JP TRANSF
END