PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (giugno 2005) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : AT1_Decd.ASM /----------------[TxD][RxD]------------------\| ;| AUTORE : Giorgio OBER | ************ *********** ************** || ;| VERSIONE : giugno 2005 \------------------[COM1]--------------------/| ;| DESCRIZIONE : Questo progetto,dotato di Desktop di presentazione e di menu| ;| interattivi, decodifica e mette a video i primi 9 messaggi| ;| SMS assunti in diretta, via seriale, dalla memoria di un| ;| Telefono Cellulare con l'aiuto di Comandi AT+CMGR=.| ;| Le informazioni trovate nella stringa PDU (Protocol Data| ;| Unit) di ciascuno dei 9 messaggi sono decodificate con la| ;| tecnica collaudata con i progetti AT_Test1 e AT_Test2 e| ;| messe a video in riquadri dedicati, come fa la AT_Test2. | ;| | ;| La RICETRASMISSIONE di Comandi AT tra Computer e Telefono| ;| Cellulare, tramite le rispettive porte seriali (UART), Š| ;| ottenuta con tecnica d'interrogazione (POLLING). | ;| /--------------------------------\ | ;| | COM1, 19200, N, 1, 8 | | ;| \--------------------------------/ | ;|/-----------\/------------------------------------------------------------\| ;|| ||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.|| ;|\-----------/\------------------------------------------------------------/| ;\---------------------------------------------------------------------------/ F1 EQU 3BH ;codice Scansione tasto LineF EQU 0AH ;codice del tasti - Line Feed Invio EQU 0DH ;codice del tasto - Carriage Return ESC_ EQU 27 ;codice del 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 Wor2Dec:NEAR EXTRN RamCorn:NEAR EXTRN RamRecup:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC AT1_Decd ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP AT1_Decd ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 00H NoSMS DB 00H Titolo DB "Programmi per il Collaudo dei COMANDI AT su ",00H Titolo1 DB "COM1",00H Tema0 DB "AT1_Decd - Ricezione Comandi AT su " DB "COM1 - Protocollo: 19200,N,1,8 ",00H Tema1 DB " Prima di cominciare ACCENDI il Telefono Cellulare",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 NOnum DB "Non decodificato",00H SMSlen0 DB "Ricevuti ",00H SMSlen1 DB " caratteri",00H MENU00 DB "Digita il Numero del SMS da leggere: 1,2,3,4,5,6,7,8,9",00H MENU01 DB "Inizia",00H MENU02 DB "Quit",00H MENU03 DB "Aiuto",00H MENU04 DB "F1",00H MENU05 DB " Risincronizza",00H MENU06 DB " Leggi altri messaggi ",00H Vuota01 DB " " Vuota02 DB " ",00H ;--------------------------------------------------------------------- Note_ DB "Questo eseguibile, ~AT1_Decd.COM~, deve essere in esecuzione",00H DB "sul Computer coinvolto nella comunicazione seriale con il",00H DB "Telefono Cellulare ",00H DB "Non appena si preme il tasto ~Inizia~, se il Cellulare Š",00H DB "acceso, ne viene automaticamente rilevata la presenza ed Š",00H DB "subito possibile analizzare i messaggi eventualmente da esso",00H DB "ricevuti, spedendogli i giusti COMANDI AT.",00H ;-----------------------------------------˙--------------------------- Testo00 DB "Telefono: ",00H Testo01 DB "Il Telefono Cellulare non risponde: " DB "accendilo e risincronizza F1",00H Testo02 DB "non risponde",00H Testo03 DB " Telefono Cellulare in linea ",00H Testo04 DB "Il Telefono Cellulare ha trasmesso il messaggio SMS Nř",00H Testo05 DB "Il messaggio SMS Nř",00H Testo06 DB " non Š disponibile nel Telefono Cellulare",00H Testo07 DB "Il Computer Remoto sta per eseguire i COMANDI del Protocollo",00H Testo08 DB " Il Messaggio Ricevuto non contiene COMANDI del Protocollo ",00H ;--------------------------------------------------------------------- SMSrxd DB 512 DUP (' ') ;Deposito dei caratteri originali del messaggio SMS ;--------------------------------------------------------------------- ;Deposito dei BYTES corrispondenti a ciascuna coppia SMSbyt DB 512 DUP (' ') ;di caratteri ascii esadecimali ai quali ilmessaggio ;affida le informazioni codificate a 7 bit destinate ;a contenere l'effettivo testo del messaggio ;--------------------------------------------------------------------- ;Deposito dei caratteri ascii alfabetici "in chiaro" SMStxt DB 512 DUP (' ') ;ottenuti decodificando i bytes della precedente ;zona "SMSbyt", contenente le informazioni codifica- ;te a 7 bit con l'effettivo testo del messaggio ;--------------------------------------------------------------------- ; ALFABETO del caratteri a 7 bit (default alphabet) ; secondo le specifiche GSM 03.38. AlfaTab DB '@' ; 00H COMMERCIAL AT DB 'Ł' ; 01H POUND SIGN DB '$' ; 02H DOLLAR SIGN DB 'Ą' ; 03H YEN SIGN DB 'č' ; 04H LATIN SMALL LETTER E WITH GRAVE DB 'é' ; 05H LATIN SMALL LETTER E WITH ACUTE DB 'ů' ; 06H LATIN SMALL LETTER U WITH GRAVE DB 'ě' ; 07H LATIN SMALL LETTER I WITH GRAVE DB 'ň' ; 08H LATIN SMALL LETTER O WITH GRAVE DB 'Ç' ; 09H LATIN CAPITAL LETTER C WITH CEDILLA DB 0AH ; 0AH LINE FEED DB 'Ř' ; 0BH LATIN CAPITAL LETTER O WITH STROKE DB 'ř' ; 0CH LATIN SMALL LETTER O WITH STROKE DB 0DH ; 0DH CARRIAGE RETURN DB '*' ; 0EH LATIN CAPITAL LETTER A WITH RING ABOVE DB 'ĺ' ; 0FH LATIN SMALL LETTER A WITH RING ABOVE DB '?' ; 10H GREEK CAPITAL LETTER DELTA DB '_' ; 11H LOW LINE _ DB 'F' ; 12H GREEK CAPITAL LETTER PHI DB 'G' ; 13H GREEK CAPITAL LETTER GAMMA DB '?' ; 14H GREEK CAPITAL LETTER LAMBDA DB 'O' ; 15H GREEK CAPITAL LETTER OMEGA DB '?' ; 16H GREEK CAPITAL LETTER PI DB '?' ; 17H GREEK CAPITAL LETTER PSI DB 'S' ; 18H GREEK CAPITAL LETTER SIGMA DB 'T' ; 19H GREEK CAPITAL LETTER THETA DB '?' ; 1AH GREEK CAPITAL LETTER XI DB 1BH ; 1BH ESCAPE TO EXTENSION TABLE DB 'Ć' ; 1CH LATIN CAPITAL LETTER AE DB 'ć' ; 1DH LATIN SMALL LETTER AE DB 'ß' ; 1EH LATIN SMALL LETTER SHARP S (German) DB 'É' ; 1FH LATIN CAPITAL LETTER E WITH ACUTE DB ' ' ; 20H SPACE DB '!' ; 21H EXCLAMATION MARK DB '"' ; 22H QUOTATION MARK DB '#' ; 23H NUMBER SIGN DB '¤' ; 24H CURRENCY SIGN DB '%' ; 25H PERCENT SIGN DB '&' ; 26H AMPERSAND DB 27H ; 27H APOSTROPHE ' DB '(' ; 28H LEFT PARENTHESIS DB ')' ; 29H RIGHT PARENTHESIS DB '*' ; 2AH ASTERISK DB '+' ; 2BH PLUS SIGN DB ',' ; 2CH COMMA DB '-' ; 2DH HYPHEN-MINUS DB '.' ; 2EH FULL STOP DB '/' ; 2FH SOLIDUS (SLASH) DB '0' ; 30H DIGIT ZERO DB '1' ; 31H DIGIT ONE DB '2' ; 32H DIGIT TWO DB '3' ; 33H DIGIT THREE DB '4' ; 34H DIGIT FOUR DB '5' ; 35H DIGIT FIVE DB '6' ; 36H DIGIT SIX DB '7' ; 37H DIGIT SEVEN DB '8' ; 38H DIGIT EIGHT DB '9' ; 39H DIGIT NINE DB ':' ; 3AH COLON DB ';' ; 3BH SEMICOLON DB '<' ; 3CH LESS-THAN SIGN DB '=' ; 3DH EQUALS SIGN DB '>' ; 3EH GREATER-THAN SIGN DB '?' ; 3FH QUESTION MARK DB 'ˇ' ; 40H INVERTED EXCLAMATION MARK DB 'A' ; 41H LATIN CAPITAL LETTER A DB 'B' ; 42H LATIN CAPITAL LETTER B DB 'C' ; 43H LATIN CAPITAL LETTER C DB 'D' ; 44H LATIN CAPITAL LETTER D DB 'E' ; 45H LATIN CAPITAL LETTER E DB 'F' ; 46H LATIN CAPITAL LETTER F DB 'G' ; 47H LATIN CAPITAL LETTER G DB 'H' ; 48H LATIN CAPITAL LETTER H DB 'I' ; 49H LATIN CAPITAL LETTER I DB 'J' ; 4AH LATIN CAPITAL LETTER J DB 'K' ; 4BH LATIN CAPITAL LETTER K DB 'L' ; 4CH LATIN CAPITAL LETTER L DB 'M' ; 4DH LATIN CAPITAL LETTER M DB 'N' ; 4EH LATIN CAPITAL LETTER N DB 'O' ; 4FH LATIN CAPITAL LETTER O DB 'P' ; 50H LATIN CAPITAL LETTER P DB 'Q' ; 51H LATIN CAPITAL LETTER Q DB 'R' ; 52H LATIN CAPITAL LETTER R DB 'S' ; 53H LATIN CAPITAL LETTER S DB 'T' ; 54H LATIN CAPITAL LETTER T DB 'U' ; 55H LATIN CAPITAL LETTER U DB 'V' ; 56H LATIN CAPITAL LETTER V DB 'W' ; 57H LATIN CAPITAL LETTER W DB 'X' ; 58H LATIN CAPITAL LETTER X DB 'Y' ; 59H LATIN CAPITAL LETTER Y DB 'Z' ; 5AH LATIN CAPITAL LETTER Z DB '-' ; 5BH LATIN CAPITAL LETTER A WITH DIAERESIS DB 'Ö' ; 5CH LATIN CAPITAL LETTER O WITH DIAERESIS DB 'Ń' ; 5DH LATIN CAPITAL LETTER N WITH TILDE DB 'Ü' ; 5EH LATIN CAPITAL LETTER U WITH DIAERESIS DB '§' ; 5FH SECTION SIGN DB '\' ; 60H INVERTED QUESTION MARK DB 'a' ; 61H LATIN SMALL LETTER A DB 'b' ; 62H LATIN SMALL LETTER B DB 'c' ; 63H LATIN SMALL LETTER C DB 'd' ; 64H LATIN SMALL LETTER D DB 'e' ; 65H LATIN SMALL LETTER E DB 'f' ; 66H LATIN SMALL LETTER F DB 'g' ; 67H LATIN SMALL LETTER G DB 'h' ; 68H LATIN SMALL LETTER H DB 'i' ; 69H LATIN SMALL LETTER I DB 'j' ; 6AH LATIN SMALL LETTER J DB 'k' ; 6BH LATIN SMALL LETTER K DB 'l' ; 6CH LATIN SMALL LETTER L DB 'm' ; 6DH LATIN SMALL LETTER M DB 'n' ; 6EH LATIN SMALL LETTER N DB 'o' ; 6FH LATIN SMALL LETTER O DB 'p' ; 70H LATIN SMALL LETTER P DB 'q' ; 71H LATIN SMALL LETTER Q DB 'r' ; 72H LATIN SMALL LETTER R DB 's' ; 73H LATIN SMALL LETTER S DB 't' ; 74H LATIN SMALL LETTER T DB 'u' ; 75H LATIN SMALL LETTER U DB 'v' ; 76H LATIN SMALL LETTER V DB 'w' ; 77H LATIN SMALL LETTER W DB 'x' ; 78H LATIN SMALL LETTER X DB 'y' ; 79H LATIN SMALL LETTER Y DB 'z' ; 7AH LATIN SMALL LETTER Z DB 'ä' ; 7BH LATIN SMALL LETTER A WITH DIAERESIS DB 'ö' ; 7CH LATIN SMALL LETTER O WITH DIAERESIS DB 'ń' ; 7DH LATIN SMALL LETTER N WITH TILDE ń DB 'ü' ; 7EH LATIN SMALL LETTER U WITH DIAERESIS DB 'ŕ' ; 7FH LATIN SMALL LETTER A WITH GRAVE ;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 MENU03,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: CALL DESK___ ;\Predispone il Piano di lavoro su tavola ;/zigrinata con Intestazione e primo Menu M_msgC Vuota01,24,7,70H;\/--------------------------------------------\ M_msgC MENU04,24,7,74H;||*********** Secondo Menu interno ***********| M_msgC MENU05,24,10,70H;/\--------------------------------------------/ ;M_recup altezza,larghezza,riga,colonna,salva M_recup 5 , 69 , 11 , 5 ,1000H ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 3 , 69 , 3 , 5 , 4EH , 01 , 01 ,1000H M_msgC Testo01,4, 7,4FH;\ "Il Telefono Cellulare non risponde: " M_msgC Testo02,4,29,0CFH;/ "accendilo e Risincronizza F1!" RET ;--------------------------------------------------------------------- DESK_3: CALL DESK___ ;\Predispone il Piano di lavoro su tavola ;/zigrinata con Intestazione e primo Menu M_msgC MENU04,24,7,74H; M_msgC MENU05,24,10,70H; ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 3 , 69 , 3 , 5 , 2AH , 01 , 01 ,1000H M_msgC Testo03,4,17,2FH; "Telefono Cellulare IN LINEA..." RET ;--------------------------------------------------------------------- DESK_4: 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 : AT_SMS | ;| DESCRIZIONE : Il compito di questa procedura Š quello di tradurre e mette-| ;| re a video le principali informazioni nascoste nella stringa| ;| di caratteri di un messaggio SMS, ricevuto da Telefono| ;| Cellulare e passato al Computer via Seriale, dando per| ;| scontato che esso sia disponibile in formato PDU (Protocol| ;| Description Unit), lo standard utilizzato di solito per| ;| default da tutti i Telefoni Mobili. | ;| Questa versione utilizzata anche dal progetto finale AT_Srvr| ;| gode della tecnica di decodifica collaudata con la procedura| ;| AT_Chk, progettata in AT_Test1 e AT_Test2, interpretando ora| ;| i caratteri mentre stanno arrivando dalla linea seriale,| ;| invece di assumerli dalla memoria dati del sorgente ASM. | ;| | ;| NB: in ingresso si aspetta in SI l'indirizzo della stringa | ;| AT di caratteri associati al messaggio, in DH,DL la | ;| riga e la colonna di stampa corrente. | ;| | ;| La stringa PDU contiene, oltre al testo del messaggio, | ;| anche numerose informazioni relative al mittente, al centro | ;| servizi SMS, alla data e all'ora di ricezione, e cosŤ via.. | ;| E' composta esclusivamente da caratteri ascii alfanumerici | ;| ma la loro interpretazione varia notevolmente in funzione | ;| del contesto. | ;| La stringa utilizzata Š quella di un messaggio in arrivo| ;| dal Telefonino ed Š composta esclusivamente da caratteri| ;| ascii numerici (da "0" a "9") e letterali (da "A" a "F"),| ;| quelli usati per esprimere i simboli del Sistema di numera-| ;| zione esadecimale; in ogni caso bisogna interpretarli a| ;| coppie, dette ottetti, o coppie di semi-ottetti, e la loro| ;| interpretazione varia notevolmente in funzione del settore a| ;| cui si riferiscono. | ;\---------------------------------------------------------------------------/ RxD__: MOV DX,CS:[port_D];\ IN AL,DX ;| TEST AL,01H ;|Procedura di Ricezione seriale Ridotta, utile JZ RxD__ ;|nella fase di lettura dei codici ascii del MOV DX,CS:[port_8];|Messaggio SMS, non essendo probabile in questo IN AL,DX ;|caso, il pericolo di mancata Ricezione RET ;/ ;----------------------------------------------------------------------------- AT_SMS: PUSH DX LEA SI,SMSrxd ;\Punta la zona di memoria in cui salvare i ;/caratteri Ascii contenuti nel messaggio ; /-------------------------------------------------------------------\ ; | La prima parte della stringa PDU contiene informazioni sul Centro| ; | Servizi (SMSC, Short Message Service Center) che ha gestito il| ; | messaggio SMS. | ; 01 | /\ /*-**-**-**-**-**-- 7 coppie di caratteri scambiate | ; | 07 91 93 33 85 28 52 00 >>>> + 39 335 8822500 | ; | Nř=7 -*/ \*- tipo di SCA ---------------/ | ; | La prima coppia di caratteri, la stringa "07", va interpretata| ; | come numero binario a 8 bit espresso in esadecimale: il valore ad| ; | essa corrispondente (07H = 7 decimale) indica la quantit… di| ; | ottetti (coppie di caratteri) destinata a documentare il numero| ; | telefonico del Centro Servizi, annunciando di fatto che i| ; | rimanenti caratteri di questo settore saranno 14 (=7 ottetti). | ; | | ; | La seconda coppia di caratteri, la stringa "91", rappresenta essa| ; | pure un numero binario a 8 bit in esadecimale, il cui valore(91H)| ; | indica che il numero telefonico del Centro Servizi Š espresso in| ; | formato internazionale, cioŠ conterr… il prefisso della Nazione a| ; | cui appartiene, per esempio 39 (da intendere +39) per Italia. | ; | | ; | La parte finale del settore si riferisce ai 6 ottetti rimanenti| ; | (uno tra quelli previsti Š stato consumato per il formato);| ; | ciascuna delle 6 coppie di caratteri,la stringa 93 33 85 28 52 00| ; | va interpretata come coppia di numeri decimali da utilizzare per•| ; | scambiandone la posizione rispetto a quella occupata nella strin-| ; | ga di riferimento; rappresenta il numero telefonico del Centro| ; | Servizi che, interpretato in accordo con le regole appena esposte| ; | sar…: 39 33 58 82 25 00 cioŠ +39 335 8822500. La stringa analiz-| ; | zata non contiene (nella sua parte finale) il carattere "F";| ; | questo sta ad indicare che il numero telefonico del Centro| ; | Servizi Š espresso da un numero pari di cifre (semi-ottetti), ma| ; | potrebbe anche non essere cosŤ; per esempio la stringa "93 33 85 | ; | 28 52 F0" sar… interpretata come 39 33 58 82 25 0F cioŠ | ; | +39 335 882250, un numero a 11 cifre. | ; | PoichŠ le informazioni contenute in questi bytes non sono utiliz-| ; | zate dal nostro progetto, il codice generato per tenerne conto si| ; | limita a saltare i 16 caratteri ad essi relativi, posizionando il| ; | puntatore sul primo del prossimo settore. | ; \-------------------------------------------------------------------/ CALL RxD__ ;\ MOV CS:[SI],AL ;| INC SI ;|Memorizza i 2 caratteri ascii esadecimali con CALL RxD__ ;|il numero dei caratteri del settore Centro MOV CS:[SI],AL ;|Servizi (SMSC, Short Message Service Center) DEC SI ;/ CALL Asc2Byt_ ;\Trasforma in byte (in AL) la prima coppia di MOV AH,00H ;|caratteri trovata nella stringa e formatta il MOV CX,AX ;|risultato a 16 bit (in AX = CX) per preparare ;/il contatore dei bytes da saltare ;\PoichŠ ora il contatore tien conto dei bytes ADD CX,CX ;|da saltare ne raddoppia il valore per adattar- ;/lo al nř di caratteri corrispondenti AT_00: CALL RxD__ ;\Memorizza i successivi (N)*2 caratteri, con MOV CS:[SI],AL ;|le informazioni SMSC, senza metterle a video e INC SI ;|lasciando comunque il puntatore SI aggiornato LOOP AT_00 ;/per puntare il prossimo carattere ; /-------------------------------------------------------------------\ ; | Il secondo settore della stringa PDU Š rappresentato da una sola| ; | coppia di caratteri, la stringa "00", da interpretarsi come numero| ; | binario a 8 bit espresso in esadecimale: il valore ad essa corri-| ; | spondente (00H = 0 decimale) Š un descrittore del tipo di messag-| ; | gio (PDU Type, Protocol Data Unit Type). | ; 02 | /*------------------- 1 coppia di caratteri | ; | 00 | ; | Le informazioni contenute in questo byte sono, in realt…, affidate| ; | ai suoi singoli bit e sono legate alle modalitŕ con cui si intende| ; | far gestire talune funzioni legate al messaggio ricevuto o alla| ; | sua tipologia; in particolare il fatto che entrambi i 2 bit meno| ; | significativi siano entrambi nulli(come per altro tutti gli altri)| ; | sta ad indicare che il messaggio sotto test Š del tipo convenzio-| ; | nale (SMS Deliver); sono comunque irrilevanti ai fini del nostro| ; | progetto e il codice generato per tener conto di questo settore si| ; | limita a saltare i 2 caratteri ad esso relativi, posizionando il| ; | puntatore sul primo del prossimo settore. | ; \-------------------------------------------------------------------/ CALL RxD__ ;\ MOV CS:[SI],AL ;|Memorizza i successivi 2 caratteri, con le INC SI ;|informazioni del PDU Type, senza metterle a CALL RxD__ ;|video e lasciando comunque il puntatore SI MOV CS:[SI],AL ;|aggiornato per puntare il prossimo carattere INC SI ;/ ; /-------------------------------------------------------------------\ ; | Il terzo settore della stringa PDU contiene informazioni sul| ; | Mittente (OA, Originator Address) del messaggio SMS ed Š struttu-| ; | ralmente simile al primo. | ; 03 | /\ /*-**-**-**-**-**-**- 7 coppie di caratteri scambiate| ; | 0E 85 00 93 40 16 89 67 54 >>>> + 00 39 0461 987645 | ; | Nř=14 -*/ \*- tipo di OA ----------------/ | ; | La prima coppia di caratteri, la stringa "0E",va interpretata come| ; | numero binario a 8 bit espresso in esadecimale: il valore ad essa| ; | corrispondente (0EH = 14 decimale) indica il numero di cifre| ; | (semi-ottetti)da cui sar… formato il numero telefonico del Mitten-| ; | te (escluse quindi le 2 destinate a documentare il formato); in| ; | questo differisce dalla struttura che descrive le informazioni del| ; | Centro Servizi, nella quale il valore della prima coppia indicava| ; | la quantit… di ottetti (coppie di caratteri, compresa quella del| ; | formato) destinata a documentare quel numero telefonico. | ; | | ; | La seconda coppia di caratteri, la stringa "85", rappresenta essa| ; | pure un numero binario a 8 bit in esadecimale, il cui valore (85H)| ; | indica il formato del numero telefonico del Mittente; la struttura| ; | di questo byte indica che il suo Tipo (8xH) Š sconosciuto e la sua| ; | Categoria (x5H) Š non documentata; in casi come questi il numero| ; | pu• ammette la presenza del prefisso internazionale, come effetti-| ; | vamente rileveremo. | ; | In particolare il bit7 Š sempre a 1, mentre i bit6, bit5 e bit4| ; | indicano il "Tipo di Numero", cioŠ 000= sconosciuto; 001=interna-| ; | zionale; 010=nazionale; 100=rappresentazione ridotta; 101=espresso| ; | a 7bit (con alfabeto standard, come il testo del messaggio; 110=| ; | numero abbreviato; 111=tipologia riservata. | ; | I bit3, bit2, bit1 e bit0 Š il "Numbering Plan Identification" | ; | | ; | La parte finale del settore si riferisce ai 14 semi-ottetti annun-| ; | ciati dalla prima coppia, la stringa "0E"; ciascuna delle 7 coppie| ; | di caratteri, la stringa "00 93 40 16 89 67 54", va interpretata| ; | come coppia di numeri decimali da utilizzare per• scambiandone la| ; | posizione rispetto a quella occupata nella stringa di riferimento,| ; | e rappresenta il numero telefonico del Mittente che, interpretato| ; | in accordo con le regole appena esposte, sar… 00 39 04 61 98 76 45| ; | cioŠ +0039 0461 987645 . La stringa analizzata non contiene (nella| ; | sua parte finale) il carattere "F", essendo il numero telefonico| ; | del Mittente espresso da un numero pari di cifre (appunto 14 semi-| ; | ottetti), ma potrebbe anche non essere cosŤ; per esempio la strin-| ; | ga "00 93 40 16 89 67 F0" sar… interpretata come 00 39 04 61 98 76| ; | 0F cioŠ +0039 0461 98760, un numero a 13 cifre; in questo caso la| ; | stringa affifata alla prima coppia sarebbe stata "0D". | ; \-------------------------------------------------------------------/ CALL RxD__ ;\ MOV CS:[SI],AL ;| INC SI ;|Memorizza i 2 caratteri ascii esadecimali con CALL RxD__ ;|il numero dei caratteri del settore OA MOV CS:[SI],AL ;| DEC SI ;/ CALL Asc2Byt_ ;\Trasforma in byte (in AL) la coppia di carat- MOV AH,00H ;|teri trovata in questo punto della stringa e MOV CX,AX ;|formatta il risultato a 16 bit (in AX=CX) per ;/preparare il contatore caratteri da trattare M_msgC Testo00,10,28,1FH; CALL RxD__ ;\ MOV CS:[SI],AL ;| INC SI ;|Memorizza i 2 caratteri ascii esadecimali con CALL RxD__ ;|il "Tipo" di OA, senza metterli a video MOV CS:[SI],AL ;| DEC SI ;/ ;\Trasforma in byte (in AL) la coppia di carat- CALL Asc2Byt_ ;|teri trovata in questo punto della stringa, PUSH AX ;|la coppia di caratteri della tipologia con cui ;/Š codificato il numero di "OA" ;\Salva il numero CX di caratteri attesi per il PUSH CX ;|numero di Telefono del mittente, e il puntato- PUSH SI ;|re SI della locazione destinata ad ospitare il ;/primo di essi AT_01: CALL RxD__ ;\ MOV CS:[SI],AL ;|Memorizza i CX caratteri ascii esadecimali con INC SI ;|il numero di telefono del mittente(settore OA) LOOP AT_01 ;/ POP SI ;\Recupera il numero CX di caratteri attesi per POP CX ;|il numero di Telefono del mittente, e il ;/puntatore SI del primo di essi POP AX ;\ AND AL,01010000B ;|Controlla se la tipologia con cui Š codificato CMP AL,01010000B ;|il numero di "OA" Š quella a 7 bit (come il JNE AT_X1 ;|testo del messaggio, vedi avanti) e se cosŤ M_msgN NOnum ;|si evita di decodificarlo e di metterlo a JMP AT_03 ;/video, limitandoci a saltare i bytes previsti AT_X1: MOV BL,2 ;\Controlla se la stringa contiene il carattere MOV AX,CX ;|"F" nella sua parte finale; in questo caso il DIV BL ;|numero telefonico del Mittente ha un numero PUSH AX ;/dispari di cifre (ottetti) e AH Š lasciato a 1 ;\PoichŠ ora il contatore tien conto del numero SHR CX,1 ;|effettivo dei caratteri previsti per l'OA, lo ;|divide per 2 per mettersi in condizione di ;/trattarli a coppie, nella loro messa a video AT_02: MOV AL,CS:[SI+1] ;\ CALL BIOchr1 ;| MOV AL,CS:[SI] ;|Messa a video del numero di telefono CALL BIOchr1 ;|dell'utente che ha spedito il "messaggino" ADD SI,2 ;| LOOP AT_02 ;/ ;\Se la stringa NON contiene il carattere "F" POP AX ;|nella sua parte finale (numero telefonico del CMP AH,00H ;|Mittente formato da un numero pari di cifre) JE AT_03 ;|la visualizzazione e la memorizzazione Š stata ;/operata completamente ;\Altrimenti, sebbene la prima coppia di questo ;|settore indichi un numero dispari, i caratteri CALL RxD__ ;|destinati nella stringa al numero di telefono MOV CS:[SI],AL ;|del mittente sono comunque pari perchŠ quello INC SI ;|"spaiato" sar… posto dopo un carattere "F",per ;|esempio "F4"; in questo caso il carattere "F" ;|Š stato gi… letto ed aggiunto al Buffer, per ;/cui rimane da assumere solo quello "spaiato" CALL BIOchr1 ;\Essendo disponibile in AL esso viene messo ;/a video in coda a quelli gi… stampati ; /-------------------------------------------------------------------\ ; | Il quarto settore della stringa PDU Š rappresentato da una sola| ; | coppia di caratteri, la stringa "39", da interpretarsi come numero| ; | binario a 8 bit espresso in esadecimale: il valore ad essa corri-| ; | spondente ( 39H = 57 decimale) contiene informazioni sul| ; | Identificatore di Protocollo (PID, Protocol IDentifier). | ; 04 | /*------------------- 1 coppia di caratteri | ; | 39 | ; | Le informazioni contenute in questo byte sono affidate ai suoi| ; | singoli bit e sono legate a possibili operazioni da esercitare sul| ; | messaggio SMS nel momento della ricezione; sono comunque irrile-| ; | vanti ai fini del nostro progetto e il codice generato per tener| ; | conto di questo settore si limita a saltare i 2 caratteri ad esso| ; | relativi, posizionando il puntatore sul primo del prossimo settore| ; \-------------------------------------------------------------------/ ;\I successivi 2 caratteri ascii esadecimali con ;|le informazioni dell'identificatore di proto- ;|collo sono memorizzati insieme a quelli dello ;/schema di codifica dei Dati, tra poco......... ; /-------------------------------------------------------------------\ ; | Il quinto settore della stringa PDU č rappresentato da una sola| ; | coppia di caratteri, la stringa "00", da interpretarsi come numero| ; | binario a 8 bit espresso in esadecimale: il valore ad essa corri-| ; | spondente (00H = 0 decimale) contiene informazioni sulle modalit…| ; | utilizzate per la Codifica del testo (DCS, Data Coding Scheme) del| ; | messaggio SMS. | ; 05 | /*------------------- 1 coppia di caratteri | ; | 00 | ; | Le informazioni contenute in questo byte sono affidate ai suoi| ; | singoli bit e forniscono indicazioni sulle tecniche utilizzate per| ; | l'eventuale codifica e compressione del testo inserito nell'ultimo| ; | settore della stringa PDU e sul l'alfabeto utilizzato per comporlo| ; | Il valore rilevato nel nostro esempio (00H) indica che il testo| ; | non Š compresso ed Š codificato con alfabeto standard, a 7 bit. | ; | | ; | In ogni caso le informazioni contenute in questo byte sono irrile-| ; | vanti ai fini del nostro progetto e il codice generato per tener| ; | conto di questo settore si limita a saltare i 2 caratteri ad esso| ; | relativi, posizionando il puntatore sul primo del prossimo settore| ; \-------------------------------------------------------------------/ AT_03: MOV CX,4 ;\Memorizza i successivi 4 caratteri ascii esa- AT_04: CALL RxD__ ;|decimali con le informazioni dell'identifica- MOV CS:[SI],AL ;|tore di protocollo e dello schema di codifica INC SI ;|dei Dati, lasciando comunque il puntatore SI LOOP AT_04 ;/aggiornato per puntare il prossimo carattere ; /-------------------------------------------------------------------\ ; | Il sesto settore della stringa PDU contiene informazioni sul tempo| ; | (SCTS, Service Center Time Stamp) in cui il messaggio SMS Š stato| ; | inviato dal Centro Servizi al nostro Telefonino. | ; 06 | /*-**-**------------- 3 coppie di caratteri scambiate | ; | 50 30 11 >>>> 05/03/11 >>> 2005 marzo 11 >>> 11/03/05 | ; | 503011 715325 40 | ; | La prima parte del settore, costituita da 3 coppie di caratteri,la| ; | stringa "50 30 11", va interpretata come coppia di numeri decimali| ; | (semi-ottetti) da utilizzare per• scambiandone la posizione| ; | rispetto a quella occupata nella stringa di riferimento;rappresen-| ; | ta la data nel formato "anno, mese, giorno" che, interpretato in | ; | accordo con le regole appena esposte, sar…: 05 03 11 cioŠ 11/03/05| ; | 11 marzo 2005. | ; | /*-**-**------------- 3 coppie di caratteri scambiate | ; | 71 53 25 >>>> 17:35:52 >>> ore 17, minuti 35, secondi 52| ; | Anche la seconda parte del settore Š costituita da 3 coppie di| ; | caratteri, la stringa "71 53 25", e va interpretata come coppia di| ; | numeri decimali (semi-ottetti) da utilizzare per• scambiandone la| ; | posizione rispetto a quella occupata nella stringa di riferimento;| ; | rappresenta l'ora nel formato "ore,minuti,secondi" che, interpre-| ; | tato in accordo con le regole appena esposte, sarŕ: 17 35 52 cioŠ| ; | 17:35:52, 17 ore, 35 minuti e 52 secondi. | ; | /*------------------- 1 coppia di caratteri | ; | 40 | ; | La parte finale del settore Š costituita da un'ultima coppia di| ; | caratteri, la stringa "40", essa pure da interpretare come coppia| ; | di numeri decimali (semi-ottetti); il valore ad essa relativo, con| ; | il solito scambio di posizione, rappresenta il fuso orario o, pi—| ; | esattamente la differenza di tempo (time zone, espressa in inter-| ; | valli di 15 minuti ciascuno) tra l'ora locale e il GMT (Greenwich| ; | Main Time); in accordo con le solite regole appena esposte, il| ; | valore effettivo Š 04 cioŠ GMT+1, GMT + 1 ora. da notare che,se il| ; | bit pi— significativo Š a 1 il valore indicato Š negativo. | ; | | ; | Il codice generato per tener conto di questo settore organizza la| ; | visualizzazione dei primi 12 semi-ottetti sotto forma di data e| ; | ora decodificate, limita a saltare gli ultimi 2 caratteri relativi| ; | al time zone, ritenuti non necessari; al termine il puntatore Š| ; | pronto per localizzare il primo carattere del prossimo settore | ; \-------------------------------------------------------------------/ ;\Salva il puntatore SI della locazione destina- PUSH SI ;|ta ad ospitare il primo carattere della Data ;/del messaggio ricevuto MOV CX,6 ;\ AT_05: CALL RxD__ ;|Memorizza i successivi 6 caratteri ascii esa- MOV CS:[SI],AL ;|decimali con le informazioni sulla DATA del INC SI ;|messaggio ricevuto LOOP AT_05 ;/ POP SI ;\Recupera il puntatore SI al primo carattere ;/della Data del messaggio ricevuto M_COLOR 1EH ;\ M_CURSOR 12,30 ;| MOV CX,3 ;| MOV AL,CS:[SI+5] ;| CALL BIOchr1 ;| /----------- Anno MOV AL,CS:[SI+4] ;| | /-------- Mese CALL BIOchr1 ;| | | /----- Giorno MOV AL,'/' ;| 50 30 11 CALL BIOchr1 ;| | | | MOV AL,CS:[SI+3] ;| 05 03 11 > 2005 marzo 11 > 11/03/05 CALL BIOchr1 ;| MOV AL,CS:[SI+2] ;| Stampa la Data CALL BIOchr1 ;| MOV AL,'/' ;| (3 coppie di caratteri scambiate) CALL BIOchr1 ;| MOV AL,'2' ;| CALL BIOchr1 ;| MOV AL,'0' ;| CALL BIOchr1 ;| MOV AL,CS:[SI+1] ;| CALL BIOchr1 ;| MOV AL,CS:[SI] ;| CALL BIOchr1 ;| ADD SI,6 ;/ ;---------------------------------------------------------------------- ;\Salva il puntatore SI della locazione destina- PUSH SI ;|ta ad ospitare il primo carattere dell'ORA ;/del messaggio ricevuto MOV CX,6 ;\ AT_06: CALL RxD__ ;|Memorizza i successivi 6 caratteri ascii esa- MOV CS:[SI],AL ;|decimali con le informazioni sull'ORA del INC SI ;|messaggio ricevuto LOOP AT_06 ;/ POP SI ;\Recupera il puntatore SI al primo carattere ;/dell'ORA del messaggio ricevuto M_COLOR 1EH ;\ M_CURSOR 12,42 ;| MOV CX,3 ;| MOV AL,CS:[SI+1] ;| CALL BIOchr1 ;| /----------- Ora MOV AL,CS:[SI] ;| | /-------- Minuti CALL BIOchr1 ;| | | /----- Secondi ADD SI,2 ;| 71 53 25 MOV AL,':' ;| CALL BIOchr1 ;| MOV AL,CS:[SI+1] ;| Stampa l'Ora CALL BIOchr1 ;| MOV AL,CS:[SI] ;| (3 coppie di caratteri scambiate) CALL BIOchr1 ;| ADD SI,2 ;| MOV AL,':' ;| CALL BIOchr1 ;| MOV AL,CS:[SI+1] ;| CALL BIOchr1 ;| MOV AL,CS:[SI] ;| CALL BIOchr1 ;| ADD SI,2 ;/ ;------------------------------------------------------------------------ CALL RxD__ ;\ MOV CS:[SI],AL ;| INC SI ;|Memorizza i 2 caratteri ascii esadecimali con CALL RxD__ ;|l'informazione del fuso orario (time zone, MOV CS:[SI],AL ;|GMT+n), senza metterli a video INC SI ;/ ; /-------------------------------------------------------------------\ ; | Il settimo e ultimo settore della stringa PDU contiene l'unica| ; | parte veramente utile al nostro progetto finale: il testo (UD,User| ; | Data) del messaggio SMS. | ; 07 | /\ /*-**-**-**-**-**-**-**-**-**-**-**-**-**--sequenza di | ; | 0F 61 76 7A 5C 0E 93 E7 6C 57 9A 0E 1A 09 01 codici da | ; | Nř=15 -*/ decodificare | ; | La prima coppia di caratteri, la stringa "0F",va interpretata come| ; | numero binario a 8 bit espresso in esadecimale: il valore ad essa| ; | corrispondente (0FH = 15 decimale) indica il numero effettivo dei| ; | caratteri che compongono il messaggio SMS dopo la sua messa in| ; | chiaro, cioč non Š il numero delle coppie di caratteri ad essa| ; | successive, raccolte nella seconda parte di questo settore. Una| ; | rapida indagine sottolinea che le coppie (ottetti) ad essa succes-| ; | sive ("61 76 7A 5C 0E 93 E7 6C 57 9A 0E 1A 09 01") sono 14, una in| ; | meno dei caratteri attesi (0FH=15); basta questo per anticipare la| ; | necessit… di intervenire con qualche magica strategia per far| ; | tornare i conti. | ; | | ; | Tra poco sveleremo l'arcano, riassumibile nel fatto che ognuno dei| ; | 15 caratteri del testo in chiaro sar… codificato a 7 bit(settetti)| ; | e incluso con orrenda manipolazione dentro le 14 coppie di carat-| ; | teri (ottetti) successive alla prima. | ; | | ; | La seconda parte del settore Š costituita da 14 coppie di caratte-| ; | ri, la stringa "61 76 7A 5C 0E 93 E7 6C 57 9A 0E 1A 09 01", e va| ; | interpretata come sequenza di numeri binari a 8 bit(bytes=ottetti)| ; | espressi in esadecimale, nel nostro esempio: 61H, 76H, 7AH, ...);| ; | come annunciato il testo in essi nascosto sar… codificato utiliz-| ; | zando un alfabeto a 7 bit, per cui sarŕ necessario estrarre dai| ; | 14*8=112 bit disponibili tutti e soli i gruppi di 7 bit,| ; | tralasciando eventuali bit in surplus. | ; \-------------------------------------------------------------------/ ; | La parte iniziale della procedura prepara il contatore CX con il ; 7 - 1 | numero di caratteri attesi nel testo del messaggio e ne mostra il ; | valore CALL RxD__ ;\ MOV CS:[SI],AL ;| INC SI ;|Memorizza i 2 caratteri ascii esadecimali con CALL RxD__ ;|il numero degli effettivi i caratteri del MOV CS:[SI],AL ;|messaggio ricevuto DEC SI ;/ CALL Asc2Byt_ ;\Trasforma in byte (in AL) la coppia di carat- MOV AH,00H ;|teri trovata in questo punto della stringa e MOV CH,00H ;|formatta il risultato a 16 bit (in AX) MOV CL,AL ;/Nell'esempio corrente alla fine AX=0FH=15 ;---------------------------------------------------------------------- PUSH CX ;\Salva 2 volte nello stack il numero CX di PUSH CX ;/caratteri attesi per il vero Mesaggio SMS ;\Salva il puntatore SI della locazione destina- PUSH SI ;|ta ad ospitare il primo carattere del testo ;/vero del messaggio ricevuto ;---------------------------------------------------------------------- AT_07: CALL RxD__ ;\ MOV CS:[SI],AL ;|Memorizza i caratteri ascii esadecimali con i INC SI ;|quali viene codificata l'informazione a 7 bit CMP AL,Invio ;|dell'effettivo messaggio SMS ricevuto; poichŠ JNE AT_07 ;|dopo di essi viene sempre fornita la sequenza: CALL RxD__ ;| "OK" verifica la MOV CS:[SI],AL ;|presenza del primo dei caratteri eccedenti INC SI ;|il testo; in questo modo la quantit… di bytes CMP AL,LineF ;|ricevuta Š irrilevante per la loro completa JNE AT_07 ;/memorizzazione. MOV CX,6 ;\ AT_08: CALL RxD__ ;|Memorizza i successivi 6 caratteri ascii esa- MOV CS:[SI],AL ;|decimali con la chiusura del messaggio SMS, i INC SI ;|caratteri "OK" LOOP AT_08 ;/ POP SI ;\Recupera il puntatore SI della locazione del ;/primo carattere del testo vero del messaggio POP CX ;\Recupera il numero CX di caratteri attesi per ;/il vero Mesaggio SMS ;---------------------------------------------------------------------- M_COLOR 1EH ;\ M_msgC SMSlen0,14,30,1FH;|Mostra il numero di caratteri previsti MOV AX,CX ;|"in chiaro" nel messaggio CALL Wor2Dec ;| M_msgN SMSlen1 ;/ ; | Le 14 coppie di caratteri successive alla prima sono le stringhe ; 7 - 2 | ("61","76", "7A", "5C", "0E", "93", "E7", "6C", "57", "9A", "0E", ; | "1A", "09" e"01") associate ai 14 bytes (ottetti) che nascondono il ; | testo da decifrare; la prima cosa da fare Š perci• tradurle in ; | bytes e renderle disponibili per l'analisi in un piccolo buffer di ; | memoria (SMSbyt) ad esse dedicato ;\Per estrarre le informazioni dai caratteri ;|della stringa Š opportuno trasformare ciascuna LEA DI,SMSbyt ;|coppia di caratteri ascii esadecimali nel AT_09: CALL Asc2Byt_ ;|corrispondente byte, salvato nella zona di MOV CS:[DI],AL ;|memoria puntata da SMSbyt; nell'esempio le 15 INC DI ;|coppie "61767A5C0E93E76C579A0E1A0901" + "??" LOOP AT_09 ;|diventano 15 bytes effettivi: 61H,76H,7AH,5CH, ;/0EH,93H,E7H,6CH,57H,9AH,0EH,1AH,09H,01H,??H ;---------------------------------------------------------------------- POP DX ;\Recupera in DX il Numero di CARATTERI nel SMS PUSH DX ;/ ; | Nel buffer di memoria SMSbyt Š ora disponibile la sequenza di 14 ; 7 - 3 | bytes estratti dalle 14 coppie di caratteri successive alla prima; ; | si prepara un secondo buffer di memoria, SMStxt, per infilarci i ; | caratteri a 7 bit (formattati a 8 con l'aggiunta di un bit7 nullo) ; | ricavati dal processo che stiamo per far partire;bisogna predispor- ; | re una struttura in grado di manipolare i bytes in ingresso a grup- ; | pi di 8 alla volta (CH=8) prevedendo comunque la possibilit… di ; | porre fine al ciclo di 8 se i caratteri attesi sono in misura non ; | multipla di 8; per separare i bit appartenenti al carattere(settet- ; | to) corrente da quelli da aggiungere in coda al byte successivo ; | ho pensato di formattare il byte corrente (ottetto, disponibile in ; | AL) a 16 bit, in AX, ponendogli davanti 8 bit a 0 (cioŠ con AH=00H) LEA SI,SMSbyt ;\Punta i bytes corrispondenti alle coppie di ;/caratteri ascii del Messaggio corrente LEA DI,SMStxt ; Punta l'area destinata alla stringa in chiaro ;\Predispone il "resto" iniziale da sommare al AT_10: MOV BH,00H ;|primo byte della sequenza di 8, al fine di ;|garantire l'iterativit… dell'algoritmo anche ;/all'inizio (in assenza di "resti" riportati..) MOV CH,8 ;\Prepara il meccanismo per ovviare al diabolico MOV CL,1 ;|sistema di codifica: ogni byte di partenza: AT_11: ;| 61H 76H ;| 01100001 01110110 MOV AH,00H ;|viene assunto dalla memoria e formattato a 16 MOV AL,CS:[SI] ;|bit, nel registro AX; INC SI ;/ AX=ZZZZZZZZ01100001 ZZZZZZZ01110110Z ; | Bastano ora dei semplici scorrimenti dei bit di AX verso sinistra ; 7 - 4 | (SHL) per ottenere entrambe le parti necessarie, ricordando che il ; | numero di shift sar…, byte dopo byte, progressivamente sempre pi— ; | grande, da 1 a 8; dal codice si capisce che questo numero Š affida- ; | to a CL, incrementato dopo il trattamento operato su ognuno degli 8 ; | bytes del gruppo. Per ottenere il settetto corrente basta prima ; | imporre uno scorrimento di AL di un posto verso destra (SHR) con ; | ingresso da sinistra di un bit a 0) e poi sommare logicamente (OR) ; | al risultato (copiato in BL) il valore corrente di BH, copia del ; | byte costruito in AH nella manipolazione del byte precedente (Š ; | chiaro che durante l'elaborazione del primo byte di ogni gruppo, si ; | dovrŠ comunque garantire l'automatismo ponendo l'ininfluente BH=0) ;\Viene poi spostato verso sinistra di un numero ;|di posizioni pari al suo ordine nella stringa SHL AX,CL ;|(1,2,3,...,8): ;/ AX=ZZZZZZZ01100001Z ZZZZZZ01110110ZZ ;\La parte bassa di AX Š la base del carattere ;|finale decodificato, AL=BL: MOV BL,AL ;| BL= 1100001Z 110110ZZ ;|Innanzi tutto lo si riformatta a 8 bit facendo ;|entrare uno "0" da sinistra SHR BL,1 ;| BL= Z1100001 Z110110Z ;|ed infine si crea sommandogli il "resto" ;|ottenuto nel giro precedente; OR BL,BH ;| BH+ ZZZZZZZZ+ ZZZZZZZ0+ ;| BL= 01100001= 01101100= ;| -------- -------- ;| BL= 01100001=61H="a" 01101100=6CH="l" MOV CS:[DI],BL ;|Non rimane che salvarlo nelle locazioni di INC DI ;/Deposito, per essere eventualmente trattato ;\Prima di chiamarlo in causa prepara il "resto" MOV BH,AH ;|per il prossimo byte: ;/ BH= ZZZZZZZ0 ZZZZZZ01 ; | La parte finale della procedura garantisce lo stesso servizio per ; 7 - 5 | tutti e 8 i potenziali bytes del gruppo, a meno che non sia stato ; | raggiunto il numero previsto (DX=0000H); le ultime istruzioni ; | aggiungono il terminatore 00H in coda al testo in chiaro del ; | messaggio SMS, inserito carattere dopo carattere nel secondo buffer ; | SMStxt, per poterlo stampare con la Macro M_msgC. INC CL ;\ DEC DX ;| JZ AT_12 ;|Controlla i contatori di processo per vedere DEC CH ;|se l'operazione di decodifica Š stata portata JNZ AT_11 ;|completamente a termine DEC SI ;| JMP AT_10 ;/ AT_12: MOV AL,00H ;\Mette un terminatore alla stringa ascii "in MOV CS:[DI],AL ;/chiaro", per poterla stampare con M_msgC ; | Trasforma i settetti estratti dalla stringa (formattati a 8 bit) in ; 7 - 6 | modo da corrispondere ai caratteri della Tabella dell'Alfabeto ; | Standard a 7 bit (default alphabet) secondo le specifiche GSM 03.38 LEA BX,AlfaTab ; Punta la Tabella dell'Alfabeto Standard a 7bit LEA SI,SMStxt ; Punta l'area destinata alla stringa in chiaro AT__1: MOV AL,CS:[SI] ;\Assume il carattere corrente e verifica se si CMP AL,00H ;|tratta del terminatore del testo in chiaro JE AT__2 ;/ PUSH CS ;\Trasferisce in AL il contenuto di DS:[BX + AL] POP DS ;|Per assicurare il corretto funzionamento anche XLAT ;/della versione EXE Š necessario copiare CS=DS MOV CS:[SI],AL ;\Sostituisce il carattere trovato con quello INC SI ;/previsto dalla tabella dell'Alfabeto a 7 bit JMP SHORT AT__1 ;---------------------------------------------------------------------- AT__2: M_COLOR 0EH ; Colore di Stampa per la stringa SMS in chiaro POP BX ;\ MOV AX,BX ;|Controlla se la lunghezza del messaggio,AX=BX, MOV DH,65 ;|Š minore o uguale a 65 caratteri; se Š cosŤ DIV DH ;|organizza la stampa su singola riga, DH=16 MOV DH,16 ;|(Prepara comunque la Riga iniziale di stampa CMP AL,00H ;| del messaggio SMS, al valore DH=16) JE AT_17 ;| CMP AL,01H ;| JNE AT_13 ;| CMP AH,00H ;| JE AT_17 ;/ AT_13: LEA SI,SMStxt ;\Se la lunghezza del messaggio Š maggiore di 65 MOV CH,00H ;|caratteri organizza la stampa su pi— righe MOV CL,AL ;|CL=AL numero di blocchi da 65 caratteri MOV BL,AH ;/BL=AH numero di caratteri eccedenti i blocchi AT_14: PUSH CX ;\ MOV CX,65 ;| M_CURSOR DH,7 ;| AT_15: MOV AL,CS:[SI] ;| CALL BIOchr1 ;|Stampa la stringa SMS in chiaro INC SI ;| LOOP AT_15 ;| POP CX ;| INC DH ;| LOOP AT_14 ;| MOV CL,BL ;|CL=BL numero di caratteri eccedenti i blocchi MOV BH,00H ;| MOV AX,80 ;| SUB AX,BX ;|Il messaggio SMS Š lungo al massimo 65 carat- SHR AX,1 ;|teri e, in questo caso, viene stampato al M_CURSOR DH,AL ;|centro della riga 16 (autocentratura) AT_16: MOV AL,CS:[SI] ;| CALL BIOchr1 ;|Stampa la stringa SMS in chiaro INC SI ;| LOOP AT_16 ;| JMP AT_18 ;/ AT_17: MOV AX,80 ;\ SUB AX,BX ;|Il messaggio SMS Š lungo al massimo 65 carat- SHR AX,1 ;|teri e, in questo caso, viene stampato al MOV DL,AL ;|centro della riga 16 (autocentratura) ;/ M_CURSOR DH,AL ;\Stampa la stringa SMS in chiaro M_msgN SMStxt ;/ AT_18: POP DX RET ; | Ogni dettaglio sulla tecnica di ricostruzione applicata a tutte le ; 7 - 7 | 14 coppie di caratteri previste dalla stringa PDU per ottenere gli ; | effettivi 15 caratteri a 7 bit previsti Š disponibile sul sito ; | http://www.giobe2000.it ; | La tabella seguente ne mostra una sintesi: ; | /-----\ ; | "61" = 01100001= 0 1100001| | = 1100001 = 61H= "a" ; | "76" = 01110110= 01 1101100 | = 1101100 = 6CH= "l" ; | "7A" = 01111010= 011 1101001 | = 1101001 = 69H= "i" ; | "5C" = 01011100= 0101 1100011 | = 1100011 = 63H= "c" ; | "0E" = 00001110= 00001 1100101 | = 1100101 = 65H= "e" ; | "93" = 10010011= 100100 1100001 | = 1100001 = 61H= "a" ; | "E7" = 11100111= 1110011 1100100| = 1100100 = 64H= "d" ; | 1110011 = 1110011 = 73H= "s" ; | "6C" = 01101100= 0 1101100| | = 1101100 = 6CH= "l" ; | "57" = 01010111= 01 0101110 | = 0101110 = 2EH= "." ; | "9A" = 10011010= 100 1101001 | = 1101001 = 69H= "i" ; | "0E" = 00001110= 0000 1110100 | = 1110100 = 74H= "t" ; | "1A" = 00011010= 00011 0100000 | = 0100000 = 20H= " " ; | "09" = 00001001= 000010 0100011 | = 0100011 = 23H= "#" ; | "01" = 00000001= 0000000 1000010| = 1000010 = 42H= "B" ; | \-----/ ; | Notare come i "resti" davanti a ciascun byte vengano ; | posti in coda ai bytes successivi, costruendo cosŤ ; | l'effettivo carattere del SMS ; | ; | Alla fine il testo del messaggio SMS Š:"aliceadsl.it #B"; nella sua ; | parte iniziale appare il promo del gestore che lo ha gestito (cosa ; | tipica dei messaggi spediti via internet) seguito da uno spazio e ; | (finalmente) dai 2 caratteri effettivamente digitati sulla tastiera ; | del Telefonino, "#B",un comando del protocollo software che useremo ; | nel progetto finale per il controllo remoto di un PC via telefono. ;/---------------------------------------------------------------------------\ ;|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 : Chk_RxD | ;| DESCRIZIONE : Rimane in attesa di un byte dalla porta seriale, verificando| ;| le condizioni ottimali per consentire la ricezione del| ;| dato desiderato (cioŠ che la linea sia libera); se esse non| ;| sono presenti (AH<>00H) verifica la pressione di tasti, | ;| rientrando in ricezione se non risultano tasti premuti o se | ;| l'eventuale tasto non Š "Q" o "F1". | ;| Il dato ricevuto correttamenmte (AH=00H) Š lasciato in AL. | ;\---------------------------------------------------------------------------/ Chk_RxD:CALL RxD_3_ ;\Attende un carattere dalla linea seriale e, CMP AH,00H ;|quando Š il momento giusto (AH=00H) torna al JNZ Chk_Rx0 ;|programma chiamante con il carattere in AL RET ;/ Chk_Rx0:MOV AH,01H ;\Altrimenti (AH<>0H) verifica se Š stato premu- INT 16H ;|to un tasto, per garantire di poter comunque JZ Chk_RxD ;|porre termine alla attesa; se non Š cosŤ ;/torna immediatamente in attesa dalla seriale CALL KEYwait ;\Se risulta premuto un tasto vuota il Buffer CMP AL,00H ;|della Tastiera e controlla se Š "Q" o "F1" JZ Chk_Rx1 ;/ AND AL,11011111B ;\Se il tasto premuto non Š "Q" la pressione CMP AL,'Q' ;|viene ignorata e si ritorna immediatamente in JNZ Chk_RxD ;/attesa dati dalla porta seriale ;\Altrimenti si rientra al Main con terminazione POP AX ;|immedata; NB: Tornando al MAIN con JMP invece POP AX ;|che con RET si lascia inevitabilmente "spoco" JMP _OUT ;|lo stack di 4 bytes dovuti alla chiamata di ;|questa sotto procedura ("CALL Chk_RxD") e a ;/quella l'ha richiesta ("CALL Sincro") ;\Se risulta premuto un tasto F1 si risincroniz- ;|za la ricezione dal Cellulare, DOPO AVERLO Chk_Rx1:CMP AH,F1 ;|ACCESO; in caso contrario ignora la pressione JNZ Chk_RxD ;/del tasto e torna in attesa dati dalla seriale ;\Se Š richiesta la Risincronizzazione si POP AX ;|rientra a livello "xxx00" recuperando dallo POP AX ;|stack i 4 bytes dovuti alla chiamata di questa JMP xxx00 ;|sottoprocedura ("CALL Chk_RxD") e a quella che ;|l'ha richiesta ("CALL Sincro"), per tornare ;/con JMP invece che con RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Sincro | ;| DESCRIZIONE : Trasmette sulla PORTA SERIALE la stringa "AT" alla quale | ;| il telefono deve fare eco con la stessa stringa "AT", se Š | ;| regolarmente acceso; se non fosse possibile stabilire un | ;| contatto Š possibile porre fine all'attesa pemendo "Q". | ;| | ;| [Testo Trasmesso]-->[ 3 bytes] 61 74 0D ----> "AT" + 0DH== | ;| / 61 74 0D ----> "AT" + 0DH== | ;| [Bytes Ricevuti]--->[ 9 bytes]| 0D 0A ----> | ;| | 4F 4B ----> "OK" | ;| \ 0D 0A ----> | ;\---------------------------------------------------------------------------/ Sincro: ;\Trasmette il carattere "A" e si mette subito MOV AL,'A' ;|in attesa per riceverlo di ritorno (attendendo CALL TxD_1 ;|il momento giusto, AH=00H); se non Š cosŤ CALL Chk_RxD ;|ripete da capo l'operazione, verificando prima CMP AL,'A' ;|se Š stato premuto un tasto, per garantire la JNZ Sincro ;|possibilit… di porre comunque termine alle ;/operazioni ;\Trasmette il carattere "T" e si mette subito MOV AL,'T' ;|in attesa per riceverlo di ritorno (attendendo CALL TxD_1 ;|il momento giusto, AH=00H); se non Š cosŤ CALL Chk_RxD ;|ripete da capo l'operazione, verificando prima CMP AL,'T' ;|se Š stato premuto un tasto, per garantire la JNZ Sincro ;|possibilit… di porre comunque termine alle ;/operazioni ;\Trasmette il carattere 0DH e si mette subito MOV AL,0DH ;|in attesa per riceverlo di ritorno (attendendo CALL TxD_1 ;|il momento giusto, AH=00H); se non Š cosŤ CALL Chk_RxD ;|ripete da capo l'operazione, verificando prima CMP AL,0DH ;|se Š stato premuto un tasto, per garantire la JNZ Sincro ;|possibilit… di porre comunque termine alle ;/operazioni ;--------------------------------------------------------------------- MOV CX,6 ;\Consuma i successivio 6 bytes ricevuti insieme Sinc1: CALL RxD_3_ ;|ai 3 precedenti ("AT" + 0DH==); si CMP AH,00H ;|tratta di: 0D 0A -------> JNZ Sinc1 ;| 4F 4B -------> "OK" LOOP Sinc1 ;/ 0D 0A -------> ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva Sinc2: M_corn 3 , 69 , 3 , 5 , 2AH , 01 , 01 ,1000H M_msgC Testo03,4,17,2FH; "Telefono Cellulare IN LINEA..." RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Chiama | ;| DESCRIZIONE : Trasmette sulla PORTA SERIALE la stringa AT+CMGR=n, con 'n' | ;| numero ascii ('0' ö '9') ricevuto in ingresso in AL. | ;\---------------------------------------------------------------------------/ AT_CMGR DB "AT+CMGR=1",0DH,00H Chiama: LEA SI,AT_CMGR ; Punta la stringa MOV CS:[SI+8],AL ;\Specifica il numero di messaggio desiderato ;/passato in ingresso, in AL Chi0: MOV AL,CS:[SI] ; CMP AL,00H ; Controlla se Š finita JZ Chi2 ; CALL TxD_1 ; Trasmette il carattere corrente INC SI ; Punta il prossimo Chi1: CALL RxD_3_ ;\Riceve di ritorno il carattere corrente CMP AH,00H ;|attendendo il momento giusto (AH=00H) JNZ Chi1 ;/ JMP SHORT Chi0 Chi2: RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Asc2nib_ [******* Versione dedicata ai programmi AT_ ******]| ;| DESCRIZIONE : Converte il carattere ASCII corrispondente ad uno dei simbo-| ;| li del sistema di numerazione esadecimale (da "0" a "9" e da| ;| "A" a "F"); tale carattere Š puntato in ingresso da CS:SI ed| ;| Š trasformato nel valore esadecimale 0xH a otto bit che gli| ;| corrisponde, lasciato in uscita in AL; il puntatore SI viene| ;| incrementato. | ;\---------------------------------------------------------------------------/ Asc2Nib_:MOV AL,CS:[SI] CMP AL,"9" JG Asc_0 CMP AL,"0" JGE Asc_1 Asc_0: AND AL,0DFH CMP AL,"F" JG Asc_2 CMP AL,"A" JB Asc_2 ;------------------ SUB AL,07H Asc_1: SUB AL,30H INC SI RET Asc_2: MOV AL,00H ;Errore: dato non attendibile RET ; sostituito con 00H ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Asc2byt_ [******* Versione dedicata ai programmi AT_ ******]| ;| DESCRIZIONE : Converte la coppia di caratteri ASCII corrispondenti a sim-| ;| boli del sistema di numerazione esadecimale (da "0" a "9" e| ;| da "A" a "F"); tale coppia Š puntata in ingresso da DS:SI ed| ;| Š trasformata nel numero esadecimale xyH a otto bit che le| ;| corrisponde, lasciato in uscita in AL; il puntatore SI viene| ;| incrementato di due posizioni. | ;\---------------------------------------------------------------------------/ Asc2Byt_: CALL Asc2Nib_ ;Preleva in AL il valore 0xH MOV AH,AL ;Sposta in AH il valore 0xH SHL AH,1 ;Trasforma in AH il valore nella forma x0H SHL AH,1 ; /---\ /--\ SHL AH,1 ; SHL: |ffC| <-- |AH| <-- 0 SHL AH,1 ; \---/ \--/ CALL Asc2Nib_ ;Preleva in AL il valore 0yH OR AL,AH ;Lascia in AL il valore finale xyH RET ;***************************************************************************** ; ---------------------------------------------- AT1_Decd proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- ; /-------------------------------------------------------------------\ ; 01 | Inizializza il Collegamento seriale su COM1 e il piano di Lavoro | ; \-------------------------------------------------------------------/ ;/---------------------------------[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 ;|Ingresso Risincronizzazione|;|Variabili necessarie per il Programma Seriale ;\---------------------------/;|NB: se il valore ricevuto in ingresso in SI Š xxx00: CALL DeskTop ;|0 la porta seriale desiderata NON Š presente ;|nel sistema e la procedura impone automatica- ;/mente il rientro al DOS (a livello _OUT) ; /-------------------------------------------------------------------\ ; 02 | Verifica la presenza in linea del Telefono Cellulare | ; \-------------------------------------------------------------------/ ;\Trasmette sulla PORTA SERIALE la stringa "AT" ;|alla quale il telefono,se regolarmente acceso, ;|deve fare eco con la stessa stringa "AT"; se ;|non fosse possibile stabilire un contatto Š ;|possibile porre fine all'attesa pemendo "Q" CALL Sincro ;| [Testo Trasmesso]-->[ 3 bytes] "AT"+0DH= ;| / "AT"+0DH= ;| [Bytes Ricevuti]--->[ 9 bytes]| ;| | "OK" ;/ \ ; /-------------------------------------------------------------------\ ; 03 | Main Loop - Menu principale: scelta dei Messaggi SMS da leggere | ; \-------------------------------------------------------------------/ xxx01: M_msgC MENU00,24,7 ,70H;\ MOV CX,09 ;| MOV AL,'1' ;|Predispone il Menu principale col la richiesta MOV DL,44 ;|del numero del Messaggio SMS da leggere: M_COLOR 74H ;| xxx02: M_CURSOR 24,DL ;| "Digita il Numero del SMS da leggere: CALL BIOchr1 ;| 1,2,3,4,5,6,7,8,9" ADD DL,2 ;| INC AL ;| LOOP xxx02 ;/ ;--------------------------------------------------------------------- xxx03: CALL KeyWait ;\ CMP AL,'9' ;|Attende la pressione di un tasto numerico di JG xxx04 ;|valore ascii "n" compreso tra "1" e "9" CMP AL,'1' ;| JGE xxx05 ;/ xxx04: AND AL,11011111B ;\Se si tratta del tasto "Q" viene imposta la CMP AL,'Q' ;/fine immediata della sessione di Comunicazione JNZ xxx03 JMP _OUT xxx05: PUSH AX ; Salva il numero del messaggio da leggere ; /-------------------------------------------------------------------\ ; 04 | Trasmissione della Stringa AT al Telefono Cellulare | ; \-------------------------------------------------------------------/ CALL Chiama ; Trasmette al cellulare la stringa AT+CMGR=n ; /-------------------------------------------------------------------\ ; | Verifica della presenza del Messaggio SMS nel Telefono Cellulare:| ; | in risposta alla richiesta il Telefono trasmette "di ritorno" gli| ; | stessi caratteri trasmessi (per esempio, per l'SMS nř1, la stringa| ; 05 | 41 54 2B 43 4D 47 52 3D 31 0D ---> "AT+CMGR=1", | ; | 10 caratteri, compreso il byte 0DH = ) seguiti, per esempio,| ; | dalla stringa di 16 caratteri: | ; | 0D 0A 2B 43 4D 47 52 3A 20 31 2C 2C 33 35 0D 0A ---> | ; | ---> ,,"+CMGR: 1,,35",,| ; | ma composta anche da un numero maggiore di caratteri, se il| ; | numero citato al termine della stringa ha pi— di 2 cifre; in ogni| ; | caso, se questo numero Š "0" (=30H) il messaggio non Š presente. | ; \-------------------------------------------------------------------/ MOV Byte Ptr CS:[NoSMS],00H; Inizializza [NoSMS] per "Messaggio inesisente" xxx06: CALL RxD_3_ ;\ CMP AH,00H ;| JNZ xxx06 ;| CMP AL,',' ;|I codici ascii Numerici posti dopo la stringa JNE xxx06 ;|,,"+CMGR: 1,," e prima della coppia xxx06_: CALL RxD_3_ ;|finale , indicano la quantit… di bytes CMP AH,00H ;|associata al messaggio: se essa vale "0" il JNZ xxx06_ ;|messaggio SMS non Š disponibile nel Telefonino CMP AL,',' ;| JNE xxx06 ;| xxx06__:CALL RxD_3_ ;| CMP AH,00H ;| JNZ xxx06__ ;| CMP AL,'0' ;/ POP AX ;\Recupera il numero del messaggio da leggere JE xxx07 ;/ ;--------------------------------------------------------------------- PUSH AX ;\ MOV Byte Ptr CS:[NoSMS],01H ;| M_corn 3,69,3,5,19H,01,01,1000H;|Se il messaggio Š disponibile ne mostra il M_msgC Testo04,4,12,1FH ;|numero alla fine del testo: POP AX ;|"Il Telefono Cellulare ha trasmesso il M_Chr AL, 4,66,1FH ;| messaggio SMS Nř" JMP xxx08 ;/ ;--------------------------------------------------------------------- xxx07: PUSH AX ;\ M_corn 3,69,3,5,4CH,01,01,1000H;|Se il messaggio non Š disponibile ne mostra M_msgC Testo05,4, 9,4FH ;|il numero integrato nel testo: POP AX ;|"Il messaggio SMS Nř non Š disponibile M_Chr AL, 4,28,4FH ;| nel Telefono Cellulare" M_msgn Testo06 ;/ ;--------------------------------------------------------------------- xxx08: CALL RxD__ ;\ CMP AL,Invio ;|Consuma COMUNQUE i bytes che concludono la JNE xxx08 ;|ricezione dell'intestazione del messaggio SMS, CALL RxD__ ;|per esempio 2C 2C 33 35 0D 0A ",,35", CMP AL,LineF ;|oppure: 2C 2C 31 30 30 0D 0A ",,100", JNE xxx08 ;/ ;--------------------------------------------------------------------- CMP Byte Ptr CS:[NoSMS],00H;\Se il Messaggio SMS Š stato trovato nel JNZ xxx10 ;|Telefono Cellulare viene posta a video la ;/cornice che ospita le sue parti principali ;--------------------------------------------------------------------- MOV CX,6 ;\Altrimenti recupera i 6 caratteri previsti in xxx09: CALL RxD_3_ ;|questo caso, in chiusura del messaggio SMS: CMP AH,00H ;| 0D 0A 4F 4b 0D 0A JNZ xxx09 ;| ,,"OK", , LOOP xxx09 ;|e rientra nel MAIN LOOP in attesa di altra JMP xxx03 ;/selezione ; /-------------------------------------------------------------------\ ; | Organizza la memorizzazione e la messa a video del Messaggio SMS| ; 06 | richiesto al Telefono Cellulare, in risposta alla richiesta fatta.| ; \-------------------------------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva xxx10: M_corn 14 , 69 , 8 , 5 , 19H , 01 , 01 ,1000H ;/---------------------------------------------\ CALL AT_SMS ;| Ricezione del messaggio SMS | ;\---------------------------------------------/ ; /-------------------------------------------------------------------\ ; 07 | Main Loop - Menu principale: scelta dei Messaggi SMS da leggere | ; \-------------------------------------------------------------------/ M_msgC MENU04,24,7 ,74H;\Predispone il Menu di gestione del contenuto M_COLOR 70H ;|Messaggio SMS decodificato: M_msgN MENU06 ;/ " F1 Leggi altri messaggi" ;--------------------------------------------------------------------- xxx11: CALL KEYwait ;\ CMP AL,00H ;|Attende la pressione del tasto funzionale "F1" JZ xxx12 ;|o del tasto "Q", nel qual caso viene imposta AND AL,11011111B ;|la fine immediata della sessione di Comunica- CMP AL,'Q' ;|zione JZ _OUT ;| JMP xxx11 ;/ xxx12: CMP AH,F1 ;\ JNZ xxx11 ;| CALL Sinc2 ;|Servizio tasto "F1" - Leggi altri messaggi" M_recup 14,69,8,5,1000H;| JMP xxx01 ;/ ; /-------------------------------------------------------------------\ ; 08 | Fase Standard d'Uscita dal Programma | ; \-------------------------------------------------------------------/ _OUT: CALL DESK_4 ;\ PUSH AX ;| M_COLOR 07H ;|Pulisce la prima e l'ultima riga del monitor MOV DH,24 ;|(di solito assegnate al Titolo e al Menu) CALL BARRA ;|e fissa il cursore sull'ultima; con questo MOV DH,0 ;|artificio al termine del programma il "prompt" CALL BARRA ;|cade nel punto ottimale, senza inquinare CALL RIP_cur ;|l'immagine in uscita,ovviamente ancora a video MOV DH,23 ;| MOV DL,0 ;| CALL SET_cur ;| 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_Decd ENDP _prog ENDS END INIZIO