|
Electronica Telecomunicatii si Tehnologia Informatiei
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
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
A14
A13
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;
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