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 , tete 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: 941
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 - 01 - Fonctionnement Fdc (SOS Programmeurs)
» Coding » Fdc - 10 - Affichages Causes d'Interruptions Secondaires du Fdc (SOS Programmeurs)
» Coding » Fdc - 25 - Formatage et Ecriture Piste (SOS Programmeurs)
» Coding » Fdc - 12 - la Routine d'Ecriture de Secteurs (SOS Programmeurs)
» Coding » Fdc - 03 - Commandes du Fdc (SOS Programmeurs)
» Coding » FDC - 23 - Etude de la Piste (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.7-desktop/c
Page créée en 224 millisecondes et consultée 1656 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.