PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (maggio 2005) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : AT1_Chat.ASM /----------------[TxD][RxD]------------------\| ;| AUTORE : Giorgio OBER | ************ *********** ************** || ;| VERSIONE : maggio 2005 \------------------[COM1]--------------------/| ;| DESCRIZIONE : Organizza la TRASMISSIONE di Comandi AT+ da un Computer ad | ;| un Telefono Cellulare tramite le rispettive porte seriali | ;| (UART), con tecnica d'interrogazione (POLLING). | ;| /--------------------------------\ | ;| | COM1, 19200, N, 1, 8 | | ;| \--------------------------------/ | ;| Non Š previsto alcun protocollo di sincronizzazione (Sincro)| ;| [i caratteri AAH e FFH usati per la Ricetrasmissione tra 2]| ;| [Personal Computer non sono richiesti in questo progetto...]| ;|/-----------\/------------------------------------------------------------\| ;|| ||La tecnica di Trasmissione Š affidata alla procedura TxD_1. || ;|| ||La tecnica di Ricezione Š invece affidata ad una variante|| ;|| ||della procedura RxD_3 che, nell'attesa delle condizioni|| ;|| ||ottimali per la lettura del dato, consente al MAIN PROGRAM|| ;|| ||la verifica della pressione di un tasto (per poter terminare|| ;|| ||l'esecuzione del programma in assenza di dati in arrivo);|| ;|| NB: ||questa variante evita ora la ricezione anche in presenza di|| ;|| ||dati ricevuti soggetti ad errori di ricezione, situazione|| ;|| ||necessaria in caso di Telefonino non acceso. || ;|\-----------/\------------------------------------------------------------/| ;| Maggiori dettagli sono disponibili nella sezione dedicata | ;| alla porta seriale sul sito *** http://www.giobe2000.it *** | ;|/-----------\/------------------------------------------------------------\| ;|| ||Il sorgente Š strutturato per garantire il servizio anche|| ;|| ||per porte seriali diverse da COM1; basta sostituire il|| ;|| NB: ||valore della costante "COM_num" qui sotto con il numero|| ;|| ||della porta desiderata (2 per COM2, 3 per COM3 e 4 per COM4)|| ;|| ||e ricompliare: l'eseguibile ottenuto sar… automaticamente|| ;|| ||configurato per funzionare con la porta seriale desiderata.|| ;|\-----------/\------------------------------------------------------------/| ;\---------------------------------------------------------------------------/ Invio EQU 0DH ;codice del tasto ESC_ EQU 27 ;codice del tasto F1 EQU 3BH ;codice Scansione tasto F2 EQU 3CH ;codice Scansione tasto COM_num EQU 01H ;PORTA utilizzata = COM1 /--------------------------------\ ;EQU 02H ;PORTA utilizzata = COM2 |Scegli la porta COM desiderata | ;EQU 03H ;PORTA utilizzata = COM3 |[ default: programma per COM1 ] | ;EQU 04H ;PORTA utilizzata = COM4 \--------------------------------/ ;---------------------------------------------------------- ;/--------------------------------------------------------\ ;| Scegli la COSTANTE per la VELOCITA` desiderata | ;*--------*-------------------------------*---------------* ;|Costante|********** Baud RATE *********| Errore | ;*--------*-----------------------*-------*---------------* ;EQU 000CH ;|= 12 = (115200/12 ) = 9600.0 | 9600 | ---- | Baude EQU 0006H ;|= 6 = (115200/6 ) = 19200.0 | 19200 | ---- | ;EQU 0003H ;|= 3 = (115200/3 ) = 38400.0 | 38400 | ---- | ;EQU 0002H ;|= 2 = (115200/2 ) = 57600.0 | 56000 |(errore 2.86) | ;EQU 0001H ;|= 1 = (115200/1 ) =115200.0 |115200 | ---- | ;\--------------------------------*-------*---------------/ ;---------------------------------------------------------- ;/--------------------------------------------------------\ ;| Scegli la COSTANTE associata al PROTOCOLLO SERIALE | ;*---------[7654 3210]=03H--------------------------------* ;| default .... ..11 >>>>> 8 bit per il DATO | Protoc EQU 03H ;| .... ..10 >>>>> 7 bit per il DATO | ;| .... ..01 >>>>> 6 bit per il DATO | ;| .... ..00 >>>>> 5 bit per il DATO | ;*--------------------------------------------------------* ;| default .... .0.. >>>>> 1 bit di stop | ;| .... .1.. >>>>> 2 bit di stop | ;*--------------------------------------------------------* ;| ...0 1... >>>>> parit… dispari | ;| ...1 1... >>>>> parit… pari | ;| default ...x 0... >>>>> nessuna parit… | ;*--------------------------------------------------------* ;| ..0. .... >>>>> parit… disabilitata | ;| .0.. .... >>>>> Break disabilitato | ;| 0... .... >>>>> programmaz. del protocollo | ;\--------------------------------------------------------/ ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC ;/[nuova MACRO locale]------------------------------------------------\ ;|M_Corn Organizza la stampa di una cornice a video, predisponendo i | ;| parametri nei corretti registri, per la procedura RamCorn | ;\--------------------------------------------------------------------/ M_corn MACRO altezza,larghezza,riga,colonna,colore,tipo,ombra,salva MOV AH,altezza ;\[ altezza compresa cornice ] MOV AL,larghezza ;|[ larghezza compresa cornice ] MOV DH,riga ;|[ riga angolo in alto a sinistra ] MOV DL,colonna ;|[ colonna angolo in alto a sinistra ] MOV BL,tipo ;|[ tipo 0=tratto semplice; 1=tratto doppio] MOV BH,ombra ;|[ ombra 0=senza; 1=con ombreggiatura ] MOV CX,salva ;|[ salva RAM in cui salvare l'area coperta ] M_COLOR Colore ;|[ colore: colore della cornice e sfondo ] CALL RamCorn ;/ ENDM ;/[nuova MACRO locale]------------------------------------------------\ ;|M_Corn Recupera i caratteri salvati nella pagina alternativa,| ;| predisponendo i parametri nei corretti registri, per la| ;| procedura RamRecup alla quale, per il corretto recupero| ;| devono esser passati gli stessi parametri passati a RAMcorn| ;\--------------------------------------------------------------------/ M_recup MACRO altezza,larghezza,riga,colonna,salva MOV AH,altezza ;\[ altezza compresa cornice ] MOV AL,larghezza ;|[ larghezza compresa cornice ] MOV DH,riga ;|[ riga angolo in alto a sinistra ] MOV DL,colonna ;|[ colonna angolo in alto a sinistra ] MOV CX,salva ;|[ salva RAM in cui salvare l'area coperta ] CALL RamRecup ;/ ENDM ; LIBRERIA UTILIZZATA DAL PROGRAMMA [opzione WinASM altrimenti non necessaria] includelib c:\arch-lab\bin\GIOBE.LIB ;PROCEDURE ESTERNE UTILIZZATE dal PROGRAMMA [NEAR, dalla LIBRERIA ~GIOBE.LIB~] ;----------------------------------------------------------------------------- EXTRN CambiaCol:NEAR EXTRN BIOchr1:NEAR EXTRN RIEMPI:NEAR EXTRN BIOSmsg:NEAR EXTRN STAsp:NEAR EXTRN BIOScls:NEAR EXTRN SET_cur:NEAR EXTRN VIA_cur:NEAR EXTRN RIP_cur:NEAR EXTRN KEYwait:NEAR EXTRN Byt2Asc:NEAR EXTRN Wor2Dec:NEAR EXTRN RamCorn:NEAR EXTRN RamRecup:NEAR EXTRN Del_1000:NEAR EXTRN Del_2000:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC AT1_Chat PUBLIC _OUT ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP AT1_Chat ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 00H Titolo DB "Programmi per il Collaudo dei COMANDI AT su ",00H Titolo1 DB "COM1",00H Tema0 DB "AT1_Chat - Ricezione Comandi AT su " DB "COM1 - Protocollo: 19200,N,1,8 ",00H Tema1 DB " La RiceTrasmissione Š gestita in POLLING",00H Tema2 DB " Copyright www.giobe2000.it - ing. Giorgio OBER ",00H Nocom0 DB "La PORTA SERIALE desiderata, COM , ",00H Nocom1 DB "non Š",00H Nocom2 DB " disponibile",00H Centro1 DB "Caratteri Ascii Trasmessi",00H Centro2 DB "Caratteri Ascii Ricevuti",00H Centro3 DB "Bytes Trasmessi",00H Centro4 DB "Bytes Ricevuti",00H MENU01 DB "Inizia",00H MENU02 DB "Quit",00H MENU03 DB "ESC ",00H MENU04 DB " Risincronizza ",00H MENU05 DB "Aiuto",00H BytTxRx DB "[ ",00H Vuota01 DB " " Vuota02 DB " ",00H ;-------------------------------------------------------------------- Note_ DB "Questo eseguibile, ~AT1_Chat.COM~, deve essere in esecuzione",00H DB "sul Computer coinvolto nella comunicazione seriale con il",00H DB "Telefono Cellulare ",00H DB " ",00H DB "Non appena si preme il tasto ~Inizia~ Š subito possibile",00H DB "scambiare simultaneamente messaggi, non necessariamente AT.",00H DB " [non Š richiesto alcun carattere di sincronismo] ",00H ;-------------------------------------------------------------------- Testo04 DB "Controlla che il Telefono Cellulare sia acceso....",00H Testo05 DB "Visualizzazione Dati: F1 solo Ascii F2 Ascii & Bytes",00H Testo06 DB "F1",00H Testo07 DB "F2",00H ;-------------------------------------------------------------------- DepoMod DB 00H ;[DepoMod]=00 con "T" Computer locale in Trasmissione ;[DepoMod]=01 con "R" Computer locale in Ricezione PrntMod DB 00H ;[PrntMod]=00 mostra solo il valore ascii (default) ;[PrntMod]=01 mostra anche il valore esadecimale ;-------------------------------------------------------------------- NumRxD DW 0001H ; Numero di Bytes ricevuti DataRxD DB 00H RigRxDa DB 7 ;\Predispone la riga e la colonna di stampa corrente per ColRxDa DB 1 ;|i caratteri RxD AtrRxDa DB 0FH ;/Colore da usare nella stampa dei caratteri RxD RigRxDb DB 16 ;\Predispone la riga e la colonna di stampa corrente per ColRxDb DB 1 ;|i bytes RxD AtrRxDb DB 0FH ;/Colore da usare nella stampa dei bytes RxD NumTxD DW 0001H ; Numero di Bytes trasmessi DataTxD DB 00H ; Primo Carattere da trasmettere (ascii 00) RigTxDa DB 2 ;\Predispone la riga e la colonna di stampa corrente per ColTxDa DB 1 ;|i caratteri TxD AtrTxDa DB 0FH ;/Colore da usare nella stampa dei caratteri TxD RigTxDb DB 8 ;\Predispone la riga e la colonna di stampa corrente per ColTxDb DB 1 ;|i bytes TxD AtrTxDb DB 0FH ;/Colore da usare nella stampa dei bytes TxD ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;| PROCEDURA : BARRA | ;| DESCRIZIONE : Stampa un'intera riga di spazi | ;\---------------------------------------------------------------------------/ BARRA: M_CURSOR DH,0 MOV AL,' ' MOV CX,80 bar0: CALL BIOchr1 LOOP bar0 RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : DESKTOP | ;| DESCRIZIONE : Predispone il Piano di Lavoro per il Test Seriale. | ;| Se il valore ricevuto in ingresso in SI Š 0000H la porta| ;| seriale desiderata NON Š presente nel sistema; la procedura| ;| segnala l'errore e pone automaticamente fine al test,| ;| tornando al DOS (rientro a livello _OUT) con un artificio. | ;\---------------------------------------------------------------------------/ DESK___:MOV AL,'°' ;\ M_COLOR 71H ;|Predispone il Piano di lavoro CALL Riempi ;|su tavola zigrinata CALL VIA_cur ;/ M_COLOR 70H ;\ MOV DH,0 ;| CALL BARRA ;| M_msgC Titolo, 0,12,70H;|Intestazione M_COLOR 74H ;| M_msgN Titolo1 ;/ MOV DH,24 ;\ CALL BARRA ;|Menu M_msgC MENU02,24,70,70H;| M_Chr 'Q',24,70,74H ;/ RET ;--------------------------------------------------------------------- DESKTOP:PUSH SI ;\In ingresso SI=0000 se la porta richiesta NON ;/Š presente nel sistema... CALL BIOScls ;\Clearscreen necessario per garantire il ;/lampeggio dei caratteri anche in ambiente XP CALL DESK___ ;\Predispone il Piano di lavoro su tavola ;/zigrinata con l'Intestazione e il primo Menu ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 5 , 69 , 11 , 5 , 1EH , 01 , 01 ,1000H POP SI ;\ CMP SI,0000H ;| JNZ DESK_0 ;| M_msgC Nocom0,12,13,1FH;|Recupera il valore iniziale di SI; se vale 0 M_COLOR 9FH ;|la porta richiesta NON Š presente nel sistema; M_msgN Nocom1 ;|se SI contiene 0000 la porta NON Š installata: M_COLOR 1FH ;|si segnala l'errore e si termina senza test M_msgN Nocom2 ;| MOV AL,CS:[depPOR];|"La PORTA SERIALE desiderata, COM , ADD AL,30H ;| non Š disponibile" M_Chr AL,12,45,1EH ;| M_Chr AL, 0,61,74H ;| <<<< Visualizza anche nella barra del Titolo CALL KEYwait ;/ POP AX ;\NB: recupera con POP AX la posizione pendente JMP _OUT ;|nello stack dovuta alla chiamata "CALL DESKTOP ;/per poter tornare con JMP invece che con "RET" ;--------------------------------------------------------------------- DESK_0: M_msgC Tema0,12, 7,1FH;\Messaggio di test eseguibile M_msgC Tema1,14, 7,1FH;| MOV AL,CS:[depPOR];|"TRASMISSIONE SERIALE su COM1 - ADD AL,30H ;| protocollo HW:19200,N,1,8" M_Chr AL,12, 9,1FH ;| M_Chr AL,12,45,1EH ;| M_Chr AL, 0,61,74H ;/ <<<< Visualizza anche nella barra del Titolo M_msgC MENU01,24,7,70H;\/--------------------------------------------\ M_Chr 'I',24, 7,74H ;||************ Primo Menu interno ************| M_msgC MENU05,24,16,70H;|\--------------------------------------------/ M_Chr 'A',24,16,74H ;| DESK_1: CALL KEYwait ;| AND AL,11011111B ;|Rimane in attesa dei tasti del Menu principale CMP AL,'I' ;| con "I" inizia il Test JZ DESK_2 ;| CMP AL,'A' ;| con "A" Aiuto JZ Note ;| CMP AL,'Q' ;| con "Q" torna al DOS JNZ DESK_1 ;| JMP _OUT ;/ ;--------------------------------------------------------------------- ;/---------------------------------------------\ ;| Descrive il funzionamento del programma. | ;\---------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva Note: M_corn 9 , 64 , 8 , 7 , 31H , 01 , 01 ,2000H LEA SI,Note_ M_COLOR 3FH MOV CX,7 MOV DH,9 MOV DL,9 Note1: M_CURSOR DH,DL CALL BIOSmsg INC SI INC DH LOOP Note1 MOV AL,CS:[depPOR];\ ADD AL,30H ;| M_Chr AL,9 ,31,3FH ;/ CALL KEYwait ;M_recup altezza,larghezza,riga,colonna,salva M_recup 9 , 64 , 8 , 7 ,2000H JMP DESK_1 ;--------------------------------------------------------------------- DESK_2:M_msgC Testo05,24,7,70H;\/--------------------------------------------\ M_msgC Testo06,24,30,74H;||*********** Secondo Menu interno ***********| M_msgC Testo07,24,45,74H;|\--------------------------------------------/ DESK_3: CALL KeyWait ;|Rimane in attesa dei tasti del Menu principale AND AL,11011111B ;| CMP AL,'Q' ;| con "Q" torna al DOS JNZ DESK_4 ;| JMP _OUT ;| DESK_4: CMP AL,00H ;| JNZ DESK_3 ;| CMP AH,F1 ;| Gestione tasto : solo Ascii JNZ DESK_5 ;| MOV Byte Ptr CS:[PrntMod],00;| Stampa dei dati solo in Ascii JMP SHORT DESK_7 ;| DESK_5: CMP AH,F2 ;| Gestione tasto : Ascii & Bytes JNZ DESK_3 ;| MOV Byte Ptr CS:[PrntMod],01;| Stampa dei dati in Asci e Esadecimale ;JMP SHORT DESK_7 ;/ DESK_6: CALL DESK___ ;\Predispone il Piano di lavoro su tavola ;/zigrinata con Intestazione e primo Menu DESK_7:M_msgC Vuota01,24,7,74H; ;M_recup altezza,larghezza,riga,colonna,salva M_recup 5 , 69 , 11 , 5 ,1000H ;--------------------------------------------------------------------- ;/---------------------------------------------\ ;|Inizializza le variabili - Test Seriale| ;\---------------------------------------------/ MOV Word Ptr CS:[NumRxD],01; Numero di Bytes Ricevuti MOV Byte Ptr CS:[DataTxD],00; Primo Carattere da trasmettere (ascii 00) MOV Byte Ptr CS:[RigRxDa],07;\Predispone la riga e la colonna di stampa cor- MOV Byte Ptr CS:[ColRxDa],01;|rente per i caratteri RxD MOV Byte Ptr CS:[RigRxDb],16;|Predispone la riga e la colonna di stampa cor- MOV Byte Ptr CS:[ColRxDb],01;|rente per i bytes RxD MOV Byte Ptr CS:[AtrRxDb],0FH;/Colore da usare nella stampa dei caratteri RxD MOV Word Ptr CS:[NumTxD],01; Numero di Bytes Trasmessi MOV Byte Ptr CS:[RigTxDa],02;\Predispone la riga e la colonna di stampa cor- MOV Byte Ptr CS:[ColTxDa],01;|rente per i caratteri TxD MOV Byte Ptr CS:[RigTxDb],08;|Predispone la riga e la colonna di stampa cor- MOV Byte Ptr CS:[ColTxDb],01;|rente per i bytes TxD MOV Byte Ptr CS:[AtrTxDb],0FH;/Colore da usare nella stampa dei caratteri TxD RET ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva DESK_9: M_corn 3 , 69 , 3 , 5 , 4CH , 01 , 01 ,1000H M_msgC Testo04,4,13,4FH; "Telefono Cellulare in linea - Digita i comandi" M_msgC Vuota02,24,70,70H CALL Del_1000 CALL Del_2000 M_msgC MENU03,24,70,74H;\"ESC" M_msgC Testo06,24,7,74H;|"F1" M_COLOR 70H ;| M_msgN MENU04 ;|" Risincronizza" M_COLOR 74H ;/ RET ;--------------------------------------------------------------------- DESK_A: CALL BIOScls ;\/--------------------------------------------\ ;||***** Messaggio di commiato in USCITA ***** | ;*\--------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 5 , 69 , 11 , 5 , 1EH , 01 , 01 ,1000H M_msgC Tema0,12, 7,1FH;\ MOV AL,CS:[depPOR];| ADD AL,30H ;| Messaggio di chiusura M_Chr AL,12, 9,1FH ;| M_Chr AL,12,45,1EH ;| M_Chr AL, 0,61,74H ;| M_msgC Tema2,14, 9,1FH;/ RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : INIserial | ;|DESCRIZIONE: Seleziona automaticamente la porta seriale COM predisposta dal| ;| valore della costante "COM_num" (per default EQU 01H= COM1), e| ;| se la porta seriale desiderata NON Š presente nel sistema,| ;| lascia in uscita in SI il valore 0000H; altrimenti lascia in| ;| SI l'indirizzo Base dell'UART sotto controllo ([port_8]= 03F8H| ;| o 02F8H o 03E8H o 02E8H) e rende facilmente reperibili TUTTI i| ;| Registri della serie virtualizzandoli con altrettante variabili| ;| /------*-----*-----*-----*-----*-----------------------------\| ;| |******| COM1| COM2| COM3| COM4|Descrizione || ;| *------*-----*-----*-----*-----*-----------------------------*| ;| |port_8|03F8H|02F8H|03E8H|02E8H|Scritt/Lett DATO -LSBdivisore|| ;| |port_9|03F9H|02F9H|03E9H|02E9H|Abilitaz Interruz-MSBdivisore|| ;| |port_A|03FAH|02FAH|03EAH|02EAH|Identif interruzioni || ;| |port_B|03FBH|02FBH|03EBH|02EBH|Registro controllo LINEA || ;| |port_C|03FCH|02FCH|03ECH|02ECH|Registro controllo MODEM || ;| |port_D|03FDH|02FDH|03EDH|02EDH|Registro stato LINEA || ;| |port_E|03FEH|02FEH|03EEH|02EEH|Registro stato del MODEM || ;| \------*-----*-----*-----*-----*-----------------------------/| ;| Inizializza inoltre: | ;| a) la velocit… di ricetrasmissione caricando il divisore a 16| ;| bit, predisposto dalla costante "Baude" (default EQU 000CH=| ;| 19200baud) nei Registri [port_9]=MSB e [port_8]=LSBdivisore| ;| b) il valore dei parametri desiderati per il protocollo HW, in| ;| in accordo con le scelte suggerite dalla costante "Protoc"| ;| (default EQU 03H= 8 bit di dato e 1 di stop,nessuna parit…)| ;| c) il valore del Registro di abilitazione delle Interruzioni,| ;| [port_9] Š fissato a 00H: in questo modo nessun evento se-| ;| riale produrr… richiesta d'interruzione sulla linea dedica-| ;| ta IRQ3 o IRQ4 e non sar… necessario predisporre la relati-| ;| va procedura di servizio (rispettivamente INT0BH o INT0CH) | ;| d) il valore del Registro di controllo MODEM, [port_C], Š fis-| ;| sato a 03H: in questo modo sono attivi i segnali di tipici| ;| del MODEM, "Data Terminal Ready" e "Request To Send" | ;\---------------------------------------------------------------------------/ depPOR DB COM_num ; Numero della porta COM da controllare (1, 2, 3 o 4) depVEL DW Baude ; Valore n del divisore di Baud RATE necessario per ; stabilire la velocit… di Ricetrasmissione = 115200Hz/n depTIP DB Protoc ; Byte ricostruito in accordo con il desiderato ; numero di bit di dato, di stop e di (eventuale) parit… ;/-----*-----*-----*-----*------------------------------\ ;| COM1| COM2| COM3| COM4|Descrizione | ;*-----*-----*-----*-----*------------------------------* port_8 DW ? ;|03F8H|02F8H|03E8H|02E8H|Scritt/Lett DATO - LSBdivisore| port_9 DW ? ;|03F9H|02F9H|03E9H|02E9H|Abilitaz Interruz- MSBdivisore| port_A DW ? ;|03FAH|02FAH|03EAH|02EAH|Identif interruzioni | port_B DW ? ;|03FBH|02FBH|03EBH|02EBH|Registro controllo LINEA | port_C DW ? ;|03FCH|02FCH|03ECH|02ECH|Registro controllo MODEM | port_D DW ? ;|03FDH|02FDH|03EDH|02EDH|Registro stato LINEA | port_E DW ? ;|03FEH|02FEH|03EEH|02EEH|Registro stato del MODEM | ;\-----*-----*-----*-----*------------------------------/ ;---------------------------------------------------------------------------- ;/------[PRIMA FASE]---------------------------------------------------------\ ;| Inizializzazione dei REGISTRI della PORTA SERIALE | ;\---------------------------------------------------------------------------/ INIserial: PUSH ES ;\Assume in AX l'indirizzo BASE della porta MOV AX,0000H ;|seriale suggerita dalla variabile [depPOR], MOV ES,AX ;|a sua volta predisposta con il valore della MOV SI,0400H ;|costante "COM_num" (per default EQU 01H=COM1), MOV AL,CS:[depPOR];|estraendolo dalle locazioni dell'Area di comu- DEC AL ;|nicazione BIOS: le prime sue 8 locazioni sono SHL AL,1 ;|predisposte in fase di bootstrap ai valori: MOV AH,00H ;| /-------------------------------------------\ ADD SI,AX ;| |0000:0400H - Porta Seriale 1 (COM1) 03F8H | MOV AL,ES:[SI] ;| |0000:0402H - Porta Seriale 2 (COM2) 02F8H | INC SI ;| |0000:0404H - Porta Seriale 3 (COM3) 03E8H | MOV AH,ES:[SI] ;| |0000:0406H - Porta Seriale 4 (COM4) 02E8H | POP ES ;| \-------------------------------------------/ ;/se tutte i possibili UART sono presenti... CMP AX,0000H ;\ JNZ INIse_ ;|Se AX contiene 0000 la porta desiderata NON Š MOV SI,AX ;|installata: si torna immediatamente con SI=0 RET ;/ ;--------------------------------------------------------------------- INIse_: MOV CS:[port_8],AX;\ INC AX ;|Altrimenti inizializza le 7 variabili che MOV CS:[port_9],AX;|saranno utilizzate per individuare i Registri INC AX ;|della porta seriale desiderata; per la COM1: MOV CS:[port_A],AX;| INC AX ;|[port_8]=03F8H Registro Scrittura/Lettura DATO MOV CS:[port_B],AX;|[port_9]=03F9H Abilitazione interruzioni INC AX ;|[port_A]=03FAH Identificatore interruzioni MOV CS:[port_C],AX;|[port_B]=03FBH Registro di controllo LINEA INC AX ;|[port_C]=03FCH Registro di controllo MODEM MOV CS:[port_D],AX;|[port_D]=03FDH Registro di stato linea seriale INC AX ;|[port_E]=03FEH Registro stato MODEM MOV CS:[port_E],AX;/ ;/------[SECONDA FASE]-------------------------------------------------------\ ;| Inizializzazione della VELOCITA` di RICETRASMISSIONE SERIALE | ;\---------------------------------------------------------------------------/ ;\/-[port_B]-----------------------------------\ ;|| Registro di controllo della LINEA | ;|\--------------------------------------------/ ;|Inizia la programmazione dell'UART: per poter MOV DX,CS:[port_B];|accedere ai registri divisori di BaudRate Š MOV AL,80H ;|necessario anzitutto porre a "1" il bit7 OUT DX,AL ;|di [port_B]: con questa predisposizione ;|possono ora essere introdotti i corretti ;|valori per il divisore di baud rate: ;| "Baud Rate-lo", su [port_8] e ;/ "Baud Rate-hi", su [port_9] ;\/--------------------------------------------\ ;|| AX= fattore di divisione [115200/costante] | ;|\--------------------------------------------/ ;|Prepara in AX (AL=LSB, AH=MSD) la costante di ;|divisione necessaria per dividere il clock ad ;|alta frequenza (115200Hz) fornito all'UART (a ;|partire dalla frequenza di norma applicata, di ;|1.8432 MHz, LOCALMENTE predivisa per 16) al ;|fine di garantire la desiderata velocit… di ;|RICE-TRASMISSIONE (es:19200 bps =19200 baud) ;|/--------------------------------------------\ ;||Il valore del divisore a 16 bit Š suggerito| MOV AX,CS:[DepVEL];||dalla variabile [DepVel], a sua volta predi-| ;||sposta con il valore della costante "Baude"| ;||(default EQU 000CH=19200baud) | ;|\--------------------------------------------/ ;|Si ricorda che l'UART contiene un generatore ;|programmabile di BAUD RATE in grado di tratta- ;|re qualunque frequenza da 0 a 3.1 MHz; normal- ;|mente la frequenza applicata Š di 1.8432 MHz ;|o, talvolta, quella due terzi pi— grande, ;|3.072 MHz), su cui viene operata immediatamen- ;|te una predivisione per 16, cosicch‚ la co- ;|stante descritta andr… a dividere effettiva- ;|mente la frequenza di 115200 Hz, generando la ;/desiderata frequenza di ricetrasmissione ;\/-[port_8]-----------------------------------\ ;|| Registro divisore Baud RATE (parte bassa) | MOV DX,CS:[port_8];|\--------------------------------------------/ OUT DX,AL ;|Se su [port_B] il bit7="1" la porta [port_8] ;/serve come Registro divisore Baud RATE (low) ;\/-[port_9]-----------------------------------\ MOV AL,AH ;|| Registro divisore Baud RATE (parte alta) | MOV DX,CS:[port_9];|\--------------------------------------------/ OUT DX,AL ;|Se su [port_B] il bit7="1" la porta [port_9] ;/serve come Registro divisore Baud RATE (high) ;/-[NB]----------------------------------------\ ;|se invece su [port_B] il bit7="0" la prima| ;|porta [port_8] serve come BUFFER di trasmis-| ;|sione (in LETTURA) o di ricezione (in SCRIT-| ;|TURA) e la seconda porta [port_9] serve come| ;|Registro di Abilitazione Interruzioni | ;\---------------------------------------------/ ;/------[TERZA FASE]---------------------------------------------------------\ ;| Inizializzazione delle CARATTERISTICHE di RICETRASMISSIONE SERIALE | ;\---------------------------------------------------------------------------/ ;\/-[port_B]-----------------------------------\ ;|| Registro di controllo della LINEA | ;|\--------------------------------------------/ ;|Viene ricostruito il byte da spedire alla por- ;|ta [port_B], che rappresenta le caratteristi- ;|che desiderate, cioŠ il Numero di bit per DATO ;|il Numero di bit di STOP e la presenza del Bit ;|di Parit…; poich‚ la programmazione della ;|velocit… di RICETRASMISSIONE Š gi… stata ;|eseguita Š necessario anche riporre a "0" il ;|bit7 di tale byte;di norma si pone a "0" anche ;|il bit6 (se ="1", impostazione di break, il ;|dato di output seriale Š forzato alla condi- ;|zione di SPACE (0 logico) indipendentemente da ;|ci• che l'UART intende trasmettere) e il bit5 ;|(se = "1" il bit di parit… viene forzato ad un ;|valore costante, in funzione della programma- ;|zione dei bit4/bit3; altrimenti il bit di ;|parit… conserva il suo significato) ;|/--------------------------------------------\ ;||La combinazione di bit corrispondente alle| MOV DX,CS:[port_B];||nostre esigenze Š suggerita dalla variabile| MOV AL,CS:[DepTIP];||[DepTip], a sua volta predisposta con il va-| OUT DX,AL ;||lore della costante "Protoc" (default EQU 03| ;||= 8 bit di dato e 1 di stop, nessuna parit…)| ;|\--------------------------------------------/ ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ ;|[port_B]| 0 | 0 | 0 | x | 0 | 0 | 1 | 1 | 03H ;| \---*---*---*---*---*---*---*---/ ;|Protocollo/ | | | | | \---*-8 dato ;|Break disab.--/ | | | \-----1 bit stop ;/Parit… disab.-----/ \---*-----nessuna parit… ;/------[QUARTA FASE]--------------------------------------------------------\ ;| Inizializzazione del REGISTRO di CONTROLLO del MODEM | ;\---------------------------------------------------------------------------/ ;\/-[port_C]-----------------------------------\ ;|| Registro di controllo del MODEM | ;|\--------------------------------------------/ ;|Normalmente il Registro di MODEM va inizializ- ;|zato a 03H e poi non si tocca pi—; tale predi- ;|sposizione bit0 e bit1 a "1") attiva i segnali ;|di controllo tipici del MODEM, "Data Terminal ;|Ready" e "Request To Send": in questo modo il ;|il computer DTE (UART) avvisa il modem DCE che ;|Š regolarmente collegato alla linea di comuni- ;|cazione, che Š pronto a trasmettere o ricevere ;|dati (DTR) e che dispone di dati ed č pronto a ;|trasmetterglieli (RTS): il bit2 OUT1 di questo ;|registro (uscita ausiliaria destinata utente) ;|non Š usato, mentre il bit3 (OUT2=altra uscita ;|ausiliaria destinata utente) DEVE essere posta MOV DX,CS:[port_C];|a "1" solo se si desidera consentire al- MOV AL,03H ;|l'INTERRUZIONE generata dall'UART di raggiun- OUT DX,AL ;|gere il bus del sistema (per essere eventual- ;|mente controllata dal gestore delle interru- ;|zioni, 8259); infine il bit4 deve essere a 0, ;|in condizioni normali; se forzato a 1 la porta ;|seriale (UART) si pone in uno stato molto par- ;|ticolare, LookBack Mode, straordinariamente ;|utile per collaudare i nostri programmi ma del ;|tutto inopportuno in regolare ricetrasmissione ;|i bit5, bit6 e bit7 sono sempre a 0 (non usati ;|da nessuna versione di UART) ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ ;|[port_C]| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 03H ;| \---*---*---*---*---*---*---*---/ ;|non usati-*---*---/ | | | | \DTR on ;|no LookBack Mode------/ | | \----RTS on ;/INT disabilitate----OUT2--/ \OUT1-non usata ;/------[QUINTA FASE]--------------------------------------------------------\ ;| Inizializzazione di ABILITAZIONE delle INTERRUZIONI SERIALI | ;\---------------------------------------------------------------------------/ ;\/-[port_9]-----------------------------------\ ;|| Registro di abilitazione delle INTERRUZIONI| ;|\--------------------------------------------/ ;|Vengono specificati solo gli eventi che si ;|desidera utilizzare per innescare il meccani- ;|smo dell'interruzione, in grado di attivare la ;|linea IRQ3/IRQ4 dedicata all'UART coinvolto, ;|avvisando cosŤ il controllore delle interru- ;|zioni 8259 che far… partire la relativa proce- ;|dura di servizio BIOS, INT 0BH o INT 0CH; se ;|NON SI DESIDERA far riferimento alle tecniche ;|d'interruzione tutti i bit di questo registro ;|sono lasciati a 0; altrimenti i bit significa- MOV DX,CS:[port_9];|tivi sono: bit0="1" abilita interrupt quando MOV AL,00H ;|c'Š un DATO PRONTO in RICEZIONE; bit1="1" abi- OUT DX,AL ;|lita interrupt quando il registro di TRASMIS- RET ;|SIONE Š VUOTO (DATO TRASMESSO); il bit2="1" ;|abilita interrupt se il registro di stato non ;|Š pi— a 00H (ERRORI in RICEZIONE o RICEVUTA ;|condizione di BREAK); il bit3="1" abilita un ;|interrupt per cambiamento dello stato del ;|MODEM. Se su [port_B] il bit7="0" la porta ;|[port_9] serve come Registro di Abilitazione ;|delle Interruzioni: con i bit7öbit4 tutti a ;|"0" tutte le interruzioni da parte della ;|SERIALE sono disabilitate ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ ;|[port_9]| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00H ;| \---*---*---*---*-no*-no*-no*-no/ ;|non usati-*---*---*---/ | | | | RxD ;|Variazione Stato Linea----/ | | \-pieno ;/Variazione Registro Modem-----/ \-TxD vuoto ;/---------------------------------------------------------------------------\ ;| /--------------------------------------------\| ;| PROCEDURA : TxD_1 | ************* Versione 01 ************* || ;| \--------------------------------------------/| ;| DESCRIZIONE : Trasmette sulla PORTA SERIALE il byte fornito in AL, aspet-| ;| tando le condizioni ottimali per consentire la TRASMISSIONE| ;| del dato desiderato (cioŠ che il "Registro di memorizzazione| ;| del trasmettitore" sia VUOTO) | ;\---------------------------------------------------------------------------/ TxD_1: MOV BL,AL ; Salva il carattere da trasmettere in BL ;\/-[port_D]-----------------------------------\ ;|| Registro di stato della LINEA SERIALE | ;|\--------------------------------------------/ ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ ;|[port_D]| x | x | 1 | x | x | x | x | x | 20H ;| \---*---*---*---*---*---*---*---/ ;| \-[port_8] o FIFO Tx vuoto MOV DX,CS:[port_D];|Controlla lo stato della linea seriale per TxD101: IN AL, DX ;|vedere se la porta seriale Š pronta per la TEST AL,20H ;|TRASMISIONE di un NUOVO DATO (in questo caso JZ TxD101 ;|il bit5 del "registro di stato" Š a "1", ad ;|indicare che il "Registro di memorizzazione ;|del trasmettitore" Š VUOTO; solo ora il dato ;|successivo da trasmettere pu• essere collocato ;|in uscita (cioŠ proprio in quel registro) il ;|che mette di nuovo automaticamente a "0" il ;|bit5 del registro di stato finch‚ il "registro ;|di memorizzazione del trasmettitore" Š pronto ;/ad accettare un altro carattere ;\/-[port_8]-----------------------------------\ ;|| Registro BUFFER TRASMISSIONE (in SCRITTURA)| MOV DX,CS:[port_8];|\--------------------------------------------/ MOV AL,BL ;|In trasmissione la porta [port_8] costituisce OUT DX,AL ;|il registro BUFFER di TRASMISSIONE: il codice ;|attualmente presente il BL viene spedito sulla ;/porta seriale RET ;/---------------------------------------------------------------------------\ ;| /--------------------------------------------\| ;| PROCEDURA : RxD_3_ | ******** Versione 03 - VARIANTE ******** || ;| \--------------------------------------------/| ;| DESCRIZIONE : Riceve un byte dalla PORTA SERIALE lasciandolo in AL, aspet-| ;| tando le condizioni ottimali per consentire la ricezione del| ;| dato desiderato (cioŠ che la linea sia libera); se la proce-| ;| dura Š terminata dopo la ricezione di un dato lascia AH=00H;| ;| altrimenti (dato non pronto) lascia AH=01H. | ;|/-----------\ | ;|| | Questa variante evita ora la ricezione anche in presenza di| ;|| NB: | dati ricevuti soggetti ad errori di ricezione, situazione| ;|| | necessaria in caso di Telefonino non acceso, imponendo anche| ;|\-----------/ in questo caso la sua terminatazione con AH=01H. | ;\---------------------------------------------------------------------------/ RxD_3_: MOV DX,CS:[port_D];\/-[port_D]-----------------------------------\ ;|| Registro di stato della LINEA SERIALE | ;|\--------------------------------------------/ ;|Controlla lo stato della linea seriale per ve- IN AL,DX ;|dere se c'Š un DATO RICEVUTO PRONTO (bit0="1") TEST AL,1EH ;|\Variante: evita false ricezioni se la COM1 JNZ RxD300 ;|/non Š il linea (errori in ricezione) TEST AL,01H ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ JNZ RxD301 ;|[port_D]| x | x | x | B | E | E | E | 1 |01H ;| \---*---*---*-*-*-*-*-*-*-*-*-*-/ ;| se 1=rilevato break -/ | | | | ;| se 1=errore framing -----/ | | | ;| se 1=errore parit… ---------/ | | ;| se 1=errore overrun -------------/ | ;/ Dato ricevuto pronto ----------------/ RxD300: MOV AH,01H ;\Se invece non Š stato rilevato alcun Nuovo RET ;/Dato Ricevuto si torna con AH = 01 ;\/-[port_8]-----------------------------------\ RxD301: MOV DX,CS:[port_8];|| Registro BUFFER di RICEZIONE (in LETTURA) | IN AL,DX ;|\--------------------------------------------/ ;/Legge in AL il DATO PRONTO in RICEZIONE MOV AH,00H ;\Se il Dato in AL Š utilizzabile lascia AH=00H RET ;/ ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Campi [***** VERSIONE RIADATTATA PER COMANDI AT **********] | ;| DESCRIZIONE : Predispone i 2 riquadri di Ricetrasmissione DATI | ;\---------------------------------------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva Campi: M_corn 4 , 80 , 1 , 0 , 0AH , 00 , 00 ,2000H M_Chr '[', 1, 7,0AH ;\ M_COLOR 0AH ;| Primo campo: M_msgN Centro1 ;| [Caratteri Ascii TRASMESSI] MOV AL,']' ;| CALL BIOchr1 ;/ M_COLOR 70H ;\ MOV DH,5 ;| CALL BARRA ;/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 18 , 80 , 6 , 0 , 0AH , 00 , 00 ,2000H M_Chr '[', 6, 7,0AH ;\ M_COLOR 0AH ;| Secondo campo: M_msgN Centro2 ;| [Caratteri Ascii RICEVUTI] MOV AL,']' ;| CALL BIOchr1 ;/ CMP Byte Ptr CS:[PrntMod],00;\Mostra solo il valore ascii (default) del dato JZ Campi2 ;|Ricevuto CALL RxDbyte ;/ Campi2: RET ;---------------------------------------------------------------------- RxDbyte:MOV CX,78 ;\ M_CURSOR 15,1 ;| MOV AL,'-' ;| Secondo campo: RxDby3: CALL BIOchr1 ;| linea intermedia LOOP RxDby3 ;| M_Chr '*',15, 0,0AH ;| M_Chr '*',15,79,0AH ;/ M_Chr '[',15, 7,0AH ;\ M_msgN Centro4 ;| Secondo campo: MOV AL,']' ;| [Bytes RICEVUTI] CALL BIOchr1 ;/ RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : CheckPos [*** Accessorio per StampaTxD e StampaRxD *****] | ;| DESCRIZIONE : Provvede a spostare verso l'alto di una riga i caratteri | ;| contenuti nella finestra di visualizzazione dei caratteri | ;| ascii Ricevuti dal Telefono Cellulare. | ;| L'area da trattare Š compresa tra l'angolo alto a sinistra | ;| (colonna 1 e riga passata in ingresso da BL) e quello in | ;| basso a destra (colonna 78 e riga passata in ingresso in CH)| ;\---------------------------------------------------------------------------/ CheckPos: ;\Provvede a spostare verso l'alto di una riga i PUSH DX ;|caratteri contenuti nella finestra compresa PUSH AX ;|tra l'angolo alto a sinistra (indicato da CH MOV DH,CH ;|riga e CL colonna) e quello in basso a destra MOV DL,78 ;|(inidicato da DH riga e DL colonna); il numero MOV CH,BL ;|di righe su cui Š effettuato lo scrolling dal MOV CL,1 ;|basso verso l'alto all'interno della finestra MOV AL,1 ;|Š fornito in AL; l'eventuale testo allocato MOV AH,06H ;|nella riga superiore esce dalla parte alta INT 10H ;|della finestra e viene ovviamente perduto POP AX ;|mentre in basso viene aggiunta una nuova riga POP DX ;|vuota, cioŠ riempita di spazi con colore ;/indicato da BH. DEC DH ;\Le coordinate di stampa sono riportate MOV CL,CS:[AtrRxDa];|nell'angolo in basso a sinistra, sulla riga ;/appena aggiunta dalla procedura di scrolling RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : StampaRxD [*** VERSIONE RIADATTATA PER COMANDI AT *******] | ;| DESCRIZIONE : Stampa i dati ricevuti dalla porta SERIALE | ;\---------------------------------------------------------------------------/ StampaRxD: PUSH CX PUSH BX PUSH AX ;--------------------------------------------------------------------- PUSH AX ;\ M_msgC BytTxRx, 6,40,0AH;| MOV AX,CS:[NumRxD];| CALL Wor2Dec ;|Stampa e mette a video il numero dei Bytes INC AX ;|ricevuti MOV CS:[NumRxD],AX;| CALL STAsp ;| MOV AL,']' ;| CALL BIOchr1 ;| POP AX ;/ ;---------------------;--[Gestione della Stampa dei Caratteri Ascii]-- MOV BH,AL ; Salva il valore del dato ricevuto corrente MOV DH,CS:[RigRxDa];\Assume la posizione di stampa corrente MOV DL,CS:[ColRxDa];/ MOV CL,CS:[AtrRxDa];\Assume il colore con cui stampare il dato M_COLOR CL ;/ricevuto corrente ;---------------------;--[tasto ]------------------------------ CMP AL,0DH ;\Controlla se il dato ricevuto corrente Š Invio JNZ StaRx1 ;/e, in questo caso, evita la stampa a video MOV DL,1 ;\ INC DH ;|Riporta la colonna di stampa all'inizio della CMP DH,15 ;|riga successiva JNZ StaRx1 ;/ MOV BL,7 ;\Provvede a spostare verso l'alto di una riga MOV CH,14 ;|i caratteri contenuti nella finestra di visua- MOV BH,CS:[AtrRxDa];|lizzazione dei caratteri ascii Ricevuti dal CALL CheckPos ;/Telefono Cellulare ;---------------------;--[tasti alfanumerici]------------------------- StaRx1: CALL SET_cur ; Fissa il cursore nella nuova posizione CALL BIOchr1 ;\Mette a video il carattere Ascii del dato ;/ricevuto corrente INC DL ;\Controllo della Colonna corrente: se la stampa CMP DL,79 ;|Š ancora all'interno della cornice, sulla riga JNZ StaRx3 ;/corrente, tutto va bene MOV DL,1 ;\Riporta la colonna di stampa all'interno della INC DH ;/cornice, sulla riga successiva MOV CH,14 ; Riga finale per Ascii con doppia visualizzaz. MOV BL,15 ;\Aggiorna la dimensione del campo di visualiz- CMP Byte Ptr CS:[PrntMod],00;|zazione dei dati ricevuti; per default, nel JNZ StaRx2 ;|caso di sola visualizzazione del valore ascii, ADD BL,8 ;|usa il campo pieno di 9 righe ADD CH,8 ;/Riga finale per visualizzazione SOLO Ascii ;\Controlla se la nuova riga Š essa pure ancora StaRx2: CMP DH,BL ;|all'interno della cornice; se Š cosŤ tutto va JNZ StaRx3 ;/bene MOV BL,7 ;\Provvede a spostare verso l'alto di una riga MOV BH,CS:[AtrRxDa];|i caratteri contenuti nella finestra di visua- CALL CheckPos ;|lizzazione dei caratteri ascii Ricevuti dal ;/Telefono Cellulare StaRx3: MOV CS:[AtrRxDa],CL; MOV CS:[RigRxDa],DH;\Salva la nuova posizione del cursore MOV CS:[ColRxDa],DL;/ ;----------------------[Gestione della Stampa dei valori Esadecimali]- CMP Byte Ptr CS:[PrntMod],00;\Se il campo di visualizzazione dei dati JZ StaRx5 ;|ricevuti in forma esadecimale NON Š richiesto ;/ignora questa parte di codice MOV AL,BH ; Recupera il valore del dato ricevuto corrente MOV DH,CS:[RigRxDb];\ MOV DL,CS:[ColRxDb];|Fissa il cursore nella nuova posizione CALL SET_cur ;/ MOV CL,CS:[AtrRxDb];\Mette a video il valore esadecimale del M_COLOR CL ;|carattere corrente ricevuto con il colore di CALL Byt2Asc ;/stampa corrente ADD DL,3 ;\Controllo della Colonna corrente: se la stampa CMP DL,79 ;|Š ancora all'interno della cornice, sulla riga JNZ StaRx4 ;/corrente, tutto va bene MOV DL,1 ;\Riporta la colonna di stampa all'interno della INC DH ;/cornice, sulla riga successiva CMP DH,23 ;\Controlla se la nuova riga Š essa pure ancora JNZ StaRx4 ;|all'interno della cornice; se Š cosŤ tutto va ;/bene MOV DH,16 ;\La cornice Š stata riempita completamente con MOV CL,CS:[AtrRxDb];|i caratteri in partenza dalla Seriale; le DEC CL ;|coordinate di stampa sono riportate nell'ango- CMP CL,0DH ;|lo in alto a sinistra all'interno della corni- JNZ StaRx4 ;|ce e, per evidenziare la sovrascrittura, si MOV CL,0FH ;|cambia anche il colore di stampa, alternando StaRx4: MOV CS:[AtrRxDb],CL;/Bianco Brillante a Giallo,sempre in campo Nero MOV CS:[RigRxDb],DH;\Aggiorna il valore corrente del cursore bytes MOV CS:[ColRxDb],DL;/ StaRx5: MOV DH,CS:[RigRxDa];\ MOV DL,CS:[ColRxDa];|Fissa il cursore nella nuova posizione CALL SET_cur ;/ POP AX POP BX POP CX RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : StampaTxD [*** VERSIONE RIADATTATA PER COMANDI AT *******] | ;| DESCRIZIONE : Stampa i dati trasmessi dalla porta SERIALE | ;\---------------------------------------------------------------------------/ StampaTxD: PUSH CX PUSH BX PUSH AX ;--------------------------------------------------------------------- PUSH AX ;\ M_msgC BytTxRx,1,40,0AH;| MOV AX,CS:[NumTxD];| CALL Wor2Dec ;|Stampa e mette a video il numero dei Bytes INC AX ;|trasmessi MOV CS:[NumTxD],AX;| CALL STAsp ;| MOV AL,']' ;| CALL BIOchr1 ;| POP AX ;/ ;---------------------;--[Gestione della Stampa dei Caratteri Ascii]-- MOV BH,AL ; Salva il valore del dato trasmesso corrente MOV DH,CS:[RigTxDa];\Assume la posizione di stampa corrente MOV DL,CS:[ColTxDa];/ MOV CL,CS:[AtrTxDa];\Assume il colore con cui stampare il dato M_COLOR CL ;/trasmesso corrente ;---------------------;--[tasto ]------------------------------ CMP AL,0DH ;\Controlla se il dato trasmesso corrente Š Invio JZ StaTx1 ;/e, in questo caso, evita la stampa a video ;---------------------;--[tasti alfanumerici]------------------------- CALL SET_cur ; Fissa il cursore nella nuova posizione CALL BIOchr1 ;\Mette a video il carattere Ascii del dato ;/trasmesso corrente INC DL ;\Controllo della Colonna corrente: se la stampa CMP DL,79 ;|Š ancora all'interno della cornice, sulla riga JNZ StaTx3 ;/corrente, tutto va bene StaTx1: MOV DL,1 ;\Riporta la colonna di stampa all'interno della INC DH ;/cornice, sulla riga successiva MOV CH,1 ; Riga finale per Ascii con doppia visualizzaz. MOV BL,2 ;\Aggiorna la dimensione del campo di visualiz- ;|zazione dei dati trasmessi; per default, nel ;|caso di sola visualizzazione del valore ascii, ADD BL,2 ;|usa il campo pieno di 9 righe ADD CH,2 ;/Riga finale per visualizzazione SOLO Ascii ;\Controlla se la nuova riga Š essa pure ancora StaTx2: CMP DH,BL ;|all'interno della cornice; se Š cosŤ tutto va JNZ StaTx3 ;/bene MOV BL,2 ;\Provvede a spostare verso l'alto di una riga MOV BH,CS:[AtrRxDa];|i caratteri contenuti nella finestra di visua- CALL CheckPos ;|lizzazione dei caratteri ascii Ricevuti dal ;/Telefono Cellulare StaTx3: MOV CS:[AtrTxDa],CL; Salva il colore corrente MOV CS:[RigTxDa],DH;\Salva la nuova posizione del cursore MOV CS:[ColTxDa],DL;/ MOV DH,CS:[RigTxDa];\ MOV DL,CS:[ColTxDa];|Fissa il cursore nella nuova posizione CALL SET_cur ;/ POP AX POP BX POP CX RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : FraseTxR ************* PRIMA VERSIONE ******************* | ;| DESCRIZIONE : Gestisce la normale ricetrasmissione di stringhe Ascii| ;| ("Chat") mostrando a video le frasi in partenza e quelle in| ;| arrivo in campi diversi. | ;| In ogni momento, premendo il tasto F1, si pu• annullare la| ;| sessione di ricetrasmissione e azzerare i contatori. | ;| La procedura ha termine con la pressione di . | ;\---------------------------------------------------------------------------/ FraseTxR:MOV DH,CS:[RigTxDa];\ MOV DL,CS:[ColTxDa];|Assume la riga e la colonna corrente e vi CALL SET_cur ;|fissa il cursore CALL RIP_Cur ;/ ;\Controlla la pressione di tasti SENZA FERMARSI Frase0: MOV AH,01H ;|per garantire la trasmissione di dati; se NON INT 16H ;|Š stato premuto alcun tasto (ffZ="1") continua JZ Frase2 ;/verificando se Š pronto un dato in Ricezione CALL KeyWait ; Altrimenti analizza il codice tasto premuto CMP AL,ESC_ ;\ con si termina la sessione di Rice- JZ Frase3 ;/ trasmissione CMP AL,00H ;\Servizio tasti funzionali, F1, F2, ...; se non JNZ Frase1 ;|si tratta di essi si provvede alla stampa CMP AH,F1 ;\Servizio tasto : Risincronizzazione JNZ Frase1 ;/ ;----------------------;\Servizio di Risincronizzazione: se uno dei 2 ;|computer perde il collegamento Š possibile ;/ripristinarlo ;M_corn altezza,larghezza,riga,colonna,salva M_recup 7 , 69 , 8 , 5 ,2000H;|Recupera lo spazio M_recup 7 , 69 , 16 , 5 ,2000H;|occupato dai Campi DATI ;\Ripropone il messaggio "Controlla che il CALL DESK_6 ;|Telefono Cellulare sia acceso" e reinizializza ;/le variabili del Test Seriale POP AX ;\NB: recupera con POP AX la posizione pendente JMP TxRx01 ;|nello stack dovuta alla chiamata CALL FraseTxR ;/per poter tornare con JMP invece che con "RET" ;---------------------------------------------------------------------- ;\Trasmette ogni altro carattere digitato, Frase1: CALL TxD_1 ;|spedito sulla porta COM1 non appena si presen- ;/tano le condizioni ottimali per la trasmission CALL StampaTxD ; Servizio carattere trasmesso (stampa a video) Frase2: CALL RxD_3_ ;\Riceve altri bytes dalla PORTA SERIALE; se il CMP AH,00H ;|dato Š attendibile (AH=00H) Š lasciato in AL, JNZ Frase0 ;|altrimenti rimane in attesa di trasmissione; CALL StampaRxD ;/se il dati Š buono lo stampa JMP Frase0 Frase3: RET ; ;/---------------------------------------------------------------------------\ ;/--------------------------------------------\| AT1_Chat proc NEAR ;| AREA DEDICATA AL MAIN PROGRAM || ;\--------------------------------------------/| ;\---------------------------------------------------------------------------/ ;/---------------------------------[Inizializza il PROTOCOLLO per il Test]---\ MOV Byte Ptr CS:[depPOR],COM_num;\Per cambiare PORTA utilizzata, Velocit… | MOV Word Ptr CS:[DepVEL],Baude ;|di ricetrasmissione e Protocollo Seriale | MOV Byte Ptr CS:[DepTIP],Protoc ;/cambia le costanti all'inizio del codice | ;\---------------------------------------------------------------------------/ ;\Inizializza i Registri della porta seriale in ;|accordo con i parametri di protocollo deside- CALL INIserial ;|rati (velocit… di linea, numero bit di dato ;|e di stop, tipo di parit…) e in funzione della ;|porta COMx desiderata (default COM1) ;|NB: lascia in uscita SI=0000H se la porta ;/ desiderata NON Š presente nel sistema ;\Predispone il Piano di Lavoro e inizializza le ;|Variabili necessarie per il Programma Seriale CALL DeskTop ;|NB: se il valore ricevuto in ingresso in SI Š ;|0 la porta seriale desiderata NON Š presente ;|nel sistema e la procedura impone automatica- ;/mente il rientro al DOS (a livello _OUT) ;--------------------------------------------------------------------- TxRx01: CALL DESK_9 ;Avvisa di controllare che il Telefono Cellulare CALL Campi ;sia acceso e predispone i 2 riquadri di ;Ricetrasmissione ;--------------------------------------------------------------------- CALL FraseTxR ;** EFFETTIVA GESTIONE DELLA RICETRASMISSIONE ** ;--------------------------------------------------------------------- _OUT: CALL DESK_A PUSH AX ;\/--------------------------------------------\ M_COLOR 07H ;|| FASE STANDARD D'USCITA DAL PROGRAMMA | MOV DH,24 ;|\--------------------------------------------/ CALL BARRA ;| MOV DH,0 ;|Pulisce la prima e l'ultima riga del monitor CALL BARRA ;|(di solito assegnate al Titolo e al Menu) CALL RIP_cur ;|e fissa il cursore sull'ultima; con questo MOV DH,23 ;|artificio al termine del programma il "prompt" MOV DL,0 ;|cade nel punto ottimale, senza inquinare CALL SET_cur ;|l'immagine in uscita,ovviamente ancora a video POP AX ;/ ;\Torna al DOS liberando la memoria usata dal ;|programma, restituendo il controllo al proces- ;|so padre (generalmente COMMAND.COM); il valore MOV AH,4CH ;|posto eventualmente in AL prima di uscire pu• INT 21H ;|essere testato a livello DOS con la funzione ;|4DH o mediante la lettura della variabile DOS ;/"ERRORLEVEL" AT1_Chat ENDP _prog ENDS END INIZIO