CODING ★ FDC - FORMATAGE ET ECRITURE DE LA PISTE ★

Fdc - 25 - Formatage et Ecriture Piste (SOS Programmeurs)

    ; Cette courte routine se passe fort bien de préambule .

-------------------  

;
;- Stocker une piste complete . Si buffer plein retour avec NC -
 ;
 FORMATER LD HL,TFORMATE  ;Afficher texte formatage
  CALL PRT
 ;
  LD HL,(POINPIS)  ;Prendre le pointeur
  INC HL
  LD A,(HL)     ;et recuperer FLAGFNC
  LD (FLAGFNC),A
  INC HL
  LD (POINPIS),HL  ;Pointe sur piste suivante si pas formatee
 ;
  ;BIT 3,A
  JP NZ,DEFORMA    ;Piste origine pas formatee , deformater piste
 ;
  INC A      ;Inutilise dans cette version
  RET Z      ;Piste en attente
 ;
;- Piste formatee . Reprendre parametres piste et remettre dans programme -
 ;
GOFORM  LD E,(HL)  ;Recupere longueur de secteur
  INC HL
  LD D,(HL)
  LD (LONGSEC),DE
  INC HL
 ;
  LD DE,LENSEC ;Recuperer LENSEC - NBSEC - GAPFORM - OCREMP
  LD BC,4
  LDIR
 ;
  LD A,(NBSEC)
  LD C,A
  LD B,0
  PUSH BC
  ;SLA C     ;C = C*4
  ;SLA C
  LD DE,IDOUTDRA  ;Recuperer les IDS et les stocker dans la liste
  LDIR      ;de sortie
  POP BC
 ;
  PUSH BC
  LD DE,LISTERR ;Et la liste des etats d'erreur
  LDIR
  POP BC
 ;
  LD (POINPIS),HL ;Stopper pointeur sur 1ers octets adresse buffer
 ;
;- Formater -
 ;
 WAITDIS LD HL,IDOUTDRA
  CALL FORMATE ;La piste est formatee par la routine FORMATE
  LD DE,#0213  ;Locate pour erreur drive
  CALL TSMISPROT  ;Voir si erreur drive . NC si oui
  JR NC,WAITDIS ;Attendre que drive ready
  ;SCF    ;Marquer format effectue
  RET    ;Fini
 ;
;- Deformater -
 ;
 DEFORMA LD HL,TDEFORM ;Texte deformatage
  CALL PRT
  LD A,1    ;Un seul secteur
  LD (NBSEC),A
  LD A,6    ;De taille 6
  LD (LENSEC),A
 ;
 WAITDIS1 LD HL,TABDEFOR ;Avec des IDS bidons suffit a deformater une piste
  CALL FORMATE
  LD DE,#0213  ;Locate pour erreur drive
  CALL TSMISPROT  ;Voir si erreur drive . NC si oui
  JR NC,WAITDIS1
  XOR A     ;Enlever CARRY pour signaler deformatage
  RET
 ;
 TABDEFOR DB #FF,#FF,#FF,6
 TFORMATE DB 31,2,20,24," FORMATAGE  PISTE ",24,#80
 TDEFORM  DB 31,2,20,24," DEFORMATE  PISTE ",24,#80
;

----------------------
— ECRITURE DE LA PISTE -
----------------------

   C'est exactement l'inverse de  la  routine  de  stockage .
 

;
;- Ecrire une piste complete  -
 ;
 ECRIRE  LD HL,TECRIPI ;Textes ecriture
  CALL PRT
  LD HL,TGAPRW ;GAP RW
  CALL PRT
  LD A,(GAPRW)
  CALL PRTHEX1
  LD HL,TSECTS ;et secteurs
  CALL PRT
 ;
  LD HL,(POINPIS) ;Recuperer le debut de la zone des adresses
  PUSH HL   ;de stockage et mettre dans IX
  POP IX
 ;
  LD HL,LISTERR ;Etats d'erreur
  LD (POINTER),HL
  LD HL,IDOUTDRA  ;Et IDS a ecrire
  LD (POINTID),HL
 ;
;- Routine ecriture physique -
 ;
  XOR A     ;Compteur à 0
  LD (COUNT),A
  LD A,(NBSEC)
  LD B,A
 ;
 BCLWRIP PUSH BC
  LD HL,(POINTID) ;Passer les 4IDS au programme y compris la piste .
  CALL IDTRANS4
  LD A,(QUATRID+2) ;Les secteurs sont ecrits un a un , le dernier
  LD (DERSEC),A ;secteur a ecrire est donc le meme
  LD (POINTID),HL  ;Pointer la suite des IDS
 ;
  LD L,(IX+0)  ;Adresse de deépart ecriture
  LD H,(IX+1)
  LD (ADBUFF),HL  ;Dans ADBUFF
 ;
  LD HL,(POINTER)
  LD A,(HL)    ;Marque secteur ecrase ?
  CP #7F    ;Oui . Ce secteur a ete detruit par l'ecriture
  JP Z,CRUNCHE ;precedente . Sauter SANS AVANCER LE COMPTEUR .
 ;
  CP #FF     ;Voir si le secteur a ete stocke sous forme compactee
  LD B,#45   ;Si oui ecrire en repetant OCREMP par routine speciale
  JR Z,NOCMCOMP ;Sans CM
  CP #F7     ;Avec CM
  JR NZ,PACOMPAC ;Octet a subi un XOR #FF si compacte d'ou #FF & #F7 !
 ;
  LD B,#49
 NOCMCOMP LD A,B     ;Ecrire avec la routine speciale qui transemet
  LD HL,WRITFDC2 ;toujours le même octet .
  CALL SETCOM2
  JR ECRIR1   ;Aller ecrire
 ;
 PACOMPAC LD A,(QUATRID+3) ;Voir si taille 0
  OR A
  JR NZ,PASTZER ;Non
 ;
  LD HL,(POINTER) ;N'ecrire taille 0 que si MAM ou DAM
  LD A,(HL)
  AND %00000011 ;MAM - DAM ?
  JP Z,RIENECRI ;NON
 ;
  LD B,#45
  JR CMNOT1    ;Sinon ecrire n'importe quoi pour reproduire MAM
 ;
 PASTZER LD A,(FLAGFNC) ;Si piste a reparer , ignorer ce qui suit et tenter
  AND %01000000  ;l'ecriture de toute maniere
  JR NZ,ECRIR2
 ;
  LD HL,(POINTER)
  LD A,(HL)
  AND %00110111  ;Si pas d'erreur PROVOQUEE sauf EP-HD-CM , c'est bon
  JP NZ,RIENECRI ;Sinon ne rien ecrire
 ;
 ECRIR2  LD B,#45     ;CM or not CM ?
  LD HL,(POINTER)
  LD A,(HL)
  AND %00001000
  JR Z,CMNOT1
  LD B,#49
 ;
 CMNOT1  LD A,B    ;Commande ecrire secteur
  LD HL,WRITFDC
  CALL SETCOM2
 ;
 ECRIR1  CALL VISINST ;Viser d'apres COUNT et executer instruction
 ;
  LD DE,#0213 ;Locate pour erreur drive
  CALL TSMISPROT ;Voir si erreur drive . NC si oui
  JR NC,ECRIR1 ;Boucler si FDC pas content
 ;
  CALL TSTERRS ;Tester etat d'erreur
 ;
  LD A,"&"     ;Afficher resultat d'ecriture
  CALL #BB5A
  LD A,(QUATRID+2)
  CALL PRTHEX1
  CALL INV
  CALL PRT3ERR
  CALL INV
 ;
 RIENECRI LD HL,COUNT ;Au suivant
  INC (HL)
 CRUNCHE LD HL,(POINTER)
  INC HL
  LD (POINTER),HL
  INC IX
  INC IX
  POP BC
  DEC B
  JP NZ,BCLWRIP ;S'il en reste
 ;
  LD L,(IX+0) ;Adresse de deépart prochaine ecriture
  LD H,(IX+1)
  LD (POINPIS),HL
  LD A,23
  CALL EFFLINE
  ;SCF
  RET
 ;
 TECRIPI DB 31,2,21,24," ECRITURE   PISTE ",24,18,#80
 TSECTS  DB 31,20,22,24," SECTEURS : ",24,32,18,#80
 TGAPRW  DB 31,2,22,24," GAP RW : ",24,32,"&",18,#80
;

-------------------------

 Voilà . C'est la fin de la grosse  tartine ! Reste à parcourir la section  routines pour y trouver les quelques modifications apportées par rapport à la  version précédente .

-------------------------

 --------------------------
— SUB ROUTINES POUR LE FDC -
--------------------------

 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 - 24 - Reproduction
★ 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 - 13 - Edition du Buffer (SOS Programmeurs)
» Coding » Fdc - 07 - Routines Annexe (SOS Programmeurs)
» Coding » Fdc - 24 - Reproduction (SOS Programmeurs)
» Coding » Fdc - 23 - Ecraser les Secteurs (SOS Programmeurs)
» Coding » Fdc - 10 - Affichages Causes d'Interruptions Secondaires du Fdc (SOS Programmeurs)
» Coding » Fdc - 08 - Test Interrupt (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 005 millisecondes et consultée 2515 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.