.pl 72 .he Manual de interfata CP/M .fo i .pn C U P R I N S PAG. 1.1 Organizarea CP/M ...................................... 1 1.2 Executia programelor tranzitorii ...................... 2 1.3 Conventii pentru apelul functiilor de sistem CP/M ..... 3 1.4 Particularitati in utilizarea rutinelor CP/M de lucru cu fisiere pe disc .............................. 5 1.5 Prezentarea rutinelor CP/M ............................ 10 RUTINA 0 - Reinitializare sistem CP/M ................ 10 RUTINA 1 - Citire caracter de la consola ............. 10 RUTINA 2 - Scriere caracter la consola ............... 10 RUTINA 3 - Citire caracter de la dispozitivul "Reader" curent ........................... 11 RUTINA 4 - Scriere caracter la dispozitivul "Punch" curent ............................ 11 RUTINA 5 - Scriere caracter la dispozitivul "List" curent ............................. 11 RUTINA 6 - Citire/Scriere directa la consola ......... 12 RUTINA 7 - Citire octet IOBYTE ....................... 12 RUTINA 8 - Modificare octet IOBYTE ................... 13 RUTINA 9 - Tiparire la consola a unui sir de caractere .............................. 13 RUTINA 10 - Citire buffer consola ..................... 14 RUTINA 11 - Citire stare consola ...................... 15 RUTINA 12 - Citire versiune sistem .................... 16 RUTINA 13 - Initializare stare sistem discuri ......... 16 RUTINA 14 - Selectare disc ............................ 17 RUTINA 15 - Deschidere fisier ......................... 18 RUTINA 16 - Inchidere fisier .......................... 19 RUTINA 17 - Cauta in "director" prima intrare ......... 20 RUTINA 18 - Cauta in "director" urmatoarea intrare .... 21 RUTINA 19 - Stergere fisier ........................... 21 RUTINA 20 - Citire secventiala ........................ 22 RUTINA 21 - Scriere secventiala ....................... 23 RUTINA 22 - Creare fisier ............................. 24 RUTINA 23 - Schimbare nume fisier ..................... 25 RUTINA 24 - Citire vector de unitati-disc active ...... 26 RUTINA 25 - Citire numar disc selectat ................ 26 RUTINA 26 - Modificare "adresa DMA" ................... 26 RUTINA 27 - Citire adresa de alocare .................. 27 RUTINA 28 - Setare atribut R/O pentru o unitate de disc ................................... 27 RUTINA 29 - Citire vector de unitati R/O .............. 28 RUTINA 30 - Modificare atribute fisier ................ 28 RUTINA 31 - Citire adresa "bloc de parametri disc" .... 29 RUTINA 32 - Citire/Modificare numar utilizator ........ 29 RUTINA 33 - Citire directa ............................ 30 RUTINA 34 - Scriere directa ........................... 31 RUTINA 35 - Determinare lungime fisier ................ 32 RUTINA 36 - Determinare numar inregistrare ............ 33 RUTINA 37 - Dezactivare discuri ....................... 34 RUTINA 40 - Scriere directa cu umplere cu zero ........ 34 A N E X A 1 ............................................ 35 .pn 1 .fo # Acest manual descrie organizarea sistemului CP/M (inclusiv orga nizarea memoriei) si punctele de intrare in sistem. Se vor prezenta informatiile necesare pentru scrierea de programe execu tabile sub CP/M, programe ce utilizeaza facilitatile de I/E si de lucru cu discul oferite de sistem. 1.1 ORGANIZAREA CP/M Sistemul CP/M este alcatuit din punct de vedere logic din urma toarele patru parti: BIOS - sistemul de I/E de baza, care ofera interfata cu perifericele, BDOS - sistemul de exploatare a discurilor, care ofera primitivele de acces la disc, CCP - procesorul de comenzi-consola, TPA - zona pentru programe tranzitorii. Componentele BIOS si BDOS sint grupate intr-un singur program numit FDOS, care are un punct de intrare unic. Componenta CCP este un program distinct, care utilizeaza programul FDOS pentru a oferi o interfata flexibila intre utilizator si informatiile existente pe disc. TPA este o zona de memorie (i.e. zona de memorie care nu este utilizata de FDOS si CCP) in care se executa comenzile tranzitorii CP/M si programele-utilizator de aplicatii. Organizarea memoriei intr-un sistem standard CP/M este: 0000 ---------------------------------------------- BOOT: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | |--------------------------------------------| | parametri sistem | |--------------------------------------------| TBASE: | | | | | T P A | | | | | |--------------------------------------------| CBASE: | | | C C P | | | |--------------------------------------------| FBASE: | | | F D O S (BDOS + BIOS) | | | ---------------------------------------------- De obicei adresa BOOT este egala cu 0000H, adresa TBASE este egala cu BOOT + 0100H, iar adresele CBASE si FBASE depind de tipul sistemului CP/M. .pa Adresele 0000H -: 0007 sint rezervate pentru: 0000H - 0002H = salt la rutina de reinitializare a siste mului CP/M existenta in BIOS (JMP WBOOT). 0003H = octetul IOBYTE. 0004H = numarul utilizatorului curent si al discu lui instalat. 0005H - 0007H = salt la punctul de intrare in FDOS, res pectiv in BDOS (JMP FBASE). OBSERVATII: a. Adresa 0005H este PUNCT DE INTRARE din programe tranzitorii in rutinele sistemului CP/M (in BDOS). b. Adresa prezenta in locatiile 0006H - 0007H poate fi folosita pentru a determina dimensiunea maxima a memoriei disponibile (presupunind ca se reaco pera componenta CCP). c. Adresa 0003H este rezervata pentru octetul IOBYTE (configuratia de I/E curenta). d. Adresa 0004H este rezervata pentru a stoca numa rul utilizatorului curent si numarul discului instalat; octetul de la aceasta adresa are forma: | numar utilizator curent | numar disc instalat | ------------------------------------------------- 0000 - 1111 0000 - 1111 (A) (P) 1.2 EXECUTIA PROGRAMELOR TRANZITORII Programele tranzitorii sint comenzi tranzitorii CP/M si programe- utilizator de aplicatii. Orice program tranzitoriu se incarca de pe disc in zona TPA si se executa dupa cum va fi prezentat in continuare. Utilizatorul comunica cu componenta CCP (deci cu sistemul CP/M) prin introducerea, dupa fiecare prompter CP/M (">") a unei linii de comanda. Fiecare linie de comanda are una din urmatoarele forme: (1) comanda(CR) (2) comanda specificator-fisier1(CR) (3) comanda specificator-fisier1 specificator-fisier2(CR) unde "comanda" este numele unei comenzi CP/M rezidente (ex.: ERA, DIR, TYPE, etc.) sau numele unei comenzi CP/M tranzitorii sau numele unui program-utilizator. Daca "comanda" este numele unei comenzi CP/M, atunci aceasta comanda este executata imediat. In caz contrar, CCP cauta pe discul specificat (indicat inainte de comanda) sae pe discul instalat, un fisier cu numele: comanda.COM Daca un astfel de fisier este gasit, atunci se presupune ca el reprezinta imaginea-memorie a unui program care se executa in zona TPA si care, implicit, se incarca in memorie incepind de la adresa TBASE. Componenta CCP incarca fisierul tip ".COM" de pe disc in memorie, incepind de la adresa TBASE si ii preda contro lul printr-o instructiune de tip "CALL". La sfirsitul executiei programului, controlul poate reveni in CCP (printr-o instructiune de tip "RET") sau in CP/M (printr-o instructiune "JMP BOOT"). Daca se doreste ca la sfirsitul executiei programului controlul sa revina in CCP, atunci programul trebuie sa nu suprascrie zona CBASE - FBASE. In caz contrar, programul poae sa foloseasca memoria pina la adresa FBASE - 1. Daca in linia de comanda exista unul sau doi specificatori de fisier, atunci componenta CCP pregateste si unul sau doua "blo curi de control fisier" (FCB), in zona de memorie rezervata pentru "parametri sistem". Aceste FCB-uri sint constituite in formatul impus de FDOS pentru accesul la fisiere (vezi cap. 1.4). Programele tranzitorii pot folosi: - facilitatile CP/M de I/E pentru a comunica cu consola si cu dispozitivele periferice, precum si - subsistemul de lucru cu discul, pentru accesul la fisiere rezidente pe acest suport. Accesul din programe tranzitorii la sistemul de I/E al CP/M se face prin transmiterea catre sistemul CP/M, prin punctul de intrare in FDOS (existent la adresa BOOT + 0005H), a unui numar de rutina si a unei adrese pentru informatii specifice rutinei. Dupa executia rutinei, FDOS intoarce o valoare ce indica modul de desfasurare a operatiei (operatie desfasurata corect sau codul de eroare - numeric - daca aceasta a esuat). 1.3 CONVENTII PENTRU APELUL FUNCTIILOR DE SISTEM CP/M Sistemul CP/M pune la dispozitia utilizatorilor o serie de rutine care pot fi apelate in cadrul programelor tranzitorii. Rutinele se impart in doua categorii: - rutine de I/E pentru periferice simple; - rutine de I/E pentru lucrul cu fisiere pe disc. Rutinele de I/E pentru periferice simple sint: - citire caracter de la consola, - scriere caracter la consola, - citire/scriere directa la consola, - citire caracter de la dispozitivul tip "READER", - scriere caracter la dispozitivul tip "PUNCH", - scriere caracter la dispozitivul tip "LIST", - citire/modificare octet IOBYTE, - tiparire la consola a unui sir de caractere, - citire buffer consola, - citire stare consola. Rutinele de I/E pentru lucrul cu fisiere pe disc sint: - creare fisier, - deschidere fisier, - inchidere fisier, - cautare in "director", - modificare nume fisier, - stergere fisier, - citire secventiala sau directa a unui fisier, - scriere secventiala sau directa a unui fisier, - modificare atribute fisier, - initializare "adresa DMA", - initializare stare sistem discuri. In ANEXA 1 este prezentata lista completa a rutinelor CP/M disponibile. Accesul la rutinele FDOS se realizeaza prin transmiterea in: - registrul "C" a numarului rutinei si in - perechea de registre "D&E" a unor parametri necesari rutinei. Rutinele FDOS pot avea ca iesiri valori pe un octet (in registrul "A") sau pe doi octeti (in perechea de registre H&L). OBSERVATII: a. Pentru rutinele care au ca iesiri valori pe doi oceti, aceste valori se gasesc si in registrele "A" si "B" (i.e. (A) = L si (B) = H)> b. Conventiile de apel al rutinelor CP/M respecta standardele PL/M de comunicare parametri. c. Exista rutine CP/M care folosesc doar registrul "E" pentru transmiterea unor parametrii necesari apelului lor. d. Exista rutine CP/M care nu necesita parametrii (apelul lor presupune doar transmiterea, prin registrul "C", a numarului rutinei). e. Exista rutine CP/M care nu au iesiri. Rezulta ca secventa standard necesara pentru apelul unor rutine CP/M este: BOOT EQU O BDOS EQU BOOT+5 . . . MVI C, numar-rutina [ LXI D, parametrii-specifici-rutinei ] [ MVI E, parametru-specific-rutinei ] CALL BDOS ; apel rutina prin ; punctul de intrare in FDOS OBSERVATIE: Liniile cuprinse intre [] reprezinta linii optionale, dependente de tipul rutinei. S-a aratat in sectiunea 1.2 ca dupa incarcarea de pe disc in memorie a unui program tranzitoriu, componenta CCP ii preda acestuia controlul printr-o instructiune de tip "CALL". Executia programului tranzitoriu incepe avind SP-ul pozitionat pe o stiva cu o capacitate de 8 nivele (16 octeti), in care exista inscrisa doar adresa de revenire in CCP (7nivele sint libere). Desi aceasta stiva nu este de obicei folosita de catre programele tranzitorii (majoritatea acestora rezervindu-si o stiva proprie si revenind in CCP printr-o instructiune de tip "JMP BOOT"), totusi este util de cunoscut faptul ca este suficient de mare pentru a realiza apeluri de rutine CP/M. Acest lucru este posibil intrucit componenta FDOS comuta SP-ul pe o stiva locala, la fiecare intrare intr-o rutina de sistem, neafectind astfel stiva initiala a programului. Programul in limbaj de asamblare de mai jos reprezinta un exemplu in acest sens, el realizind citirea unor caractere de la consola, pina la intilnirea unui caracter "*" care determina intoarcerea controlului in CCP: BOOT EQU O BDOS EQU BOOT+5 ;punct de intrare standard ;in rutinele CP/M CONIN EQU 1 ;rutina "Console Input" ORG 100H ;adresa de baza pentru TPA NEXTC: MVI C,CONIN ;pregatire apel rutina CONIN CALL BDOS ;citire caracter de la consola ;cu preluarea caracterului ;in registrul "A" CPI '*' ;test pentru sfirsit ;de prelucrare JNZ NEXTC ;reluare prelucrare RET ;revenire in CCP END 1.4 Particularitati in utilizarea rutinelor CP/M de lucru cu fisiere pe disc Pentru lucrul cu discul flexibil sistemul CP/M implementeaza, pe fiecare volum disc, o structura de fisiere identificate prin nume. Fiecare unitate de disc este, din punct de vedere logic, distincta, avind o zona rezervata pentru "director" si o alta zona pentru fisierele de date. Fiecare fisier are asociat un identificator alcatuit din: - codul pentru selectarea unitatii de disc (o litera A - P). - numele (alcatuit din 1 - 8 caractere ASCII diferite de spatiu). - extensia (tipul) fisierului (alcatuita din 0 - 3 caractere ASCII diferite de spatiu). Extensiile definesc categoria generica din care face parte un anumit fisier, in timp ce numele identifica in mod unic fisierul in cadrul categoriei respective. Astfel, sistemul CP/M utilizeaza urmatoarele extensii standard: - ASM pentru fisiere sursa in limbaj de asamblare tratabile cu asamblorul ASM sau MAC - PRN pentru fisiere listing - HEX pentru fisiere hexa - BAS pentru fisiere sursa in limbaj BASIC - INT pentru fisiere cod-obiect intermediar - COM pentru fisiere cod-obiect direct executabil - REL pentru fisiere cod-obiect relocabil - COB pentru fisiere sursa in limbaj COBOL - FOR pentru fisiere sursa in limbaj FORTRAN - MAC pentru fisiere sursa in limbaj de asamblare tratabile cu asamblorul M80 - BAK pentru fisiere ce reprezinta versiuni anterioare intr-un proces de editare texte - $$$ pentru fisiere temporare Fisierele sursa sint tratate ca o secventa de caractere ASCII, in care fiecare "linie" din fisier se termina prin secventa de caractere (CR) (LF) (ODH OAH). Astfel, o inregistrare CP/M (de 128 de octeti) poate contine mai multe linii de text sursa. Sfirsitul unui fisier ASCII este indicat prin caracterul CTRL/Z (1AH) sau prin "sfirsitul fizic" de fisier, detectat de catre rutina CP/M de citire. Caracterele CTRL/Z existente intr-un fisier cod-obiect (de exemplu, in fisiere tip COM) sint ignorate, sfirsitul de fisier fiind detectat de rutina CP/M de citire. Orice fisier CP/M este o secventa de maximum 65536 inregistrari, de cite 128 octeti fiecare, numerotate de la 0 la 65535. Desi din punct de vedere logic inregistrarile intr-un fisier sint contigue ele pot fi dispersate pe disc. Fisierelor li se aloca spatiu disc in mod dinamic, pe masura crearii lor. Fiecare fisier este, intern, impartit in segmente de cite 16 KB, denumite "extensii logice". In cadrul fiecarei "extensii logice" exista 128 de inregistrari (128 * 128 B = 16 KB) numerotate de la 0 la 127 (OOH - 7FH). Se observa ca in cadrul unei "extensii logice" contorul de inregistrari poate fi reprezentat pe 8 biti. Informatiile privind fiecare "extensie logica" a unui fisier ocupa spatiu in "directorul" discului respectiv. O "extensie logica" (16 KB) este formata din mai multe blocuri de alocare. Un bloc de alocare reprezinta spatiul disc minim ce poate fi alocat unui fisier. Un bloc de alocare are minimum 1 KB si maximum 16 KB; dimensiunea blocului de alocare este stabilita la generarea sistemului CP/M. Pentru utilizarea rutinelor CP/M de lucru cu fisiere pe disc trebuie respectate urmatoarele conventii: - informatiile de identificare a oricarui fisier se transmit catre rutinele FDOS intr-un format standard, si anume sub forma unui "bloc de control fisier" (File Control Block = FCB). Dimensiunea FCB depinde de tipul accesului la fisier (este de 33 de octeti pentru acces secvential si de 36 de octeti pentru acces direct). Adresa FCB-ului se transmite in general prin registrele D&E. - orice operatie de citire/scriere date intr-un fisier se realizeaza asupra unei inregistrari de 128 de octeti - adresa de inceput a zonei de memorie (de 128 de octeti) utilizata ca buffer in operatiile de citire/scriere se numeste "adresa DMA". Acesta adresa nu se transmite ca parametru, ea fiind initializata de catre sistemul CP/M sau de catre o rutina CP/M speciala (rutina 26). - se numeste "disc selectat" acea unitate de disc care a fost activata prin: - actiunea componentei CCP (discul instalat prin CCP este in momentul lansarii unui program in TPA "disc selectat") sau - prin rutina CP/M de selectare disc (rutina 14). - se numeste "disc activ" acea unitate de disc, care de la ultima initializare/reinitializare a sistemului CP/M sau de la ultima operatie de initializare stare sistem discuri (rutina 13), a facut obiectul unei selectii: - explicite (prin CCP sau prin rutina CP/M de selectare disc (rutina 14)) sau - implicite (printr-o rutina de deschidere sau creare a unui fisier cu octet 00 din FCB diferit de zero). Programele tranzitorii pot folosi zona 005CH - 007FH (36 octeti) pentru unul din FCB-urile necesare. Aceasta zona are avantajul ca este initializata de CCP inainte de lansarea programului. Zona 0080H - 00FFH (128 octeti) poate fi folosita drept "buffer" in operatiile de intrare/iesire cu fisiere. CCP initializeaza "adresa DMA" cu 0080H, deci daca un singur "buffer" este suficient se recomanda folosirea acestei zone. Structura standard a unui FCB este urmatoarea: - octetul 00 codul unitatii de disc pe care se gaseste fisierul, respectiv: 00H - pentru discul selectat 01H - pentru unitatea "A" . . . 10H - pentru unitatea "P" - octetii 01-08 numele fisierului exprimat in ASCII (caractere majuscule, cu B7=0); daca numele fisierului are mai putin de 8 caractere, atunci el trebuie completat la dreapta cu blancuri. - octetii 09-11 extensia (tipul) fisierului exprimat in ASCII (caractere majuscule); daca extensia are mai putin de 3 caractere, atunci acest cimp trebuie completat la dreapta cu blancuri. Daca fisierul este protejat la scriere (R/0) atunci B7 din octetul 09 este egal cu 1; astfel, acest bit este egal cu 0. Daca fisierul este invizibil (SYS) atunci B7 din octe tul 10 este 1; altfel, acest bit este egal cu 0. - octetul 12 Numarul curent al "extensiei logice" a fisierului; de obicei acest octet este sters cu zero de utilizator. - octetul 13 este rezervat pentru sistem - octetul 14 este rezervat pentru sistem acest octet este sters cu zero atunci cind se executa operatii de tip OPEN, MAKE, SEARCH. - octetul 15 contor de inregistrari in cadrul "extensiei logice" curente (ia volori intre 00H si 7FH); acest cimp este completat de catre sistem. - octetii 16-31 sint rezervati pentru sistem. - octetul 32 numarul inregistrarii din "extensia logica" curenta; se foloseste in accesul secvential la fisiere; in mod normal acest octet este sters cu zero de catre utiliza tor inainte de deschiderea fisierului. - octetii 33-35 reprezinta un parametru optional folosit numai in accesul direct la fisiere. El indica numarul inregis trarii de scris/citit (are valori intre 0000H si FFFFH cu posibilitate de depasire in octetul 35). Octetii 33 si 34 reprezinta o valoare pe 16 biti cu partea cea mai putin semnificativa in octetul 33 si cea mai semnifica tiva in octetul 34. Fiecare fisier care trebuie exploatat prin CP/M trebuie sa aiba un FCB propriu, care sa furnizeze, pentru fiecare operatie cu fisierul informatii privind numele si alocarea acestuia. Orice acces la un fisier implica initializarea de catre utilizator (programator) a FCB-ului corespunzator, respectiv prin inscrierea in octetii 00 - 11 a specificatorului fisierului si prin umplerea cu 00H a restului de octeti (12 - 32/35). Informatiile din FCB- urile corespunzatoare fisierelor de pe un disc se gasesc inregis- trate in "directorul" discului respectiv si sint aduse in memoria interna inainte ca utilizatorul sa inceapa lucrul asupra fisieru lui/fisierelor (vezi rutinele OPEN, MAKE). Copia din memorie a FCB-ului este actualizata pe masura ce au loc operatii asupra fisierului, iar la terminarea lucrului cu acesta ea este inregis- trata pe disc (vezi rutina CLOSE). Atunci cind o comanda (program) se lanseaza in executie prin: comanda specificator-fisier1(CR) comanda specificator-fisier1 specificator-fisier2(CR) componenta CCP construieste (dupa cum s-a aratat in sectiunea 1.2) primii 16 octeti din doua FCB-uri pornind de la specificato- rul/specificatorii de fisier prezenti in linia de comanda (dupa numele comenzii). Automat, CCP completeaza (daca este cazul) numele si extensia fisierelor cu blancuri. Primul FCB este construit la adresa 005CH si poate fi folosit ca atare pentru operatii ulterioare asupra fisierului "specificator-fisier1". Al doilea FCB este construit in octetii 16 - 31 din primul FCB (adica de la adresa 006CH) si trebuie sa fie mutat intr-o alta zona de memorie inainte de utilizarea lui. Daca de exemplu, utilizatorul introduce comanda: PROGNAME B:X.ZOT Y.ZAP(CR) fisierul PROGNAME.COM de pe discul instalat va fi incarcat in zona TPA, iar blocul de control de la adresa 005CH va fi initia- lizat astfel: octetul 00 = 02H (cod unitate "B") octetii 01-08 = 'X octetii 09-11 = 'ZOT' octetii 12-15 = 00H octetul 16 = 00H (cod disc selectat, care in acest caz este chiar discul instalat) octetii 17-24 = 'Y octetii 25-27 = 'ZAP' octetii 28-31 = 00H Programatorul trebuie sa salveze continutul celui de-al doilea FCB (cei 16 octeti incepind de la adresa 006CH) inainte de a deschide fisierul corespunzator primului FCB (de la adresa 005CH), intrucit prin deschiderea acestuia informatiile referi toare la cel de-al doilea fisier vor fi sterse (suprascrise) de catre sistem (de catre rutina OPEN). Daca intr-o linie de comanda CP/M nu apare nici un specificator- fisier atunci zonele 005DH - 0067H si 006DH - 0077H vor contine blancuri. Componenta CCP asigura automat transformarea minusculelor in majuscule. Dupa receptionarea unei linii de comanda CCP pastreaza la adresa 0080H un buffer pentru consola, in care exista o copie a continutului liniei de comanda exceptind numele comenzii. Astfel, pentru exemplul considerat anterior, bufferul de la adresa 0080H va avea urmatorul continut: octetul 00 = OEH (numarul de caractere utile din linia de comanda exceptind numele comenzii) octetul 01 = ' ' octetii 02-08 = 'B:X.ZOT' octetii 10-14 = 'Y.ZAP' Este sarcina utilizatorului de a extrage informatiile din acest buffer, inainte de a executa orice operatie asupra unui fisier, operatie prin care aceasta zona este suprascrisa (initial "adresa DMA" este egala cu 0080H, adica tocmai adresa de inceput a acestui buffer consola). .pa .fo # 1.5 Prezentarea rutinelor CP/M ------------------------------------------------------- | | | RUTINA 0 : Reinitializarea sistem CP/M | | (System Reset) | | | | Intrari : | | registrul C : OOH | | | ------------------------------------------------------- Efect: intoarece controlul din programul utilizator in CP/M; aceasta functie are acelasi efect ca "JMP BOOT". -------------------------------------------------------- | | | RUTINA 1 : Citire caracter de la consola | | (Console Input) | | | | Intrari : | | registrul C : O1H | | | | Iesiri : registrul A : caracter ASCII | | | -------------------------------------------------------- Efect: preia un caracter de la consola si-l transmite in regis- trul "A". Toate caracterele tiparibile si in plus (CR) (LF) si (BS) (CTRL/H) sint transmise in ecou la consola. De asemenea caracterul CTRL/I (TAB) muta cursorul in urmatoarea pozitie de tabulare. Restul de caractere netiparibile nu sint transmise in ecou la consola. Rutina asteapta un timp nelimitat pina cind se tasteaza un caracter la consola. -------------------------------------------------------- | | | RUTINA 2 : Scriere caracter la consola | | Console Output) | | | | Intrari : | | registrul C : 02H | | registrul E : caracter ASCII | | | -------------------------------------------------------- Efect: transmite la consola caracterul specificat prin registrul "E". Caracterele "TAB" (CRTL/I) sint expandate. Caracterul CTRL/S introdus de la consola este interpretat drept stop defilare. Reluarea defilarii dupa CTRL/S se face cu orice caracter diferit de CTRL/C. CTRL/C dupa CTRL/S reinitializeaza sistemul CP/M. .pa -------------------------------------------------------- | | | RUTINA 3 : Citire caracter de la cititor logic | | (Reader Input) | | | | Intrari : | | registrul C : 03H | | | | Iesiri : | | registrul A : caracter ASCII | | | -------------------------------------------------------- Efect: preia un caracter de la dispozitivul RDR: curent si-l depune in registrul "A". Rutina steapta un timp nelimitat preluarea caracterului de la RDR:. ----------------------------------------------------------- | | | RUTINA 4 : Scriere caracter la performator logic | | (Punch Output) | | | | Intrari : registrul C : 04H | | registrul E : caracter ASCII | | | ----------------------------------------------------------- Efect: transmite la dispozitivul PUN: curent caracterul specifi cat prin registrul "E". ---------------------------------------------------------- | | | RUTINA 5 : Scriere caracter la imprimanta logica | | (List Output) | | | | Intrari : registrul C : 05H | | registrul E : caracter ASCII | | | ---------------------------------------------------------- Efect: transmite la dispozitivul LST: curent caracterul specifi- cat prin registrul "E". .pa -------------------------------------------------------- | | | RUTINA 6 : Citire/Scriere directa la consola | | (Direct Console I/0) | | | | Intrari : | | registrul C : 06H | | registrul E : 0FFH pentru intrare | | sau caracter ASCII | | pentru iesire | | | | Iesiri : | | registrul A : caracter ASCII sau OOH| | | -------------------------------------------------------- Efect: daca registrul "E" este egal cu OFFH, atunci rutina reali zeaza citirea (fara ecou) a unui caracter de la consola. Regis trul "A" va contine codul caracterului ASCII introdus sau 00H, daca nu s-a introdus nici un caracter. Rutina nu asteapta nelimitat introducerea unui caracter de la consola (ea intoarce imediat (A)=00H, daca in registrul de inter- fata al consolei nu exista nici un caracter disponibil). Este indicat ca utilizatorul sa astepte prin program introducerea unui caracter de la consola. Daca registrul "E" contine codul unui caracter ASCII, atunci rutina realizeaza scrierea la consola a caracterului respectiv. Rutina 6 nu trebuie sa fie folosita impreuna cu alte rutine CP/M care realizeaza intrari/iesiri cu consola (rutinele 1, 2, 9, 10 si 11). -------------------------------------------------------- | | | RUTINA 7 : Citire IOBYTE | | (Get I/0 Byte) | | | | Intrari : | | registrul C : 07H | | | | Iesiri : registrul A : valoare curenta IOBYTE| | | -------------------------------------------------------- Efect: citeste octetul de configuratie I/E si il plaseaza in registrul "A". Pentru semnificatia acestui octet vezi Anexa 1 din Manualul de prezentare CP/M. .pa -------------------------------------------------------- | | | RUTINA 8 : Modificare IOBYTE | | (Set I/O Byte) | | | | Intrari : | | registrul C : 08H | | registrul E : valoare pentru IOBYTE | | | -------------------------------------------------------- Efect: scrie continutul registrului "E" in octetul de configura- tie I/E modificind astfel asignarea dispozitivelor logice curente. -------------------------------------------------------- | | | RUTINA 9 : Tiparire sir de caractere la consola | | (Print String) | | | | Intrari : | | registrul C : 09H | | registrele D&E : adresa sir | | | -------------------------------------------------------- Efect: tipareste la consola sirul de caractere ASCII a carui adresa de inceput este specificata in registrele "D&E". Tiparirea se termina atunci cind s-a intilnit caracterul "$". Rutina tra teaza caracterele TAB (CTRL/I) intilnite, mutind cursorul in urmatoarea pozitie de tabulare. La fel ca in rutina 2, se face verificare pentru caracterul CTRL/S (stop defilare). .pa -------------------------------------------------------- | | | RUTINA 10 : Citire buffer consola | | (Read Console Buffer) | | | | Intrari : | | registrul C : OAH | | registrele D&E : adresa buffer | | | -------------------------------------------------------- Efect: rutina permite citirea unei linii introduse de la consola cu transferarea continutului ei intr-o zona de memorie a carei adresa de inceput este data in registrele "D&E". O linie editata la consola se considera terminata atunci cind s-a introdus caracterul (CR) sau caracterul (LF) sau atunci cind s-a depasit capacitatea bufferului consolei specificata de utili- zator in primul octet din buffer. Rutina aduce in bufferul a carui adresa este data in registrele "D&E" urmatorul continut: - octetul 00 numarul maxim de caractere din bufferul consolei (cu valori intre 1 si 255); acest cimp este initializat de catre utilizator inaintea apelului rutinei 10. - octetul 01 numarul real de caractere introduse in linie (fara (CR) si (LF)). Valoare intoarsa de sistem. - octetii 02-n caracterele din linia de editare (c1,c2,c3,...,cn) Daca numarul de caractere din linia de editare este mai mic decit numarul maxim de caractere din buffer, atunci dupa ultimul carac- ter citit din linia de editare (i.e. caracterul "cn") si pina la pozitia corespunzatoare ultimului caracter posibil in buffer, vor exista in buffer o serie de caractere fara semnificatie pentru utilizator. Ele reprezinta un reset neinitializat din bufferul consolei. In timpul introducerii de la consola a liniei sint active, pentru corectii, caracterele de editare ale sistemului CP/M: RUEOUT/DEL - sterge din bufferul de intrare si reda in ecou ultimul caracter din buffer. Stergere caracter pentru terminale cu hirtie. CTRL/C - reincarcarea sistemului de operare. CTRL/E - forteaza sfirsitul fizic al unei linii; cursorul se pozitioneaza pe inceputul liniei dar linia nu se transmite decit atunci cind se tasteaza (CR). CTRL/H - sterge ultimul caracter din bufferul de intrare si de pe ecran. Stergere pentru terminale cu tub catodic. CTRL/J - este echivalent unui caracter (LF) si reprezinta sfirsitul unei linii. CTRL/M - este echivalent unui caracter (CR) si reprezinta sfirsitul unei linii. CTRL/R - tipareste la consola pe linia imediat urmatoare continutul curent al buferului de intrare. Prin acest caracter se poate vizualiza continutul curent al unei linii in care s-au efectuat corectii prin RUBOUT (DEL). CTRL/U - sterge bufferul de intrare, afiseaza caracterul "#" pe linia curenta si trece la linie noua; anulare linie pentru terminale cu hirtie. CTRL/X - sterge bufferul de intrare si caracterele cores- punzatoare de pe ecran; alunare linie pentru terminale cu tub catodic. CTRL/P - inverseaza starea indicatorului "hard copy". Daca acest indicator este activ, toate caracterele care se afiseaza la consola prin rutinele 2 si 9 sint trimise si la imprimanta logica. Un nou CTRL/P introdus in timpul executiei rutinei 10, readuce lucrurile la normal. -------------------------------------------------------- | | | RUTINA 11 : Citire stare consola | | (Get Console Status) | | | | Intrari : | | registrul C : OBH | | | | Iesiri : registrul A : stare consola | | | -------------------------------------------------------- Efect: rutina verifica daca s-a introdus un caracter de la consola. Daca in registrul de interfata al consolei exista un caracter disponibil, atunci rutina intoarce in registrul "A" valoarea OFFH. In caz contrar, in registrul "A" se va afla valoarea OOH. .pa -------------------------------------------------------- | | | RUTINA 12 : Citire versiune sistem | | (Get Version Number) | | | | Intrari : | | registrul C : OCH | | | | Iesiri : | | registrele H&L : numar de versiune | | | -------------------------------------------------------- Efect: rutina intoarce in registrele "H&L" o valoare egala cu numarul de versiune al sistemului CP/M sub care se lucreaza, respectiv (H)=OOH iar (L)= numarul de versiune (ex: 22H pentru versiunea 2.2). Intrucit in versiunea 1.4 de CP/M nu erau implementate functiile de acces aleator la fisiere, rutina 12 trebuie apelata in toate programele care face acces aleator. Daca numarul de versiune intors este mai mic decit 20H, programul trebuie terminat dupa ce se tiparesc injuraturile de rigoare. -------------------------------------------------------- | | | RUTINA 13 : Initializare stare sistem discuri | | (Reset Disk System) | | | | Intrari : | | registrul C : ODH | | | -------------------------------------------------------- Efect: rutina dezactiveaza logic toate unitatile de disc (le sterge atributul R/0), asigneaza ca disc selectat unitatea "A" si stabileste ca "adresa DMA" adresa 0080H. Rutina poate fi folosita atunci cind o aplicatie necesita schimbari de volume disc fara a se reinitializa sistemul CP/M (prin CTRL/C). .pa -------------------------------------------------------- | | | RUTINA 14 : Selectare disk | | (select Disk) | | | | Intrari : | | registrul C : OEH | | registrul E : numar unitate selectata| | | -------------------------------------------------------- Efect: rutina desemneaza unitatea specificata in registrul "E" ca "disc selectat". Numarul unitatii de disc se specifica prin valorile: OOH pentru unitatea "A", 01H pentru unitatea "B",...OFH pentru unitatea "P". In urma executiei rutinei, unitatea specifi- cata in registrul "E" este trecuta in starea "activ" (disc activ) care incarca "directorul" volumului respectiv; unitatea ramine in aceasta stare pina la o noua initializare sau reinitializare a sistemului CP/M sau pina la o noua operatie de "initializare stare sistem discuri" (rutina 13). Daca in timp ce o unitate este "activa" se fac schimbari de volume disc, atunci automat unitatea este desemnata de catre sistem ca R/O (vezi si rutina 28). NOTA Toate FCB-urile care au primul octet egal cu OOH se refera implicit la fisiere care se gasesc pe discul selectat.