.pl 72 .pn 18 .HE Manualul de interfata CP/M .fo # -------------------------------------------------------- | | | RUTINA 15 : Deschidere fisier | | (Open File) | | | | Intrari : | | registrul C : OFH | | registrele D&E : adresa FCB | | | | Iesiri : | | registrul A : cod "director" | | | -------------------------------------------------------- Efect: rutina realizeaza activarea unui fisier care se gaseste in "directorul" discului specificat prin octetul 00 din FCB si care apartine utilizatorului curent. Adresa FCB-ului fisierului de deschis este data prin registrele "D&E". Programul FDOS cauta in directorul discului specificat o intrare identica cu valoarea octetilor 1 - 12 din FCB. NOTA In FCB octetii 12 si 32 trebuie stersi cu zero de catre utilizator, inaintea apelului rutinei 15. Daca programul FDOS gaseste o astfel de intrare, atunci informa- tiile din "director" corespunzatoare ei sint copiate in octetii 1 - 31 din FCB, permitindu-se astfel accesul la fisier pentru operatii ulterioare de citire/scriere. Rutina intoarce in registrul "A" o valoare 0 - 3, daca operatia de eschidere s-a efectuat corect si o valoare egala cu 255 (OFFH), daca aceasta a esuat. Programatorul nu trebuie sa efectueze operatii asupra unui fisier decit dupa ce s-a realizat corect deschiderea sa. Exista posibilitatea ca in cadrul FCB-ului, in octetii 1 - 11 sa apara un specificator-multiplu de fisier, adica sa apara carac tere "?" (care inlocuiesc orice caracter in pozitia respectiva). In acest caz, programul FDOS cauta in "director" prima intrare care corespunde specificatorului-multiplu de fisier din FCB. Daca functia 13 se termina cu succes, programul FDOS va inlocui specificatorul-multiplu din FCB cu specificatorul-individual corespunzator fisierului gasit. .pa -------------------------------------------------------- | | | RUTINA 16 : Inchidere fisier | | (Close File) | | | | Intrari : | | registrul C : 10H | | registrele D&E : adresa FCB | | | | Iesiri : registrul A : cod "director" | | | -------------------------------------------------------- Efect: rutina realizeaza reversul rutinelor 15 (OPEN) si 22 (MAKE). Astfel, presupunind ca FCB-ul a carui adresa este speci ficata in registrele "D&E" a fost activat anterior printr-o rutina de "deschidere fisier" (rutina 15) sau de "creare fisier" (rutina 22), rutina de "inchidere fisier" inregistreaza FCB-ul curent in "directorul" discului specificat, actualizind astfel intrarea din "director" corespunzatoare fisierului respectiv. Rutina intoarce in registrul "A" o valoare egala cu 0 - 3 daca operatia de inchidere s-a desfasurat corect sau o valoare egala cu 255 (OFFH) daca numele fisierului din FCB nu a fost gasit in "director". Inchiderea fisierelor care au fost exploatate doar in citire este optionala. Numai fisierele in care s-au efectuat operatii de scriere trebuie inchise (pentru a actualiza in "director" informatiile referitoare la acele fisiere). Daca in FCB-ul fisierului de inchis apare un specificator multi- plu (i.e. caractere "?"), atunci rutina va efectua cautarea in "director" asa cum face rutina 15. .pa -------------------------------------------------------- | | | RUTINA 17 : Cauta in "director" prima intrare | | (Search for First) | | | | Intrari : | | registrul C : 11H | | registrele D&E : adresa FCB | | | | Iesiri : | | registrul A : cod "director" | | | -------------------------------------------------------- Efect: rutina cauta in "director" prima intrare care corespunde valorilor octetilor 0 - 12 din FCB-ul a carui adresa este data in registrele "D&E". Rutina intoarce in registrul "A" valoarea 255 (OFFH) daca nu a gasit o astfel de intrare sau o valoare cuprinsa intre 0 - 3 daca a gasit-o. Daca in "director" a fost gasita o intrare identica cu specificatorul-fisierului din FCB, atunci zona de memorie a carei adresa este "adresa DMA" va fi completata cu o inregistrare de "director" (128 octeti) si anume cu ccea inregistrare din "director" care contine intrarea respectiva. Adresa relativa a intrarii, in cadrul inregistrarii de "director", este egala cu (A) * 32 (i.e. continutul registrului "A" rotit spre stinga cu 5 biti sau "ADD A" de 5 ori). Pe baza acestei adrese relative, programele de aplicatii pot extrage din bufferul care contine inregistrarea de "director", informatiile necesare din intrarea gasita. Daca FCB-ul contine un specificator-multiplu (i.e. apar caractere "?" in pozitiile 1 - 12), atunci rutina intoarce PRIMA intrare din "director" care satisface specificatorul. Daca octetul 00 din FCB contine caracterul "?", atunci rutina intoarce automat prima intrare din "directorul" discului selectat (indiferent de numarul utilizatorului caruia ii apartine intrarea respectiva, indiferent de continutul acestei intrari si indiferent daca intrarea este stearsa sau nu). .pa -------------------------------------------------------- | | | RUTINA 18 : Cauta urmatoarea intrare | | (Search for Next) | | | | Intrari : | | registrul C : 12H | | | | Iesiri : registrul A : cod "director" | | | -------------------------------------------------------- Efecte: aceasta rutina este similara rutinei 17 cu exceptia faptului ca "directorul" discului specificat nu se investigheaza de la inceputul sau (ca in toate celelalte rutine), ci se cauta intrarea corespunzatoare FCB-ului incepind de la ultima intrare din "director" gasita. Rutina intoarce in registrul "A" (ca si rutina 17), valoarea 255 (OFFH), daca nu se mai gaseste in "director" nici o intrare identica cu FCB-ul specificat. -------------------------------------------------------- | | | RUTINA 19 : Stergere fisier | | (Delete File) | | | | Intrari : | | registrul C : 13H | | registrele D&E : adresa FCB | | | | Iesiri : | | registrul A : cod "director | | | -------------------------------------------------------- Efect: rutina realizeaza stergerea unuia sau mai multor fisiere, specificate prin FCB-ul a carui adresa este data in registrele "D&E". FCB-ul poate contine un specificator-individual de fisier sau un specificator-multiplu de fisier (pot apare caractere "?" in zona de nume sau de extensie a fisierului, dar nu si in zona pentru numele unitatii de disc pe care se gaseste fisierul - asa cum se putea in rutinele 17 si 18). Rutina intoarce in registrul "A" valoarea 255 (OFFH), daca fisie- rul/fisierele specificate in FCB nu au fost gasite, si o valoare 0 - 3, daca operatia de stergere s-a efectuat normal. .pa -------------------------------------------------------- | | | RUTINA 20 : Citire secventiala | | (Read Sequential) | | | | Intrari : | | registrul C : 14H | | registrele D&E : adresa FCB | | | | Iesiri : | | registrul A : octet de stare | | | -------------------------------------------------------- Efect: presupunind ca FCB-ul a carui adresa este specificata in registrele "D&E" a fost activat printr-o rutina de "deschidere fisier" (rutina 15) sau de "creare fisier" (rutina 22), rutina "citire secventiala" realizeaza citirea din fisier a urmatoarei inregistrari de 128 de octeti si transferarea ei in memorie, intr-o zona a carei adresa este "adresa DMA". Numarul inregis- trarii din cadrul "extensiei logice" curente este specificat prin octetul 32 din FCB. Dupa citire, valoarea acestui octet va fi automat incrementata cu 1. Daca valoarea rezultata in octetul 32 depaseste 127 (7FH) atunci urmatoarea "extensie logica" a fisie- rului este deschisa automat si octetul 32 ia valoarea OOH, fiind astfel pegatit pentru urmatoarea operatie de citire. Daca operatia de citire s-a efectuat normal, atunci registrul "A" va avea valoarea OOH; in caz contrar, adica atunci cind nu mai exista date in fisier (s-a atins sfirsitul fisierului!), regis- trul "A" va avea o valoare diferita de OOH. .pa -------------------------------------------------------- | | | RUTINA 21 : Scriere secventiala | | (Write Sequential) | | | | Intrari : | | registrul C : 15H | | registrele D&E : adresa FCB | | | | Iesiri : registrul A : octet de stare | | | -------------------------------------------------------- Efect: presupunind ca FCB-ul a carui adresa este epecificata in registrele "D&E" a fost activat printr-o operatie de "deschidere fisier" (rutina 15) sau "creare fisier" (rutina 22) anterioara, rutina "scriere secventiala" realizeaza scrierea in fisier a unei inregistrari de 128 de octeti. Inregistrarea de scris este luata din memorie, de la o adresa egala cu "adresa DMA" si este plasata in fisier in pozitia data de valoarea octetului 32 din FCB (numa- rul inregistrarii in cadrul "extensiei logice" curente). Dupa scrierea inregistrarii in fisier, continutul octetului 32 din FCB este automat incrementat cu 1. Daca in urma incrementarii rezul- ta o depasire (o valoare mai mare ca 127 (i.e. 7FH)), atunci este deschisa urmatoarea "extensie logica" a fisierului si octetul 32 din FCB este initializat cu OOH, in vederea unor operatii de scriere ulterioare. Operatia de "scriere secventiala" poate avea loc si in cadrul unor fisiere deja create corect, caz in care inregistrarile ce se scriu se vor suprapune peste cele existente, practic inlocuindu-le pe cele vechi. Rutina intoarce in registrul "A" valoarea OOH daca operatia de scriere a decurs normal sau o valoare diferita de OOH, daca operatia de scriere a esuat datorita lipsei de spatiu de disc. .pa -------------------------------------------------------- | | | RUTINA 22 : Creare fisier | | : (Make File) | | | | Intrari : | | registrul C : 16H | | registrele D&E : adresa FCB | | | | Iesiri : | | registrul A : cod "director" | | | -------------------------------------------------------- Efect: rutina are acelasi efect ca si rutina "deschidere fisier" (rutina 15), cu exceptia faptului ca, in acest caz, FCB-ul trebuie sa contina numele unui fisier care nu exista in "directorul" discului specificat. Programul FDOS creaza intrarea din "director" corespunzatoare FCB-ului si initializeaza atit FCB-ul cit si "directorul" discului, fortind lungimea fisierului pe 0. NOTA Programatorul trebuie sa evite duplecarea numelor fisierelor in "director", respectiv trebuie sa se asigure ca in "director" nu exista un alt fisier cu nume identic cu cel al fisierului de creat. In acest scop, este indicat ca el sa efectueze anterior rutinei 22 o operatie de "stergere fisier" (rutina 19). Rutina 22 intoarce in registrul "A" o valoare 0 - 3 daca operatia s-a desfasurat normal sau o valoare 255 (OFFH) daca nu mai exista spatiu in "directorul" discului. Rutina 22 are ca efect secundar si activarea FCB-ului, astfel incit nu mai este necesara o operatie ulterioara de "deschidere fisier". .pa -------------------------------------------------------- | | | RUTINA 23 : Schimbare nume fisier | | (Rename File) | | | | Intrari : | | registrul C : 17H | | registrele D&E : adresa FCB | | | | Iesiri : | | registrul A : cod "director" | | | -------------------------------------------------------- Efect: rutina realizeaza schimbarea numelui unui fisier. Rutina utilizeaza FCB-ul adresat prin registrele "D&E astfel: - primii 16 octetii din FCB reprezinta numele vechi al fisierului; - ultimii 16 octeti din FCB reprezinta numele nou al fisierului; - octetul 00 din FCB reprezinta codul unitatii pe care se gaseste fisierul de redenumit (octetul 16 din FCB este considerat OOH). Rutina intoarce in registrul "A" o valoare 0 - 3 daca operatia s-a desfasurat normal sau valoarea 255 (OFFH) daca nu s-a gasit in "directorul" discului specificat un fisier cu nume identic cu cel al fisierului de redenumit. -------------------------------------------------------- | | | RUTINA 24 : Citire vector unitati disc active | | (Return Log-in Vector) | | | | Intrari : | | registrul C : 18H | | | | Iesiri : | | registrele H&L : vectorul unitatilor | | disc active | | | -------------------------------------------------------- Efect: rutina analizeaza care din unitatile de disc A - P, este "activa", respectiv care din aceste unitati a fost activata: - explicit printr-o rutina de "selectare disc" (rutina 14); - implicit printr-o operatie de deschidere/creare fisier (cu valoare diferita de OOH in octetul 00 din FCB). Pentru unitatile de disc active, rutina intoarce o valoare logica "1", iar pentru cele care nu sint active o valoare logica "0". Bitul BO din registrul "L" reprezinta starea unitatii "A", iar bitul B7 din registrul "H" reprezinta starea unitatii "P". Astfel, prin registrele "H&L" (respectiv B&A) rutina intoarce un vector ce indica starea tuturor unitatilor A - P. -------------------------------------------------------- | | | RUTINA 25 : Citire numar disc selectat | | (Return Current Disk) | | | | Intrari : | | registrul C : 19H | | | | Iesiri : | | registrul A : numarul discului | | selectat | | | -------------------------------------------------------- Efect: rutina intoarce in registrul "A" numarul "discului selec- tat". Acest numar este cuprins intre OOH pentru unitatea "A" si OFH pentru unitatea "P". -------------------------------------------------------- | | | RUTINA 26 : Modificare "adresa DMA" | | (Set DMA Adress) | | | | Intrari : | | registrul C : 1AH | | registrele D&E : adresa DMA | | | -------------------------------------------------------- Efect: rutina permite modificarea "adresei DMA", adica a adresei bufferului de 128 octeti folositi in operatiile de citire/scriere fisiere. In general, "adresa DMA" stabilita la initializarea CP/M, la reinitializarea CP/M precum si dupa o operatie de "initializare stare sistem discuri" (rutina 13), este adresa 0080H. Rutina permite comutarea acestei adrese pe orice alta adresa (data in registrele "D&E"), permitind astfel localizarea bufferului de 128 de octeti in orice zona de memorie. Rutina stabileste "adresa DMA" ca fiind egala cu adresa specifi cata in registrele "D&E". Noua valoare pentru "adresa DMA" este valabila pina la: - o initializare sau reinitializare a sistemului CP/M; - un alt apel al rutinei 26; - o operatie de "initializare stare sistem discuri" (rutina 13). .pa -------------------------------------------------------- | | | RUTINA 27 : Citire adresa vector de alocare | | (Get Alloc Addr) | | | | Intrari : | | registrul C : 1BH | | | | Iesiri : | | registrul H&L : adresa vector alocare | | | -------------------------------------------------------- Efect: rutina intoarce in registrele "H&L" adresa vectorului de alocare asociat discului selectat. Sistemul CP/M pastreaza in memorie, pentru fiecare unitate "activa", un vector de alocare. Acest vector poate fi folosit pentru a determina dimensiunea spatiului-disc ramas liber pe un volum (vezi comanda tranzitorie (STAT). Informatiile cuprinse in vectorul de alocare asociat unei unitati de disc care a fost desemnata ca R/O de catre CP/M (in urma schimbarii unui volum disc fara initializare sistemului CP/M sau fara o operatie de "initializare stare sistem discuri" (rutina 13)) sint false. -------------------------------------------------------- | | | RUTINA 28 : Setare atribut R/O unitate disc | | (Write Protect Disk) | | | | Intrari : | | registrul C : 1CH | | | -------------------------------------------------------- Efect: rutina desemneaza temporar discul selectat ca disc R/O. Orice incercare de scriere pe acel disc, pina la o initializare sau reinitializare a sistemului CP/M sau pina la o operatie de "initializare stare sistem discuri" (rutina 13), va produce mesajul: BDOS ERR on d:R/0