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 : AT_Test2.ASM /--------------------------------------------\| ;| AUTORE : Giorgio OBER | ************ *********** ************** || ;| VERSIONE : giugno 2005 \--------------------------------------------/| ;| DESCRIZIONE : Questo progetto, dotato di Desktop di presentazione e di| ;| menu interattivi, decodifica e mette a video 9 messaggi SMS| ;| catturati in precedenza dalla memoria di un Telefono| ;| Cellulare con l'aiuto di Comandi, AT+CMGR=. | ;| Si tratta di uno strumento per svelare i segreti del| ;| Protocol Data Unit (PDU), lo standard utilizzato per | ;| trasmettere e ricevere SMS, alternativo al formato Testo,| ;| usato molto pi raramente. | ;| Questa versione decodifica le informazioni trovate nella| ;| stringa PDU di ciascuno dei 9 messaggi SMS, come far il| ;| progetto finale, AT1_Srvr. | ;| La versione AT_Test1 opera sostanzialmente lo stesso| ;| servizio, limitandosi a decodificare in blocco tutti e 9| ;| i messaggi e a mostrali insieme in un'unica schermata. | ;\---------------------------------------------------------------------------/ ; 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 ; 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 ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC AT_Test2 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP AT_Test2 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ;/---------------------------------------------------------------------------\ ;|Come gi sottolineato le stringhe PDU dei 9 messaggi sono state acquisite| ;|in precedenza con altri mezzi, dalla memoria del telefono e rese| ;|disponibili in questo sorgente ASM per il collaudo della PROCEDURA AT_Chk.| ;\---------------------------------------------------------------------------/ ;/-------------------------------------------------------------------\ ;| Numero non decodificato perch di tipo alfanumerico a 7bit | ;| 07/06/2005 | ;| 19:51:08 | ;| 19 | ;| "#a#r1060071010155#h" | ;\-------------------------------------------------------------------/ msg00 DB "079193432900402624" DB "12D0331A2C46ABC96C301B" DB "0000" DB "506070" DB "911580" DB "80" DB "13A3F0481E83D960B05B0C1683C56AB5111A" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| Numero non decodificato perch di tipo alfanumerico a 7bit | ;| 08/03/2005 | ;| 16:08:46 | ;| 23 | ;| "#b#m0#n0#r1060072011151" | ;\-------------------------------------------------------------------/ msg01 DB "079193432900605024" DB "12D0331A2C46ABC96C301B" DB "0000" DB "503080" DB "618064" DB "40" DB "1723F1A80D1BB96123790C6683C16E32582C16ABC500" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:40:30 | ;| 17 | ;| "aliceadsl.it #t02" | ;\-------------------------------------------------------------------/ msg02 DB "079193338528520004" DB "0E8500934016896754" DB "3900" DB "503011" DB "710403" DB "40" DB "1161767A5C0E93E76C579A0E1AD16132" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:36:25 | ;| 21 | ;| "aliceadsl.it #B#M0#N0" | ;\-------------------------------------------------------------------/ msg03 DB "079193338528040004" DB "0E8500934016896754" DB "3900" DB "503011" DB "716352" DB "40" DB "1561767A5C0E93E76C579A0E1A09474D" DB "D8C80903" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:37:37 | ;| 28 | ;| "aliceadsl.it #R1060072011155" | ;\-------------------------------------------------------------------/ msg04 DB "079193338518590000" DB "0E8500934016896754" DB "3900" DB "503011" DB "717373" DB "40" DB "1C61767A5C0E93E76C579A0E1A496330" DB "1B0C7693C162B158AD06" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:39:59 | ;| 17 | ;| "aliceadsl.it #t01" | ;\-------------------------------------------------------------------/ msg05 DB "079193338518590004" DB "0E8500934016896754" DB "3900" DB "503011" DB "719395" DB "40" DB "1161767A5C0E93E76C579A0E1AD16131" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:38:19 | ;| 57 | ;| "aliceadsl.it #R1060072011155#K1230#L144#S Prova Finale " | ;\-------------------------------------------------------------------/ msg06 DB "079193338528020004" DB "0E8500934016896754" DB "3900" DB "503011" DB "718391" DB "40" DB "3961767A5C0E93E76C579A0E1A496330" DB "1B0C7693C162B158AD365AC66433D88819A3" DB "D146531054FEB68741C6B43BCC2E834020" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:43:06 | ;| 91 | ;| "aliceadsl.it #o55#h#oaa#h#o00#h#off#h#o01#h#o02#h#o04#h#o08#h | ;| #o10#h#o20#h#o40#h#o80#h#o00#h"| ;\-------------------------------------------------------------------/ msg07 DB "079193338528530004" DB "0E8500934016896754" DB "3900" DB "503011" DB "713460" DB "40" DB "5B61767A5C0E93E76C579A0E1ABD6BB5" DB "117AF40E8747E8D11B061BA1476FB379841E" DB "BD61B1117AF486C946E8D11B461BA1476F18" DB "6E841EBD63B0117AF496C146E8D19B061BA1" DB "476F1C6C841EBD61B0111A" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 393331234567 | ;| 11/03/2005 | ;| 18:31:32 | ;| 50 | ;| "#b#m0#n0#r1060072011155#k1230#144#s prova finale ?" | ;\-------------------------------------------------------------------/ msg08 DB "079193432900808904" DB "0C91933313325476" DB "0000" DB "503011" DB "811323" DB "40" DB "3223F1A80D1BB96123790C6683C16E32" DB "582C16ABD546EB986C061BC568B4D11C0497" DB "BFED619039ED0EB3CB2005" ;--------------------------------------------------------------------- ATTRIB DB 00H NOnum DB "Non decodificato",00H Testo1 DB "Telefono: ",00H MENU01 DB "[1] [2] [3] [4] [5] [6] [7] [8] [9] Quit",00H MENU02 DB "Quit",00H SMSlen0 DB "Ricevuti ",00H SMSlen1 DB " caratteri",00H Testo00 DB "Simulazione!! Premi un tasto qualunque...",00H Testo01 DB "Sono in attesa di RICEZIONE dal Telefono Cellulare",00H Testo02 DB "in attesa",00H Testo03 DB " Telefono Cellulare in linea ",00H Tema0 DB " AT_Test2 - " Titolo DB "Collaudo Procedure di Decodifica delle stringhe PDU",00H Tema2 DB " Copyright www.giobe2000.it - ing. Giorgio OBER ",00H vuota DB " " DB " " vuota1 DB " ",00H ;--------------------------------------------------------------------- SMSbyt DB 512 DUP (' ') ;--------------------------------------------------------------------- SMStxt DB 512 DUP (' ') ;--------------------------------------------------------------------- ; 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. | ;\---------------------------------------------------------------------------/ DESKTOP:MOV AL,'' ;\ M_COLOR 71H ;|Predispone il Piano di lavoro CALL Riempi ;|su tavola zigrinata CALL VIA_cur ;/ M_COLOR 70H ;\ MOV DH,0 ;|Intestazione CALL BARRA ;| M_msgC Titolo, 0, 9,70H;/ MOV DH,24 ;\ CALL BARRA ;| M_msgC MENU02,24,70,70H;|Menu M_Chr 'Q',24,70,74H ;/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 3 , 69 , 3 , 5 , 4EH , 01 , 01 ,1000H M_msgC Testo01,4,13,4FH;\ "Sono in attesa di RICEZIONE M_msgC Testo02,4,18,0CFH;/ dal Telefono Cellulare" M_msgC Testo00,24,17,70H 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;\ Messaggio di chiusura M_msgC Tema2,14, 9,1FH;/ RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : AT_Chk | ;| 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, disponibile nel sorgente| ;| ASM in formato PDU (Protocol Description Unit), lo standard| ;| utilizzato da tutti i Telefoni Mobili.La versione AT_SMS del| ;| progetto finale godr dell'esperienza maturata in questo| ;| studio, decodificando al volo i caratteri mentre stanno| ;| arrivando dalla linea seriale. | ;| | ;| 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. | ;| | ;| 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. | ;| | ;| Per facilitare la comprensione della procedura preso per | ;| esempio il seguente messaggio SMS: | ;| | ;| 0791933385285200 00 0E8500934016896754 39 00 503011 715325 | ;| 400F61767A5C0E93E76C579A0E1A0901 | ;| | ;| La stringa utilizzata quella di un messaggio in ingresso| ;| al Telefonino e 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 numerazione| ;| esadecimale; in ogni caso bisogna interpretarli a coppie,| ;| dette ottetti, o coppie di semi-ottetti, e la loro interpre-| ;| tazione varia notevolmente in funzione del settore a cui si| ;| riferiscono. | ;\---------------------------------------------------------------------------/ AT_Chk: PUSH DX M_msgC vuota1,10,37,1FH ;\ M_msgC vuota1,14,37,1FH ;| M_msgC vuota,16,7,13H ;|Annulla le stampe dei messaggi precedenti M_msgC vuota,17,7,13H ;| M_msgC vuota,18,7,13H ;| M_msgC vuota,19,7,13H ;/ ; /-------------------------------------------------------------------\ ; | 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 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 ;\Salta i (N)*2 caratteri semplicemente ADD SI,CX ;|spostando in avanti il puntatore SI del ;/carattere corrente ; /-------------------------------------------------------------------\ ; | 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. | ; \-------------------------------------------------------------------/ ;\Salta i 2 caratteri del PDU Type semplicemente ADD SI,2 ;|spostando in avanti il puntatore SI del ;/carattere corrente ; /-------------------------------------------------------------------\ ; | 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 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 Testo1,10,28,1FH CALL Asc2Byt_ ;\Trasforma in byte (in AL) la coppia di carat- AND AL,01010000B ;|teri trovata in questo punto della stringa, CMP AL,01010000B ;|la coppia di caratteri della tipologia con cui JNE AT_Ch01 ;/ codificato il numero di "OA" M_msgN NOnum ;\Se si tratta di espressione codificata a 7 bit AT_Ch00:INC SI ;|(come il testo del messaggio, vedi avanti) LOOP AT_Ch00 ;|si evita di decodificarlo e di metterlo a JMP AT_Ch03 ;/video, limitandoci a saltare i bytes previsti AT_Ch01: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 AT_Ch02:MOV AL,CS:[SI+1] ;\Messa a video del numero di telefono CALL BIOchr1 ;|dell'utente che ha spedito il "messaggino" MOV AL,CS:[SI] ;| CALL BIOchr1 ;| ADD SI,2 ;| LOOP AT_Ch02 ;/ POP AX ;\Se la stringa NON contiene il carattere "F" CMP AH,00H ;|nella sua parte finale (numero telefonico del JE AT_Ch03 ;|Mittente con numero dispari di cifre) la ;/visualizzazione stata operata completamente INC SI ;\Altrimenti salta la "F" che serve per appaiare MOV AL,CS:[SI] ;|i caratteri e mette a video il carattere CALL BIOchr1 ;|rimasto INC SI ;/ ; /-------------------------------------------------------------------\ ; | 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| ; \-------------------------------------------------------------------/ ;\Salta i 2 caratteri del PID Protocol Identif. AT_Ch03:ADD SI,2 ;|spostando in avanti il puntatore SI del ;/carattere corrente ; /-------------------------------------------------------------------\ ; | 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| ; \-------------------------------------------------------------------/ ;\Salta i 2 caratteri del Data Coding Scheme, ADD SI,2 ;|spostando in avanti il puntatore SI del ;/carattere corrente ; /-------------------------------------------------------------------\ ; | 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 time zone, GMT+ | ; | 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 | ; \-------------------------------------------------------------------/ 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 ;/ ;---------------------------------------------------------------------- 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] ;| CALL BIOchr1 ;| MOV AL,CS:[SI] ;| Stampa l'Ora CALL BIOchr1 ;| ADD SI,2 ;| MOV AL,':' ;| (3 coppie di caratteri scambiate) CALL BIOchr1 ;| MOV AL,CS:[SI+1] ;| CALL BIOchr1 ;| MOV AL,CS:[SI] ;| CALL BIOchr1 ;| ADD SI,2 ;/ ;---------------------------------------------------------------------- ;\Salta la coppia di caratteri del fuso orario ADD SI,2 ;|(time zone, GMT+n) semplicemente spostando ;/avanti il puntatore ; /-------------------------------------------------------------------\ ; | 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 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=000FH = 15 PUSH CX ; Salva il Numero di CARATTERI attesi nel 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_Ch04: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_Ch04 ;|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_Ch05: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_Ch06: ;| 61H 76H ;| 01100001 01110110 MOV AH,00H ;|viene assunto dalla memoria e formattato a 16 MOV AL,CS:[SI] ;|bit, nel registro AX: (Z vale zero) 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 logicamente ;|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_Ch07 ;|Controlla i contatori di processo per vedere DEC CH ;|se l'operazione di decodifica stata portata JNZ AT_Ch06 ;|completamente a termine DEC SI ;| JMP AT_Ch05 ;/ AT_Ch07: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_Ch08:MOV AL,CS:[SI] ;\Assume il carattere corrente e verifica se si CMP AL,00H ;|tratta del terminatore del testo in chiaro JE AT_Ch09 ;/ 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_Ch08 ;---------------------------------------------------------------------- AT_Ch09:M_COLOR 13H ; 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_Ch14 ;| CMP AL,01H ;| JNE AT_Ch10 ;| CMP AH,00H ;| JE AT_Ch14 ;/ AT_Ch10: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_Ch11:PUSH CX ;\ MOV CX,65 ;| M_CURSOR DH,7 ;| AT_Ch12:MOV AL,CS:[SI] ;| CALL BIOchr1 ;|Stampa la stringa SMS in chiaro INC SI ;| LOOP AT_Ch12 ;| POP CX ;| INC DH ;| LOOP AT_Ch11 ;| 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_Ch13:MOV AL,CS:[SI] ;| CALL BIOchr1 ;|Stampa la stringa SMS in chiaro INC SI ;| LOOP AT_Ch13 ;| JMP AT_Ch15 ;/ AT_Ch14: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_Ch15: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 : 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 ;***************************************************************************** ; ---------------------------------------------- AT_Test2 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- CALL DeskTop xxx00: CALL KEYwait AND AL,11011111B CMP AL,'Q' JNZ xxx01 JMP _OUT xxx01: M_msgC MENU01,24,17,70H;\ M_Chr '1',24,18,74H ;| M_Chr '2',24,23,74H ;| M_Chr '3',24,28,74H ;| M_Chr '4',24,33,74H ;| M_Chr '5',24,38,74H ;|Menu M_Chr '6',24,43,74H ;| M_Chr '7',24,48,74H ;| M_Chr '8',24,53,74H ;| M_Chr '9',24,58,74H ;| M_Chr 'Q',24,70,74H ;/ ;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..." ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 14 , 69 , 8 , 5 , 1EH , 01 , 01 ,1000H LEA SI,msg01 CALL AT_Chk ;------------------------- xxx02: CALL KEYwait LEA SI,msg00 CMP AL,'1' JE Serv__ ;------------------------- LEA SI,msg01 CMP AL,'2' JE Serv__ ;------------------------- LEA SI,msg02 CMP AL,'3' JE Serv__ ;------------------------- LEA SI,msg03 CMP AL,'4' JE Serv__ ;------------------------- LEA SI,msg04 CMP AL,'5' JE Serv__ ;------------------------- LEA SI,msg05 CMP AL,'6' JE Serv__ ;------------------------- LEA SI,msg06 CMP AL,'7' JE Serv__ ;------------------------- LEA SI,msg07 CMP AL,'8' JE Serv__ ;------------------------- LEA SI,msg08 CMP AL,'9' JE Serv__ ;------------------------- AND AL,11011111B CMP AL,'Q' JZ _OUT JMP SHORT xxx02 Serv__: CALL AT_Chk JMP SHORT xxx02 _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" ;/---------------------------------------------\ AT_Test2 ENDP ;|Chiusura standard del codice | _prog ENDS ;*---------------------------------------------* END INIZIO ;|Chiusura del segmento di codice e conclusione| ;\---------------------------------------------/