CODING ★ FDC - SUB ROUTINES POUR LE FDC ★

FDC - 26 - Sub Routines Pour le FDC (SOS Programmeurs)
Pour la dernière du FDC  ,  cette  section est reproduite intégralement .  Les parties collées à la marge n'ont pas subi de modification notables .

;
;- Routines completes FDC -
 ;
;- AFF.RESU. -
 ;
AFFRES1 LD IY,#2018
AFFRESU PUSH HL
  PUSH BC
  CALL LOCATE
  LD B,3
  LD HL,ET0
 BCLARES LD A,(HL)
  CALL PRTBIN
  INC HL
  DJNZ BCLARES
  LD B,4
 BCLARE1 LD A,"&"
  CALL #BB5A
  LD A,(HL)
  PUSH HL
  CALL PRTHEX1
  POP HL
  INC HL
  DJNZ BCLARE1
  POP BC
  POP HL
  RET
 ;
;- Moteur -
 ;
 MOTON   LD A,(FLAGMOT)
  CP 1
  RET Z
  LD A,1
  CALL MOTCOM
  LD A,(TEMPMOT) ;Mini 55
  JP TEMPAMS
 MOTCOM  LD (FLAGMOT),A
  LD BC,#FA7E
  OUT (C),A
  RET
 ;
 MOTOFF  XOR A
  JR MOTCOM
 ;
;- Tester les 2 drives -
 ;
 TST2DR  XOR A     ;REMANIE EN FONCTION DE LA NOUVELLE PRESENTATION
  LD (DRSELEC),A  ;MAIS PRINCIPE IDENTIQUE A VERSION PRECEDENTE
  LD (PISTSEL),A
  LD (PISTL),A
  LD (PISTW),A
 ;
 TST2DR1 CALL CALIBRE ;Aller piste 0
  CALL TSTDRIV ;Tester etat drive . A = ET3 au retour
  LD (ETDRA),A
  LD HL,#0D02 ;Locate pour texte etat
  CALL AFRESDR ;Tester etat et afficher
 ;
  LD A,1   ;Idem sur drive B
  LD (DRSELEC),A
 RECALI  CALL CALIBRE
  CP #80
  JR NZ,BALLUME
 ;
  LD HL,TJEVEUB  ;B doit etre allume
  CALL PRT
  CALL #BB06
  LD A,17     ;Effacer texte
  CALL #BB5A
  JR RECALI
 ;
 BALLUME CALL TSTDRIV
  LD (ETDRB),A
  LD HL,#2E02
 ;
;- Afficher etat drives -
 ;
AFRESDR PUSH AF     ;Preserver ET3
  CALL #BB75     ;Placer texte
  LD HL,TNOLECT
  POP AF      ;Recuperer ET3
  CP 1
  JR Z,DRHS   ;Lecteur HS
  ;BIT 5,A
  JR NZ,DREADY
 ;
  LD HL,TMISS    ;Disque manque
  JR DRHS
 ;
 DREADY  LD HL,TPROT
  ;BIT 6,A
  JR NZ,DRHS     ;Protege ecriture
 ;
  LD HL,TNOPROT  ;OK Ecriture
 DRHS JP PRT
 ;
 TJEVEUB DB 31,46,2,24," ALLUMER DRIVE B ! ",24,7,13+#80
 TNOLECT DB " Lecteur absent  ",#80
 TMISS   DB " Disque manquant ",#80
 TPROT   DB " Protege ecriture",#80
 TNOPROT DB " OK en ecriture  ",#80
 ;
 TSMISPROT CALL TSTMISS ;Tester disc missing ET write protected
  RET NC
  JP TSTPROT
 ;
 TSTMISS LD A,(ET0)   ;Tester 'Disc missing'
  AND %00001000
  ;SCF
  RET Z
 ;
  LD HL,TMISS
  JR STOPDRV
 ;
 TSTPROT LD A,(ET1)   ;Tester 'Write protected'
  AND %00000010
  ;SCF
  RET Z
 ;
  LD HL,TPROT
 ;
 STOPDRV PUSH HL    ;De doit contenir coordonnees locate
  EX DE,HL
  CALL #BB75
  CALL INV
  CALL SPACE
  LD A,(DRSELEC)
  ADD A,#41
    CALL #BB5A
  LD A,":"
  CALL #BB5A
  POP HL
 ;
  CALL PRT
  CALL SPACE
  CALL INV
  CALL SONNE
  CALL #BB06
  LD A,17
  CALL #BB5A
  XOR A
  RET
 ;
;- Aller en piste PISTSEL -
 ;
GOPISTE PUSH DE   ;QUELQUE PEU RETOUCHEE ET REMPLACE 'GOPIST1'
  LD A,(NBTENT)
  LD B,A
 BCLPIST CALL GOPISTN
  JR C,SURPIST
  DEC B
  JR Z,FINPIS1
  CALL CALIBRE
  JR BCLPIST
 ;
 SURPIST PUSH AF
  LD A,(PISTSEL)
  PUSH BC
  LD B,A
  LD A,(ET1)
  CP B
  POP BC
  JR Z,FINPIST
  POP AF
  DEC B
  JR NZ,BCLPIST
 FINPIST POP AF
 FINPIS1 POP DE
  RET
 ;
;- Initialisation des bits de FLAGERR selon interpretation resultat
 ;
 TSTERRS LD IY,FLAGERR ;RAZ Erreurs
  LD (IY+0),0
  LD A,(QUATRID+1) ;Test des erreurs
  OR A
  JR Z,OKHEAD
  SET 6,(IY+0)
 OKHEAD  LD HL,ET1  ;Sur ET1
  BIT 5,(HL)
  JR Z,NOERCRC
  SET 5,(IY+0)
 NOERCRC BIT 2,(HL)
  JR Z,OKDATA
  SET 4,(IY+0)
 OKDATA  BIT 0,(HL)
  JR Z,OKMA
  SET 1,(IY+0)
 OKMA INC HL ;Sur ET2
  BIT 6,(HL)
  JR Z,OKCM
  SET 3,(IY+0)
 OKCM BIT 5,(HL)
  JR Z,OKDD
  SET 2,(IY+0)
 OKDD BIT 0,(HL)
  JR Z,OKDA
  SET 0,(IY+0)
 OKDA LD A,(QUATRID)
  LD L,A
  LD A,(PISTSEL)
  SUB L
  RET Z
  SET 7,(IY+0)
  RET
 TEMPAMS PUSH AF   ; Temporisation de A*27 Ms
  LD A,12
  CALL TEMPMIL
  POP AF
  DEC A
  JR NZ,TEMPAMS
  LD A,15
  CALL TEMPMIL
  JR LITSTAT
 ;
  TEMPMIL PUSH AF
  LD A,#F6
 BCLTEMP DEC A
  JR NZ,BCLTEMP
  POP AF
  DEC A
  JR NZ,TEMPMIL
  RET
 ;
 RAZINTE CALL LITSTAT ;- Attendre que le FDC soit bien dispose -
  CP #80
  JR NZ,RAZINTE
  RET
 ;
 TSTDRIV CALL RAZINTE ;- Test drive -
  LD A,4
  CALL INSTRU1 ;Envoyer instruction & drive
  JP RESULT
 ;
 LITSTAT LD A,#08 ;Lire statuts FDC -
  CALL ENVOFDC
  JP RESULT
 ;
;- Tete sur la piste 0 -
 ;
 CALIBRE LD A,7    ;RESTRUCTURE DE MANIERE A TESTER UN EVENTUEL
  CALL INSTRU1 ;'DISC MISSING' LORS DE GOPISTE
  CALL TEMP1
  LD A,(ET1)
  OR A
  JR NZ,CALIBRE
  RET
 ;
GOPISTN LD A,#F   ;Aller en piste N
  CALL INSTRU  ;Envoyer instruction , drive et piste selectionnes
 TEMP1   LD A,(WAITPIS)
  CALL TEMPAMS
 ;
 RETTSDR DB 0   ;Ici un RET pour ne pas bloquer en entree de programme
  LD DE,#0213  ;si drive B absent ou sans disc (TSTDRIV)
  CALL TSTMISS
  JR NC,GOPISTN
  RET
 ;
 FORMATE PUSH DE ;- Formater -
  PUSH BC
  LD B,#4D
  CALL COMPCOM
  CALL INSTRU2
  LD A,(LENSEC) ;Env.Par.
  CALL ENVOFDC
  LD A,(NBSEC)
  CALL ENVOFDC
  LD A,(GAPFORM)
  CALL ENVOFDC
  LD A,(OCREMP)
  CALL ENVOFDC
  DI
  LD BC,#FB7E
  CALL WRITFDC1
  POP BC
  POP DE
  RET
 ;
 TSTDIDC DI
  PUSH BC    ;- Lire les IDS -
  LD B,#4A   ;Passer en double densite
  LD A,#A
  CALL INSTRU1  ;Lire les IDS en simple densite pour provoquer erreur
  CALL RESULT
  JR NC,RANGCOM ;Si erreur c'est bien DD et c'est fini
 ;
  DI
  LD B,#A;Si non passer en SD
  LD A,#4A   ;Et lire en DD pour erreur
  CALL INSTRU1  ;SD=Err.
  CALL RESULT
 ;
 RANGCOM DI
  LD A,B
  LD (COMMAND),A
  POP BC
SCF
  RET
 ;
 INSTRU  CALL ENVOFDC  ;- Envoyer au FDC drive , tête et piste -
  LD DE,(DRSELEC) ;E=Dr.D=P.
  LD A,(HEAD)
  OR E
  CALL ENVOFDC
  LD A,D
 HOP  JP ENVOFDC
 ;
 INSTRU2 LD A,(COMMAND) ;- Envoyer au FDC , commande , head , drive -
 INSTRU1 CALL ENVOFDC
  PUSH DE
  LD A,(HEAD)
  LD E,A
  LD A,(DRSELEC)
  OR E
  POP DE
  JR HOP
 ;
 INSTRU9 CALL COMPCO1 ;- Envoyer commande et 9 octets pour read write -
  CALL INSTRU2
  PUSH BC
  PUSH HL
  LD B,7
  LD HL,QUATRID
 NEXT9   LD A,(HL)
  CALL ENVOFDC
  INC HL
  DJNZ NEXT9
  DI
  LD BC,#FB7E
  POP HL    ;Reprendre adresse buffer variable pour LITFDC3
  PUSH HL
 CODEOPE CALL LITFDC  ;CALL VARIABLE
  POP HL
  POP BC
  RET
 ;
 ENVOFDC DI    ;Envoyer un octet au FDC
  PUSH BC
  LD BC,#FB7E
  PUSH AF
 WAITFDC IN A,(C)
  ADD A,A
  JR NC,WAITFDC
  ADD A,A
  JR NC,VEUTOCT
  POP AF
  POP BC
  EI
  RET
 ;
VEUTOCT POP AF
  INC C
  OUT (C),A
  DEC C
  LD A,5
 DIGERE  DEC A
  NOP
  JR NZ,DIGERE
  POP BC
  EI
  RET
 ;
 WRITFDC LD HL,(ADBUFF)  ;- Ecrire dans le FDC -
 WRITFDC1 LD DE,0
  JR TESTFDC
 BCLWRT  INC C
  LD A,(HL)
  OUT (C),A
  DEC C
  INC DE
  INC HL
 TESTFDC IN A,(C)
  JP P,TESTFDC
  AND #20
  JR NZ,BCLWRT
 OUTWRIT LD (NBLUS),DE
  JP RESULT
 ;
 WRITFDC2 LD DE,0     ;REPETER LE MEME OCTET EN ECRITURE
  LD HL,(ADBUFF)  ;HL n'est jamais incremente
  JR TESTFDC2
 BCLWRT1 INC C
  LD A,(HL)
  OUT (C),A
  DEC C
  INC DE
 TESTFDC2 IN A,(C)
  JP P,TESTFDC2
  AND #20
  JR NZ,BCLWRT1
  JR OUTWRIT
 ;
 LITFDC  LD DE,(NBALIRE)  ;- Lire et stocker le nombre d'octets donnes
  LD HL,(ADBUFF)
 LITFDC3 PUSH HL
  JR TSTFDC
 RETEST  LD A,D
  OR E
  JR Z,TSTFDC
  INC C
  INI
  DEC C
  INC B
  DEC DE
 TSTFDC  IN A,(C)
  JP P,TSTFDC
  AND #20
  JR NZ,RETEST
 EXILIT  POP DE
  AND A
  SBC HL,DE
  LD (NBLUS),HL
  JP RESULT
 ;
 LITFDCX PUSH HL
  JR TSTFDCX
 RETESTX INC C
  IN A,(C)
  DEC C
  INC HL
 TSTFDCX IN A,(C)
  JP P,TSTFDCX
  AND #20
  JR NZ,RETESTX
  JR EXILIT
 ;
 LITFDC2 LD HL,(LONGSEC) ;Lecture pour Chercher la vraie taille d'un secteur
  INC HL
 TSTFDC3 LD A,H
  OR L
  JR Z,TSTGAP
 TSTFDCA IN A,(C)
  JP P,TSTFDCA
  AND #20
  JP Z,RESULT
  INC C
  IN A,(C)
  DEC C
  DEC HL
  JR TSTFDC3
 ;
 TSTGAP  IN A,(C)
  JP P,TSTGAP
  LD HL,BUFGAPS
  LD DE,267
  JR LITFDC3
 ;
;------------------------
;- LITFDC4 Lire et stocker l'octet de remplissage et sauter -
;- LITFDC5 Compter les octets de remplissage jusqu'au CRC et sauter -
;- LITFDC6 Lire et compter le GAP -
;- LITFDC7 Attendre la fin de la lecture -
 ;
 LITFDC4 PUSH HL
  LD DE,-2    ;Longueur secteur a -3 pour 2 CRC
  JR TSTFDC4
 RETEST4 INC C
  IN A,(C)
  DEC C
  LD (OCREMP),A  ;Lire le 1er octet (remplissage) et stocker
  JR LITFDC5
 TSTFDC4 IN A,(C)
  JP P,TSTFDC4
  AND #20
  JR NZ,RETEST4
  JP RESULT   ;Securite
 ;
 LITFDC5 LD L,A   ;Memoriser valeur remplissage
  LD H,3   ;2 octets CRC a sauter et lire GAP
  JR TSTFDC5
 RETEST5 INC DE   ;Compter les octets de remplissage
  INC C    ;on aura ainsi la vraie longueur
  IN A,(C)
  DEC C
  CP L     ;Voir si on est arrive au 1er octet du CRC
  JR Z,TSTFDC5
  DEC H    ;Sauter CRC
  JR Z,LITFDC6
 TSTFDC5 IN A,(C)
  JP P,TSTFDC5
  AND #20
  JR NZ,RETEST5
  JP RESULT
 ;
 LITFDC6 LD (VALGAPF),A ;Ranger le GAP
  LD H,A   ;Memoriser le GAP
  LD L,1   ;Compteur pour longueur GAP
  JR TSTFDC6
 RETEST6 INC C
  IN A,(C)
  DEC C
  CP H
  JR NZ,LITFDC7
  INC L
 TSTFDC6 IN A,(C)
  JP P,TSTFDC6
  AND #20
  JR NZ,RETEST6
  JP RESULT
 ;
 LITFDC7 LD (LONGSEC),DE ;Ranger longueur
  LD A,L
  LD (GAPFORM),A  ;et GAP
  POP HL
;-------------------------
 LITFDC1 IN A,(C)     ;- Lire sans rien stocker -
  JP P,LITFDC1
  AND #20
  JP Z,RESULT
  INC C
  IN A,(C)
  DEC C
  JR LITFDC1
 ;
 RESULT  DI  ;- Resultat -
  PUSH BC
  LD BC,#FB7E
  PUSH HL
  PUSH DE
  LD D,0
  LD HL,ET0
  PUSH HL
 JEBOSSE IN A,(C)
 CP #C0
 JR C,JEBOSSE
 INC C
 IN A,(C)
 LD (HL),A
 INC HL
 INC D
 DEC C
 ;
 TEMPRES DEC A
  JR NZ,TEMPRES
  IN A,(C)
  AND #10
  JR NZ,JEBOSSE
  POP HL
  LD A,(HL)
  AND #C0
  DEC HL
  LD (HL),D
  POP DE
  POP HL
  POP BC
  LD A,(ET0)
  EI
  RET NZ
SCF
  RET
;
RESU1   LD BC,#FB7E ;LECTURE RESULTAT RAPIDE ET SANS DI POUR LITRE IDS
    LD HL,ET0
JEBOS1  IN A,(C)
    CP #C0
    JR C,JEBOS1
    INC C
    IN A,(C)
    LD (HL),A
    INC HL
    DEC C
    LD A,5
TEMPR1  DEC A
    JR NZ,TEMPR1
    IN A,(C)
    AND #10
    JR NZ,JEBOS1
    RET
 ;
;- Avancer d'une piste -
 ;
 INCPIST PUSH HL     ;Avancer d'une piste
  LD HL,DERPIST
  LD A,(PISTSEL)
  CP (HL)   ;P.Max.
  JR Z,PASINC
  INC A
  LD (PISTSEL),A
  LD A,1
  LD (WAITPIS),A
  ;SCF      ;Flag C si encore piste , NC si non
  POP HL
  RET
 PASINC  LD A,41
  LD (WAITPIS),A
    POP HL
  XOR A
  RET
 ;
;- Composer les commandes -
 ;
 COMPCO1 LD A,(COMMAN2)
  LD B,A
 COMPCOM LD A,(FLAGDEN)  ;Entree avec commande dans B
  LD C,A
  LD A,B    ;B=Octet commande
  AND C
  LD C,A    ;+Densite
  LD A,(FLAGMT)
  OR C      ;+Multitrack
  LD (COMMAND),A
  RET
 ;
 COMLIPI LD A,#42
 SETCOM2 LD (COMMAN2),A
  LD (CODEOPE+1),HL
  RET
 ;
;- Sub routines selection parametres lecture / ecriture -
 ;
 SETLECT LD A,(DRL)  ;Selection drive - head - piste lecture
  LD (DRSELEC),A
  LD A,(HDL)
  LD (HEAD),A
  LD A,(PISTL)
  LD (PISTSEL),A
  RET
 ;
 SETWRIT LD A,(DRW)  ;Selection drive - head - piste ecriture
  LD (DRSELEC),A
  LD A,(HDW)
  LD (HEAD),A
  LD A,(PISTW)
  LD (PISTSEL),A
  RET
 ;
;- Sub routines comparaisons -
 ;
 CPDRIVE LD A,(DRL)  ;Comparer drive source et destination
  LD B,A
  LD A,(DRW)
  CP B
  LD A,0
  RET Z
  INC A
  ;SCF
  RET
 ;
 CPPIST  LD A,(PISTL) ;Comparer pistes source/destination
  LD B,A
  LD A,(PISTW)
  CP B
  RET
 ;
 DIFLENL LD A,(LENSEC)  ;Comparer taille ID secteurs et vraie taille
  LD (VRAILEN),A
  LD B,A
  LD A,(QUATRID+3)
  CP B
  RET Z
  LD (LENSEC),A
  RET
VRAILEN DB 0
 ;
;- Verif.Valid pist. -
 ;
VERIPIS LD A,(PISTMAX)
  LD B,A
  LD A,(DERPIST)
  CP B     ;Fin > Maxi ?
  RET NC      ;Oui
  LD B,A
  LD A,(PREMPIS)
  INC B
  CP B     ;Deb.>Fin ?
  RET
 ;
 TSTNBSE LD A,(NBSEC) ;Tester nombre secteurs . NC si rate .
  OR A
  RET Z
  CP 33
  RET
 ;
 CALIGAP LD A,(LENSEC) ;Calibrer le GAP
  OR A
  LD HL,T0DD
  LD C,15
  JR Z,GAPVERI
 ;
  DEC A
  LD HL,T1DD
  LD C,12
  JR Z,GAPVERI
  DEC A
 ;
  LD HL,T2DD
  LD C,8
  JR Z,GAPVERI
  DEC A
  JR Z,GAPVERI
 ;
  LD HL,T3DD
  LD C,5
  DEC A
  RET NZ
 ;
;- Rectifier le GAP lu -
 ;
GAPVERI LD A,(NBSEC) ;Nombre secteurs < nombre a probleme
  CP C
  RET C
 ;
 BCLGAPV CP C     ;Pointer GAP MAXI dans table
  JR Z,GAPVERI1
  INC HL
  INC C
  JR BCLGAPV
 ;
GAPVERI1 LD A,(GAPFORM);Voir si GAP hors limite
  LD B,A
  LD A,(HL)
  CP B
  RET NC
 ;
  LD (GAPFORM),A ;Rectifier si oui
  RET
 ;
 SETGRW  LD A,(GAPFORM)
  CP 1
  JR Z,SETGRW1
  ;SRL A
 SETGRW1 LD (GAPRW),A
  RET
 ;
 T0DD DB 239,210,185,163,144,126,110,96,83,71,59,50,38,31,24,17,10,3
 T1DD DB 216,171,134,102,74,49,16,8
 T2DD DB 230,129,50
 T3DD DB 191
 ;
;- Variables buffer
 ;
ADBUFF  DW 0 ;Adresse buffer
 ;
 EFFLB1  RET
AFFPIST RET
 TCOPDRV DS 100
;

Fin des programmes  commentés  FDC  .  Les  sections  comprenant les sous routines d'affichage , d'edition ,  etc  ...  Ainsi  que la section variables  n'ayant pas subi de modifications depuis le  numéro 2 ne sont pas reproduites  ici .

SOS Programmeurs n°4

★ ANNÉE: ???
★ AUTEUR: MICHEL MAIGROT

Page précédente : Fdc - 25 - Formatage et Ecriture Piste
★ AMSTRAD CPC ★ DOWNLOAD ★

Dump disquette:
» SOS  Programmeurs  4    FRENCHDATE: 2003-03-28
DL: 1187
TYPE: ZIP
SiZE: 128Ko
NOTE: 40 Cyls
.HFE: Χ

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

Lien(s):
» Coding » Fdc - 23 - Ecraser les Secteurs (SOS Programmeurs)
» Coding » Fdc - 02 - Transmission Fdc (SOS Programmeurs)
» Coding » Fdc - 11 - la Routine de Lecture Tous Secteurs (SOS Programmeurs)
» Coding » Fdc - 10 - Affichages Causes d'Interruptions Secondaires du Fdc (SOS Programmeurs)
» Coding » Fdc - 05 - Deplacement Tete (SOS Programmeurs)
» Coding » Fdc - 01 - Fonctionnement Fdc (SOS Programmeurs)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» 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.732-desktop/c
Page créée en 129 millisecondes et consultée 2296 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.