| ★ 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 ; |
| ![]() |
| Page précédente : Fdc - 25 - Formatage et Ecriture Piste |
|