Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

STRT - Telefon public inteligent

 

Electronica Telecomunicatii si Tehnologia Informatiei

STRT

Telefon public inteligent



1. Introducere

Proiectarea hard si soft a unui telefon public inteligent cu urmatoarele facilitati:

poate fi folosit decat de persoane autorizate;

poate fi utilizat ca terminal de date, furnizand informatii pentru un abonat de la distanta;

permite schimbarea taxei, parolei, atat de la claviatura proprie cat si de la distanta;

este un telefon DTMF;

este echipat cu un circuit de sinteza vocala;

2. Descrierea functionarii

La alimentare, aparatul verifica daca este functional. Dupa trecerea testului, asteapta ca un utilizator sa ridice receptorul sau sa primeasca un apel pe linia telefonica.

a) Functionarea comandata de la distanta.

Legatura cu un alt telefon DTMF se face prin intermediul centralei telefonice. Abonatul formeaza numarul telefonului public. Centrala raspunde cu tonul de ocupat, dar asteapta parola. Solicitantul formeaza parola, iar centrala face legatura cu terminalul public. Acesta trece in regimul de asteptare comenzi daca parola este valida, in caz contrar emite un ton special.

Pentru ca un solicitant aflat la distanta sa acceseze baza de date a telefonului public, acesta solicita prin intermediul centralei realizarea unei legaturi. Dupa ce legatura s-a realizat, solicitantul introduce de la tastatura telefonului DTMF propriu o parola, urmata de un cod de informatie. Telefonul inteligent prin intermediul microprocesorului incorporat si al programului, verifica parola si codul de informatie, dupa care, prin intermediul circuitului de sinteza vocala, transmite informatiile dorite de abonat.

b) Serviciile locale

1. Modificarea bazei de date.

Se ridica receptorul si se asteapta tonul de disc, se introduce parola. Daca parola este corecta, telefonul emite spre centrala tomul de "sfarsit de convorbire" se pot introduce acum valori noi pentru parola, taxe convorbire, sau alte informatii. Aceste noi valori apar pe display-ul aparatului telefonic. Dupa terminarea programarii, pe display ramane afisata valoarea taxei pentru convorbire.


2. Solicitare convorbire.

Se ridica receptorul, se asteapta tonul de disc, apoi se introduce moneda si se formeaza numarul dorit. Exista posibilitatea efectuarii de convorbiri fara taxare, caz in care se introduce o parola.

3. Implementarea practica


Schema bloc a telefonului inteligent este desenata in figura:





CLK



Senzor deteriorareSenzor cutie plina


Fig. 1.


Legatura cu linia telefonica se realizeaza prin blocul IL (interfata cu linia). La acest circuit sosesc semnale sintetizate de blocul de sinteza vocala (SV) si tonurile furnizate de circuitul DTMF (dial tone multi freqvency). In blocul PORT se inscriu date legate de functionarea telefonului (semnale de "deteriorare" si "cutie plina"). Inscrierea se face automat sub controlul semnalului de clock (LK). In memoria RAM se inscriu date temporale, iar in memoria ROM se scrie programul de deservire al telefonului, program executat de microprocesorul 8086. Blocul DEC este un decodificator care decodifica memoria si porturile.



Blocurile functionale.

1. Memoria:

Memoria are dimensiunea de 48 Kocteti din care 32 K RAM si 16 K ROM.

Harta memoriei:

16 K ROM

FFFF0H


FC000H






0DFFFH


00000H


32 K RAM


Memoria ROM:


S-au folosit memorii 2716 cu o capacitate de 2K x 8. Sunt necesari 16 K ROM deci se folosesc 8 cipuri. Este necesar sa se faca decodificarea memoriei.

Memoria ROM este situata la limita superioara a spatiului de memorie IM pe care procesorul 8086 il poate adresa. Sunt 20 de linii de adresa (A0 - A19) deci liniile ce corespund bitilor cel mai semnificativi trebuie sa fie in starea logica "1" pentru ca memoria ROM sa fie selectata. In plus, procesorul trebuie sa semnalizeze faptul ca lucreaza cu memoria ().

De asemenea, procesorul furnizeaza semnale de control pentru tipul transferului, dupa tabelul de adevar urmator.


A0

Tipul transferului

0

0

16 biti

0

1

8 biti (MSB)

1

0

8 biti (LSB)

1

1

Nu exista transfer

Circuitele de memorie 2716 sunt grupate doua cate doua astfel incat iesirile lor de 8 biti sa alcatuiasca un cuvant de 16 biti. Cele doua circuite sunt comandate deci identic.

Sunt 4 grupuri de memorie care sunt comandate de A13, A12 conform tabelului urmator:

A13

A12

Selectie

0

0

CS 0

0

1

CS 1

1

0

CS 2

1

1

CS 3


Circuitul care efectueaza selectia memoriilor este 74LS138.


Tabelul conform caruia se face selectia circuitelor de memorie este urmatorul:


A19

A18

A17

A16

A15

A14

A13

A12

A11  A1

A0

Zona de memorie

Sel

1

1

1

1

1

1

1

1

Decodificare interna

H/L

FFFFFH-FF000H

1

1

1

1

1

1

1

0

FFFFFH-FE000H

1

1

1

1

1

1

0

1

FDFFFH-FD000H

1

1

1

1

1

1

0

0

FCFFFH-FC000H

Circuitele folosite sunt urmatoarele:

74LS138: demultiplicator (8 iesiri/3 intrariselectie/3 intrari comanda).

74LS20: doua porti si NEGAT cu 4 intrari.

74LS32: patru porti SAU cu 2 intrari.

2716: memorii EPROM de 2 Kocteti.



Implementarea circuitului de demultiplexare a memoriilor ROM:


Fig. 2.

Decodificarea memoriilor RAM:


Decodificarea memoriilor RAM se face folosind tot circuitul 74LS138 care selecteaza cate un grup de 4 circuite 2114 care sunt memorii RAM de capacitate 1 k x 4 biti. Sunt grupate in asa fel incat iesirile lor sa formeze un cuvant de 16 biti. Sunt 16 astfel de grupuri care impreuna dau capacitatea dorita (32 K * 8).

Cu A14, A13, A12, A11 se face selectia intre cele 16 grupuri de circuite prin intermediul semnalelor CS0 - CS15 generate de doua circuite 74LS138.

Cu A14 alegem intre cele doua circuite 74LS138, iar cu A0 si selectam tipul transferului:

Zona de memorie

SEL

A19

A18

A17

A16

A15

A14

A13

A12

A11

00000H-007FFH

CS0

0

0

0

0

0

0

0

0

0

00800H-008FFH

CS1

0

0

0

1

01000H-017FFH

CS2

0

0

1

0

01800H-01FFFH

CS3

0

0

1

1

02000H-027FFH

CS4

0

1

0

0

02800H-027FFH

CS5

0

1

0

1

03000H-037FFH

CS6

0

1

1

0

03800H-03FFFH

CS7

0

1

1

1

04000H-047FFH

CS8

1

0

0

0

04800H-04FFFH

CS9

1

0

0

1

05000H-057FFh

CS10

1

0

1

0

05800H-05FFFH

CS11

1

0

1

1

06000H-067FFH

CS12

1

1

0

0

06800H-06FFFH

CS13

1

1

0

1

07000H-077FFH

CS14

1

1

1

0

07800H-07FFFH

CS15

1

1

1

1

Fig. 3.

Prezentarea circuitelor MT 8880 si 8255.

Transmitatorul-receptor DTMF 8880

MT 8880 este un transmitator/receptor monolitic fabricat de firma INTEL.

Tonurile DTMF reprezinta insumarea a doua semnale sinusoidale de frecvente prestabilite. Sunt 16 astfel de tonuri fiecare compus dintr-o frecventa de linie si o frecventa de coloana. Sunt astfel formate zece cifre (0 - 9), tonurile de diez (#) si star (*) si patru tonuri speciale(A, B, C, D).

Configuratia pinilor unui circuit MT 8880:




Fig.4.


IN+ : intrarea neinversoare a amplificatorului operational;

IN- : intrarea inversoare;

GS : iesirea AO pentru reactia negativa;

VRef. : tensiunea de referinta;

OSC1 : intrare oscilator;

OSC2 : iesire oscilator;

VSS : masa;

TONE : iesire DTMF;

: intrare citire/scriere;

: chip select;

RS0 : intrare selectie registru;

O2 : intrare ceas sistem;

: cerere de intrerupere pentru unitatea centrala de prelucrare;

D0 - D3 : magistrala de adrese;

Est : - Early Stering - 1 pentru pereche de tonuri valide;

St/GT : stering imput/gerard time;

VDD : alimentare (+5 V).

Conectarea circuitului MT 8880 in cadrul telefonului se face dupa o schema uzuala, asa cum se va vedea. Circuitul este comandat de catre microprocesor. Atat acest circuit cat si circuitul de interfata paralela 8255 sunt vazute de catre microprocesor ca niste porturi si sunt adresate ca atare.

Odata conectat in ansamblu, circuitul MT 8880 trebuie comandat corespunzator. In acest sens la terminalul O2 este conectat clock-ul general al aparatului pentru a se asigura sincronizarea intre circuit si restul aparatului. Din semnalele si se formeaza cu ajutorul unui circuit combinational logic simplu, semnalul , necesar circuitului. Similar circuitului 8255, bitul de adresa ADR1 este conectat la pinul RS0 pentru a se selecta registrul corespunzator. Magistrala de date a circuitului MT 8880, anume bitii D0 - D3 sunt conectati la magistrala de date a procesorului. Acest lucru este posibil deoarece D0 - D3 sunt 3-state.

Programarea circuitului MT 8880:


Descrierea registrilor inteni:

Recive Data Register (read-only)

contine cadrul de iesire pentru ultima pereche DTMF decodificata.

Transmit Data Register (write-only)

se va inscrie codul perechi DTMF care va fi transmisa;

Registrii de control ai transmisiei: CRA si CRB

aceste doua registre ocupa aceeasi adresa, ei fiind selectati alternativ.


Descrierea registrilor:

CRA:

b0 - TONE OUTPUT - valideaza tonul de iesire;

b1 - - MODE CONTROL - 0 - DUAL TONE;

1 - CALL PROGRESS;

b2 - IRQ - INTRERUPT ENABLE - validare intreruperi, daca transmisia s-a terminat sau daca s-a detectat un ton valid;

b3 - RSEL - REGISTER SELECT - directioneaza urmatoarea operatie catre registrul B;


CRB:

b0 - BURST - BURST MODE - 0 valideaza modul BURST;

b1 - TEST - TEST MODE modul test;

b2 - - SINGLE/DUAL TONE - selecteaza ton dublu sau simplu;

b3 - - COLUMN/ - selecteaza linia sau coloana dupa care se face transmisia unui singur ton;

Deoarece circuitul MT 8880 are posibilitatea de a emite si un ton singular, il putem folosi pentru a genera semnale speciale de recunoastere / rejectie a parolei, de acceptare a modificarilor in baza de date, de anuntare a unor operatii importante, tonul de ocupat sau defect.

Referitor la generarea tonurilor singulare, urmatorul tabel evidentiaza care sunt acestea si cum se combina pentru a forma tonurile duale:



1209 Hz

1336 Hz

1477 Hz

1633 HZ

696 Hz

1

2

3

A

770 Hz

4

5

6

B

852 Hz

7

8

9

C

941 Hz


0


D


Registrul de stare:

b0 - IRQ - intrerupere (starea ~);

b1 - TRANSMIT DATA , REGISTER EMPTY (BURST MODE ONLY) - daca este 1, s-a terminat pauza se asteapta date;

b2 - RECEIVE DATA, REGISTER FULL - s-a receptionat data valida;

b3 - DELAYED STEERING - 1 lipsa semnalului;

Selectarea unuia dintre acesti registrii se face prin intermediul semnalelor RS0 si .

Adresele pentru programarea circuitului MT 8880 sunt:

Adresa pentru citirea registrului de date receptionate este 20H.

Aceeasi adresa este folosita pentru scrierea registrului de date de transmis.

Adresa pentru a scrie in Control Register sau a citi din Status Register este 22H.

Rutinele de programare ale circuitului MT 8880:


a)     Functia de generare ton DTMF:

MOV AL, cod                           - se incarca registrul Al cu codul tonului (< = 15);

OUT 20H, Al                             - se incarca codul tonului in registrul de transmisie;

MOV AL, 01H                           - se incarca in registrul de control A urmatoarele informatii: validarea tonului de iesire; validarea modului DTMF; invalidarea intreruperilor;

LOOP IN AL, 22H           - se incarca acumulatorul cu informatiile din registrul de stare;

SHR AL,1                                   - se testeaza bitul b1;

JNC LOOP                                 - se asteapta transmisia tonului curent;

MOV AL, 4H                             - valideaza intreruperile;

AUT 22H, AL.


b) Receptionare cod DTMF:

LOOP: IN AL, 22H                 

MOV CL,03

SHR AL, (CL)

JNC LOOP                                 - se asteapta receptionarea unei date valide;

IN AL, 20H                                - daca s-a receptionat un cod valid, se incarca acesta in AL;

Interfata paralela programabila 8255

Circuitul 8255, produs de firma Intel, este realizat in tehnologie NMOS si de fapt face parte din familia procesorului 8080. este o interfata paralela.

Circuitul are 24 de terminale de intrare/iesire din care 16 sunt prevazute cu latch-uri, iar celelalte 8 prezinta tampoane. Aceste terminale sunt grupate in 3 porturi A, B si C. toate terminalele sunt compatibile TTL.

Fig. 5.


Programarea circuitului 8255.

La pornirea aparatului, un circuit de aducere la 0, reseteaza microprocesorul si circuitul 8255 prin intermediul semnalului de reset.

Circuitul este selectat atunci cand semnalul de este pus in 0.

Prin semnalele A0 si A1 se poate selecta unul dintre registrii A, B, C sau registrul de comanda, in felul urmator:

A0

A1

Se selecteaza

0

0

Portul A

0

1

Portul B

1

0

Portul C

1

1

Comanda

Adresele pentru selectia unuia din porturi sunt:

portul A : 60H

portul B : 62H

portul C : 64H

portul de comanda : 66H

Circuitul 8255 trebuie programat in modul 0 in care exista doua porturi de 8 biti, apoi prin programare, obtinem un port de patru biti de intrare si un port de patru biti iesire. Nu se utilizeaza datele de comanda ale transferului.

In exemplul nostru, portul A este folosit pentru a trimite date catre display si pentru a citi date de la tastatura. Portul B este port de iesire pentru sintetizatorul de voce, iar portul C este configurat astfel:

PC0 - senzor deteriorare

PC1 - senzor cutie plina

PC2 - senzor receptor

PC3 - senzor de moneda

PC4 - comanda clapetei de admisie spre iesire.


Initializarea circuitului 8255:

Pentru portul A de iesire:

MOV AL, 81H

AUT 66H, AL

Pentru portul A de intrare:

MOV AL, 91H

AUT 66H, AL

Citirea tastaturii:

MOV AL, 91H

AUT 66H, AL

IN AL, 60H

Rezultatul este in Al

Trimiterea unui caracter catre display:

MOV AL, 81H

AUT 66H, AL

MOV AL, 03H se transmite caracterul

AUT 60H, AL

Transmiterea unui cod catre sintetizatorul vocal:

MOV AL, 35H

AUT 62H, AL

Citirea starii telefonului:

IN AL, 66H.

In primi 4 biti ai registrului AL se gasesc informatiile despre starea telefonului care pot fi citite prin instructiuni de testare ai bitilor sau cu rotiri si sarituri conditionate.


Deschiderea clapetei de admisie a monedei in caseta:

MOV AL, 8H

AUT 66H, AL

Deschiderea clapetei de evacuare a monezii:

MOV AL, 0AH

AUT 66H, AL

Inchiderea clapetelor:

MOV AL, 09H

AUT 66H, AL

MOV AL, 0BH

AUT 66H, AL

Schema de conectare a circuitelor 8255 si MT 8880

Fig. 6.


Terminalele si semnificatiile lor


Datorita multiplexarii magistralei de date cu cea de adrese precum si rolului dublu pe care-l au o parte din terminalele microprocesorului, in functie de cele doua moduri de lucru ale sale, a fost posibila prezentarea sa intr-o capsula cu 40 terminale.

Terminalele:

AD15 - AD0: linii bidirectionale, cu trei stari ;

AD16/S3, AD17/S4,AD18/S5, AD19/S6: iesiri, cu trei stari;

BHE/S7: iesire cu trei stari;

RD: iesire cu trei stari;

READY: intrare pentru sincronizare cu memoriile sau porturile de I/E mai lente;

INTR: intrare pentru cereri de intrerupere mascabile;

TEST: intrare utilizata de instructiunea WAIT;

RESET: intrare pentru initializarea microprocesorului;

NMI: intrare pentru cereri de intrerupere nemascabila;

Fig.7.

CLK: intrare de tact , cu frecventa uzuala de 5 MHz si factor de umplere 1/3;

M//IO: iesire cu trei stari, avand acelasi rol ca si /S2 in modul maxim;

WR: iesire cu trei stari, activa atunci cand microprocesorul executa un ciclu de scriere;

INTA: iesire cu trei stari, care se activeaza atunci cand microprocesorul executa un ciclu de acceptare a unei cereri de intrerupere;

ALE: iesire, se activeaza atunci cand pe magistrala multiplexata exista informatia de adresa;

DT//R: iesire cu trei stari;

DEN: iesire cu trei stari care valideaza preluarea datelor de catre microprocesor;

HOLD: intrare pentru cereri de cedare a magistralei;

HLDA: iesire, raspuns la cererea HOLD, semnificand acceptarea acestei cereri si trecerea magistralelor proprii de adrese, date si control, in a treia stare;

S2, /S1, /S0: iesiri cu trei stari: sunt linii de stare care codifica tipul de ciclu pe care il va executa microprocesorul;

RQ//GT0, /RQ//GT1: linii bidirectionale folosite pentru cedarea magistralelor de catre microprocesor in urma unui dialog de tip cerere - raspuns - renuntare;

LOCK: iesire cu trei stari, care atunci cand se activeaza, indica faptul ca microprocesorul nu va raspunde nici unei cereri de cedare a magistralelor; semnalul poate fi activat prin program;

QS1, QS0: iesiri care indica exteriorului tipul de informatie preluata de unitatea de executie din sirul de asteptare in starea anterioara.

Pentru realizarea practica a unui sistem cu 8086 sunt necesare si alte dispozitive si circuite.


I 8284


Circuitul 8284 are rolul de a genera semnalele de ceas si de asemenea sincronizeaza semnalele de reset si ready cu ceasul sistemului CLK si genereaza semnale de RESET si READY.

Semnalul CLK are forma urmatoare:





Factorul de umplere K = 1/3, frecventa f/3.

La acest circuit se conecteaza un cristal de cuart ce se va folosi pentru a genera frecventa f.

De asemenea circuitul genereaza si alt semnal de ceas pCLK de frecventa f/2 si cu un factor de umplere 1/2 .

Fig. 8


I 8282


Acest circuit este un latch cu opt intrari si opt iesiri.

Fig. 9


Daca este 1 atunci iesirile sunt in starea de inalta impedanta.

Daca iesirile sunt activate, atunci semnalul STB care se conecteaza la ALE, este semnalul de strabatere pentru datele de pe iesire.


I8286


Sunt circuite buffer bidirectionale care in aceasta schema functioneaza ca amplificatoare de magistrala.

Fig. 10.


T: indica sensul in care informatia tranzverseaza buferul.

*: validarea iesirilor.

Alte semnale de comanda:

HOLD - se conecteaza la masa, neexistand circuite care sa ceara controlul magistralei

INT si NMI - nu exista cereri de intrerupere externe si vor fi puse la masa.






Implementarea soft


Memoria ROM contine programul conform caruia va lucra procesorul 8086, in plus contine o parte din baza de date a telefonului, precum si o parola, acestea fiind folosite la punerea sub tensiune pentru a asigura functionarea calculatorului chiar si dupa o intrerupere a alimentarii. La pornire, parola implicita este copiata din ROM in RAM si devine parola efectiva. Aceasta parola este 589589. utilizatorul are posibilitatea de a schimba aceasta parola ulterior.

Parola curenta este numerica, are 6 cifre si este pastrata in locatiile de memorie cu adresa 00080H - 00085H. la memoria cu adresa 00086H este pastrat un indicator al incidentei parolei introduse de utilizator cu cea curenta.

Pentru a evita blocarea telefonului atunci cand acesta asteapta actiuni ale utilizatorului, se apeleaza procedura BREAK, in ciclul de asteptare. Aceasta procedura, in cazul in care receptorul a fost pus in furca, are rolul de a initializa telefonul.


Alte rutine folosite:

TEL_DEF - aceasta rutina are rolul de a semnaliza centralei telefonice starea de defectiune a telefonului, si de asemenea afiseaza acest lucru pe display. Semnalizarea catre centrala se face intermitent cu un sunet de frecventa 1633 Hz. Clapeta de evacuare a monezii este deschisa. Subrutina DEF_EMIT emite tonul de defect.

CUT_PLI - daca cutia telefonului este plina, se afiseaza acest lucru pe display si prin rutina PLI_EMIT se emite catre centrala sunetul cu frecventa de 1209 Hz.

Aceste doua rutine sunt "plug-and-play", testeaza periodic starea telefonului si deci este posibila depanarea telefonului si colectarea banilor fara ca telefonul sa fie scos din functiune prin deconectare de la sursa de tensiune.

Dupa inlaturarea problemelor telefonul isi reia functionarea normala.

INIT                      - aceasta rutina are rolul de a initializa telefonul pentru a functiona la parametri doriti.

CLS                       - aceasta rutina are rolul de a sterge display-ul telefonului prin afisarea de doua randuri goale.

WR_CHR - rutina de afisa re a unui caracter pe ecran. Codul ASCII al caracterului trebuie plasat in registrul AL.

WR_STR - rutina de afisare a unui sir de caractere. In mod invariabil sirul are o lungime de 16 caractere, iar adresa primului caracter din sir trebuie plasat in registrul DI. Toate sirurile sunt mesaje standard si sunt plasate in memoria ROM.

ST_EMIT             - rutina de emisie pe linia telefonica a unui ton singular de catre MT 8880 in scopul unor semnalizari speciale (telefon defect, cutie cu bani plina, rejectia parolei introdusa de un abonat de la distanta). Codul tonului trebuie plasat in AL (se emit tonuri numai de pe linie).

DT - EMIT           - rutina de emisie a tonului DTMF obisnuit. In implementarea aceasta, caracterele speciale sunt folosite pentru a semnaliza diferite situatii precum:

A           - abonatul chemat este ocupat sau a inchis;

B           - soneria suna la chemat;

C           - semnalizeaza centralei ca se va genera numarul, de catre utilizator.

D           - ton sfarsit de convorbire;

- telefonul raspunde ca urmare a apelului extern;

- centrala semnalizeaza telefonului ca este prezent pe linia telefonica un apel de intrare.

DT_REC               - procedura obisnuita de receptie a unui ton DTMF.

DET_REC2           - procedura de receptie a unui ton DTMF atunci cand exista un apel extern.

CIT_TAS - rutina de citire a unui caracter de la tastatura.

CIT_PAR              - rutina de citire a parolei.

INFO1                  - rutina de introducere a datelor de catre utilizatorul local.

Organigrama

Este ilustrata in continuare.

In functie de cerintele alese prntru telefonul inteligent organigrama poate fi simplificata (in sensul reducerii acesteia ).






Programul


MT_DTREG                    equ 20H

MT_SCREG                     equ 22H

I 8255_A                         equ 60H

I 8255_B                         equ 62H

I 8255_C                         equ 64H

I 8255_COM                  equ 66H


TEL_DATA                      segment

assume ES: TEL_DATA

TELDIS db ,TELEF DISPONIBIL'

TELDEF      db ,TELEFON DEFECT'

TELOC           db ,TELEFON OCUPAT'

CUTPLI          db ,CUTIE PLINA'

PARGRE    db ,PAROLA GRESITA'

PAR COR   db ,PAROLA CORECTA'

PARREP db ,REPETATI PAROLA'

PARREJ     db ,ACCES INTERZIS'

VID                db ,'

CONTER    db ,CONVORBIRE OK'

INITPAR    db ,0006H'

ends


TEL_CODE                      segment

assume CS: TEL_CODE,

DS: 0080H,

SS: 7D00H.

mov AX, TEL_DATA

mov DS, AX

mov SI, offset INITPAR

mov AX, 0000H

mov ES, AX

mov DI, 0080H

mov CX, 589589

rep movsb //copiere in memoria RAM a parolei initiale//

mov AX, TEL_DATA

mov ES, AX //initializare registre segment//

mov AX, 0080H

mov DS, AX

BEGIN mov AX, 7D00H //initializarea telefonului//

mov SS, AX

in al, i 8255_C

SHR AL, 1 //testare deteriorare//

jnc BUG, 1

jmp TEL_DEF

BUG1 shrAL, 1 //testare cutie plina//

jnc BUG2

jmpCUT_PLI

BUG2mov AL, 0AH

out I 8255_COM, AL

mov DI, offset TELDIS //afisare mesaj telefon disponibil//

callWR_STR

shr AL, 1 //test receptor ridicat//

jcBUG3

BUG3 jmpORG2

mov AL, 0BH

out I 8255_C, AL

call CLS

LBG1shr AL, 1 //test moneda introdusa//

call BREAK

jnc LBG1

mov AL, 0DH //emisie ton de disc//

call ST_EMIT

mov SI, 0080H

call CIT_PAR //apel citire parola//

mov AX, (DX)

cmpAL, 00H //validare parola//

jc PAR_COR//parola corecta//

jmp PAR_GRE //parola incorecta//

PAR_COR mov DI, offset PAR_COR

call WR_STR //asteptare parola corecta//

call CIT_TAS//asteptare comanda//

cmp AL, 41H

jc ORG3

cmp AL, 42H

jcORG3

cmp AL, 43H

jcORG3

cmp AL, 44H

movAL, 0FH //anuntare centrala ca urmeaza un apel//

call DT_EMIT

pop AX

LBG2call CIT_TAS//se citeste cifra//

callDT_EMIT //se formeaza tonul corespunzator//

callBREAK

in AL, MT_SCREG //se asteapta raspuns//

mov AL, 03H

shr AL, (CL)

jncLBG2

callDT_REC //s-a primit raspuns//

cmp AL, 0DH

jcLBR//abonat ocupat//

cmp AL, 0EH

jnc LBRTON

LBR call BREAK //abonat ocupat sau deranjat//

jmpLBR

LBRTONcallDT_REC //suna soneria//

cmp AL, 0BH //astept ridicarea telefonului de catre cel sunat//

jncLBRTON

mov AL, 08H //s-a ridicat receptorul//

out I 8255_C, AL //se accepta moneda//

LBR2in AL, I 8255_C

shr AL,1

shr AL,1

shr AL,1

jnc LBR2//se asteapta sa se inchida telefonul//

movAL, 00H

call DT_EMIT //se emite tonul sfarsit de convorbire//

movDI, offset CONTER //se afiseaza pe display//

call WR_STR

LBR3 call BREAK

jmp LBR3

ORG3 movAL, 00H //utilizatorul modifica baza de date//

call DT_EMIT

LORG3call INFO1 //rutina modificare date//

inAL, I 8255_C

shr 1

shr 1

shr 1

jnc LORG3

LORG4call CLS //se sterge ecranul//

jmpLORG4

ORG2call DT_REC2 //apel extern//

cmp AL, 0CH

jnc AL_EST

jmp BEGIN //initializare daca nu exista apel extern//

AP_EXTmovSI, 0080H //exista apel//

xor AX, AX

mov DX, 0086H //initializare octet de verificare parola//

mov (DX), AX

mov CX, 0003H //citire parola//

LREC_PAR call DT_REC2

mov BH, AL

mov AX, (SI)

inc SI

inc SI

cmpBX, AX

loope LRECPAR

mov AX, 0001H

mov (DX), AX

loop LRECPAR

mov AX, (DX)

cmp AL, 00H

jc CONT

ERRORmov CX, 0020H //parola gresita//

LERRmov AL, 01H

callST_EMIT //emisie ton special//

mov AL, 0DH

call ST_EMIT

loop LERR

jmp BEGIN

CONT mov DI, offset TELOC //parola corecta //

callWR_STR//se afiseaza pe ecran//

callINFO2 //rutina modificare date//

call DT_REC2

cmp AL, 0DH

jnc CONT

jmp BEGIN

end



/// Rutinele folosite///


TEL_DEF mov AL, 0AH //rutina telefon defect//

out I 8255_C, AL //clapeta deschisa//

mov DI, offset TELDEF

call WE_STR//se afiseaza//

LTELDEF call DEF_EMIT

call PAUSE

jmpBEGIN

CUT_PLImov AL, 0AH //cutie monede plina//

outI 8255_C, AL

mov DI, offset CUTPLI

call WR_STR //se afiseaza//

call PLI_EMIT

call PAUSE

jmp BEGIN

PAR_GRE mov DI, ofset PARGRE //parola gresita//

callWR_STR

mov CX, 100H

LPARGRE call PAUSE

loopLPARGRE

call CIT_PAR //incercam din nou//

mov AX, (DX)

cmpAL, 00H

jnc BUG4

jmpPAR_COR //parola corecta//

BUG4 callBREAK //gresit din nou//

jmpBUG4

DEF_EMIT proc NEAR //emisie ton "defect"//

mov AL, 0DH

call ST_EMIT

ret

endp


PLI_EMIT proc NEAR

mov AL, 01H

call ST_EMIT

ret

endp


INIT procNEAR //initializarea telefonului//

mov AL, 91H

out I 8255_COM, AL

mov AL, 0DH

out MT_SCREG, AL

mov AL, 01H

out MT_SCREG, AL

mov AL, 09H

out I 8255_COM, AL

mov AL, 0AH

out 66H, AL

ret

endp


CLSproc NEAR //stergere display//

pushAX

mov DI, offset VID

callWR_STR

mov DI, offset VID

call WR_STR

pop AX

ret

endp


WR_STRprocNEAR//scriere sir de caractere//

pushAX

mov AX, 0AH

LWRSTRmovAL, (DI)

outI8255_A, AL

incDI

loop LWRSTR

pop AX

ret

endp


WR_CHRprec NEAR //afisare caracter//

push AX

mov AL, 81H

outI 8255_COM, AL

pop AX

out I 8255_A, AL

ret

endp


ST_EMITproc NEAR//emisie single-ton//

out MT_DTREG, AL

mov AL, 09H

out MT_SCREG, AL

mov AL, 12H

out MT_SCREG, AL

LST_EMITin AL, MT_SCREG

shr AL, 1

shr AL,1

jncLSTEMIT

mov AL, 04H

out MT_SCREG, AL

mov AL, 09H

out MT_SCREG, AL

mov AL, 00H

out MT_SCREG, AL

ret

endp


DT_EMITproc NEAR//emisie dual-ton//

out MT_DTREG, AL

mov AL, 01H

out MT_SCREG, AL

LDT_EMITin AL, MT_SCREG

shr AL, 1

shr AL,1

jncLDTEMIT

mov AL, 04H

out MT_SCREG, AL

ret

endp


DT_REC proc NEAR //receptie dual tone//

LDT_REC call BREAK

in AL, MT_SCREG

mov CL, 03H

shrAL, (CL)

jncLDTREC

in AL, NT_DTREC

ret

endp


DT_REC proc NEAR //rutina alternativa de receptie//

in AL, MT_SCREG

mov CL, 03H

shrAL, (CL)

jncLDTREC2

LDT_REC in AL, NT_DTREC

ret

endp


PAUSEproc NEAR //rutina de intarziere//

LPAUSE mov CX, 65533

looplpause

ret

endp


CIT_TASproc NEAR//citire tastatura//

LCIT_TAS mov AL, 91H

outI 8255_COM, AL

in AL, I 8255_A

cmp AL, 00H

jncLCT

call BREAK

LCT jmp LCITTAS

ret

endp


CIT_PARproc NEAR//citire parola//

xorAX, AX

movES, AX

movDI, 0087H

movSI, 0080H

movDX, 0086H

mov(DX), AX

movCX, 0003H

LCIT_PAR call CIT_TAS

movBL, AL

call CIT_TAS

movBH, AL

movAL, AH //afisare steluta pe display//

call WR_CHR

call PAUSE

movAX, (SI)

mov(DI), AX

inc DI

inc DI

inc SI

inc Si

cmpBX, AX

loope LCITPAR

movAX, 0001H

mov(DX), AX

loopLCITPAR

movAX, TEL_DATA

movES, AX

ret

endp


BREAK procNEAR

pushAX

in AL, I 8255_C

shr AL, 1

shr AL, 1

shr AL,1

jc RESTART

pop AX

ret

pop AX

jmp BEGIN

endp


INFO1 proc NEAR

LINF1 callCIT_TAS

cmpAL, 41H

jncLINF1

call CIT_PAR

movAX, 0000H

movDS, AX

movSI, 0086H

movES, AX

movDI, 0080H

movCX, 0006H

repmovsb

movAX, TEL_DATA

movES, AX

movAX, 0080H

movDS, AX

jmpLINF1

ret

endp


INFO2 proc NEAR

ret

endp

ends

end BEGIN