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_Demo.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. | ;| | ;| Dopo la trasmissione del messaggio SMS dal Telefono Cellula-| ;| re e dopo la sua decodifica "in chiaro", la stringa ottenuta| ;| ispezionata alla ricerca di eventuali comandi previsti dal| ;| nostro Protocollo Seriale chiamato al controllo remoto di un| ;| PC, e, se disponibili, li mette in esecuzione, ospitandoli| ;| comunque in un ambiente guidato da numerosi menu interni. | ;| La simulazione locale garantita per tutti i primi 9 SMS| ;| (se contenenenti le sottostringhe) consentetndo la verifica| ;| dell'effetto che sar imposto al PC nella versione finale di| ;| questo progetto, AT1_PROT. | ;| | ;| Tutti i COMANDI del protocollo sono stringhe di caratteri| ;| Ascii che iniziano con il medesimo prefisso, "#";| ;| Attualmente sono disponibili i servizi: | ; #A ClearScreen Clasico ; #B DeskTop Classico ; #C Fa sparire il cursore ; #D Fa tornare il cursore ; #E Cornice di primo tipo ; #F Cornice di secondo tipo ; #G Cornice di terzo tipo ; #H Aspetta Pressione Tasto ; #I Fine Sequenza #Tnn di stringhe di COMANDI ; #Jnn Consuma un ritardo pari a n volte 55ms ; numero n=0199 ; colonna cc=0079 ; #Krrcc Coordinate di stampa ; riga rr=0024 ; sfondo s=07 ; #Lpps Attributo di colore, testo sfondo ; primo piano pp=0015 ; #Mn Intestazione personalizzata ; numero n=09 ; #Nn Menu personalizzato ; numero n=09 ; #Oxy Uscita di Dato a 8 bit su porta parallela ; #Pxy Visualizza la stringa del Byte xyH ; #Qxywz Visualizza la stringa della Word xywzH ; larghezza compresa cornice ll=0380 ; colonna angolo alto a sinistra cc=0079 ; ombra 0=senza, 1=con ; colore sfondo s=07 ; #Raallrrcctopps Stampa una cornice programmabile a video ; colore primo piano pp=0015 ; tipo 0=tratto semplice, 1=tratto doppio ; riga angolo alto a sinistra rr=0024 ; altezza compresa cornice aa=0325 ; #Saa..a% Sequenza di caratteri ascii ; NB: % carattere terminatore di stringa ; caratteri ascii da porre a video ; #Tnn Sequenza di COMANDI Precostituiti ; numero nn=0099 ; larghezza compresa cornice ll=0380 ; colonna angolo alto a sinistra cc=0079 ; #Uaallrrcc Recupera area coperta da cornice ; riga angolo alto a sinistra rr=0024 ; altezza compresa cornice aa=0325 ;| | ;| 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 F2 EQU 3CH ;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 Dec2Byt:NEAR EXTRN Wor2Dec:NEAR EXTRN Byt2Asc:NEAR EXTRN Wor2Asc:NEAR EXTRN RamCur:NEAR EXTRN RamCorn:NEAR EXTRN RamRecup:NEAR EXTRN Delay:NEAR EXTRN Del_1000:NEAR EXTRN Del_2000:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC AT1_Demo ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP AT1_Demo ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 00H NoSMS DB 00H Titolo DB " Collaudo del Controllo Remoto con SMS via ",00H Titolo1 DB "COM1",00H Tema0 DB "AT1_Demo - Controllo Remoto PC via " 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 MENU07 DB " F2",00H MENU08 DB " Esegui Protocollo ",00H MENU09 DB "Premi un tasto per continuare... ",00H Vuota01 DB " " Vuota02 DB " ",00H ;--------------------------------------------------------------------- Note_ DB "Questo eseguibile, ~AT1_Demo.COM~, stato progettato per",00H DB "rendere possibile il Controllo Remoto del Computer sul quale",00H DB " in esecuzione, esercitato interpretando i messaggi SMS",00H DB "spediti ad un Telefono Cellulare, collegato alla porta COM1",00H DB "del Computer.",00H DB " ",00H DB "Il Computer sotto controllo organizza lettura e gestione dei",00H DB "primi 9 Messaggi SMS ricevuti e, se contengono le stringhe",00H DB "previste per i COMANDI del Protocollo Software originale,",00H DB "descritto in dettaglio nella allegata documentazione (vedi",00H DB "anche le pagine di ~www.giobe2000.it~), ne estre le sequenze",00H DB "di bytes e consente (F2) di metterle in esecuzione, in modo",00H DB "da mostrarne l'effetto sul Pesonal Computer Locale. ",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 Testo09 DB " COMANDO ",00H Testo10 DB "PARAMETRO",00H Testo11 DB " non riconosciuto",00H Testo12 DB "ERRORE di SINTASSI: Il programma ha rilevato un ",00H Testo13 DB "Sequenza COMANDI PROTOCOLLO eseguita... Premi un tasto per tornare...",00H ;-------------------------------------------------------------------- TabINT DW INTES0 DW INTES1 DW INTES2 DW INTES3 DW INTES4 DW INTES5 DW INTES6 DW INTES7 DW INTES8 DW INTES9 INTES0 DB "Collaudo della Porta Seriale COM1 - Protocollo:19200,N,1,8",00H INTES1 DB "Controllo Remoto via Seriale",00H INTES2 DB " ",00H INTES3 DB " ",00H INTES4 DB " ",00H INTES5 DB " ",00H INTES6 DB " ",00H INTES7 DB " ",00H INTES8 DB " ",00H INTES9 DB " ",00H ;-------------------------------------------------------------------- TabMENU DW MENU_0 DW MENU_1 DW MENU_2 DW MENU_3 DW MENU_4 DW MENU_5 DW MENU_6 DW MENU_7 DW MENU_8 DW MENU_9 MENU_0 DB "Copyright www.giobe2000.it - ing. Giorgio OBER ",00H MENU_1 DB "ESC per terminare",00H MENU_2 DB " ",00H MENU_3 DB " ",00H MENU_4 DB " ",00H MENU_5 DB " ",00H MENU_6 DB " ",00H MENU_7 DB " ",00H MENU_8 DB " ",00H MENU_9 DB " ",00H ;-------------------------------------------------------------------- CHAR_00: DB 00000000B ; DB 01111100B ; DB 11000110B ; DB 11001110B ; DB 11011110B ; DB 11110110B ; DB 11100110B ; DB 01111100B ; ;-------------------------------------------------------------------- DB 00000000B ; DB 00110000B ; DB 01110000B ; DB 00110000B ; DB 00110000B ; DB 00110000B ; DB 00110000B ; DB 11111100B ; ;-------------------------------------------------------------------- DB 00000000B ; DB 01111000B ; DB 11001100B ; DB 00001100B ; DB 00111000B ; DB 01100000B ; DB 11001100B ; DB 11111100B ; ;-------------------------------------------------------------------- DB 00000000B ; DB 01111000B ; DB 11001100B ; DB 00001100B ; DB 01111000B ; DB 00001100B ; DB 11001100B ; DB 01111000B ; ;-------------------------------------------------------------------- TxMsg01 DB "#B" ; DeskTop Classico DB "#C" ; Fa sparire il cursore DB "#L007" ; Attributo di colore, testo sfondo pp,s DB "#K0022" ; Coordinate di stampa riga, colonna rr,cc DB "#SCollaudo Trasmissione Stringa di Comandi%" DB "#K2419" ; Coordinate di stampa riga, colonna rr,cc DB "#S Premi un tasto qualunque per cominciare %" DB "#H" ; Aspetta Pressione Tasto DB "#R0760091011141" ; Stampa una cornice programmabile a video ; rr,cc,rr,cc,t,o,tt,s DB "#L151" ; Attributo di colore, testo sfondo pp,s DB "#K1225" ; Coordinate di stampa riga, colonna rr,cc DB "#S Benvenuto su www.Giobe2000.it %" DB "#L007" ; Attributo di colore, testo sfondo pp,s DB "#K2419" ; Coordinate di stampa riga, colonna rr,cc DB "#SPremi un tasto qualunque per pulire lo schermo%" DB "#H" ; Aspetta Pressione Tasto DB "#U07600910" ; Recupera la cornice DB "#L007" ; Attributo di colore, testo sfondo pp,s DB "#K2419" ; Coordinate di stampa riga, colonna rr,cc DB "#S Premi un tasto qualunque per terminare... %" DB "#H" ; Aspetta Pressione Tasto DB "#A" ; Fai ClearScreen sul Monitor remoto DB "#D" ; Fa riapparire il cursore DB "#H" ; Aspetta Pressione Tasto DB "#I" ; Fine sequenza di COMANDI DB 00H ;-------------------------------------------------------------------- TxMsg11 DB "#G" ; Cornice di terzo tipo DB "#M0" ; Intestazione personalizzata DB "#N0" ; Menu personalizzato DB "#C" ; Fa sparire il cursore DB "#L150" ; Attributo di colore, testo sfondo pp,s DB "#K1023" ; Coordinate di stampa riga, colonna rr,cc DB "#SUscita Dato a 8 bit su porta parallela%" DB "#R0308123800140" ; Stampa una cornice programmabile a video ; rr,cc,rr,cc,t,o,tt,s DB "#L150" ; Attributo di colore, testo sfondo pp,s DB "#K1617" ; Coordinate di stampa riga, colonna rr,cc DB "#SGuarda sul connettore della Porta Parallela LPT1%" DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00000000B ;|del Byte xyH e poi eroga su LPT1 DB "#O00" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",10000001B ;|del Byte xyH e poi eroga su LPT1 DB "#O81" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",01000010B ;|del Byte xyH e poi eroga su LPT1 DB "#O42" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00100100B ;|del Byte xyH e poi eroga su LPT1 DB "#O24" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00011000B ;|del Byte xyH e poi eroga su LPT1 DB "#O18" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00100100B ;|del Byte xyH e poi eroga su LPT1 DB "#O24" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",01000010B ;|del Byte xyH e poi eroga su LPT1 DB "#O42" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",10000001B ;|del Byte xyH e poi eroga su LPT1 DB "#O81" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00000000B ;|del Byte xyH e poi eroga su LPT1 DB "#O00" ;/ DB "#J36" ;\Ritardo di 2 secondi DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",10000000B ;|del Byte xyH e poi eroga su LPT1 DB "#O80" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",01000000B ;|del Byte xyH e poi eroga su LPT1 DB "#O40" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00100000B ;|del Byte xyH e poi eroga su LPT1 DB "#O20" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00010000B ;|del Byte xyH e poi eroga su LPT1 DB "#O10" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00001000B ;|del Byte xyH e poi eroga su LPT1 DB "#O08" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00000100B ;|del Byte xyH e poi eroga su LPT1 DB "#O04" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00000010B ;|del Byte xyH e poi eroga su LPT1 DB "#O02" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00000001B ;|del Byte xyH e poi eroga su LPT1 DB "#O01" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00000010B ;|del Byte xyH e poi eroga su LPT1 DB "#O02" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00000100B ;|del Byte xyH e poi eroga su LPT1 DB "#O04" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00001000B ;|del Byte xyH e poi eroga su LPT1 DB "#O08" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00010000B ;|del Byte xyH e poi eroga su LPT1 DB "#O10" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00100000B ;|del Byte xyH e poi eroga su LPT1 DB "#O20" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",01000000B ;|del Byte xyH e poi eroga su LPT1 DB "#O40" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",10000000B ;|del Byte xyH e poi eroga su LPT1 DB "#O80" ;/ DB "#J09" ;\Ritardo di mezzo secondo, fissa colore e DB "#L140#K1341" ;|coordinate di stampa, visualizza la stringa DB "#P",00000000B ;|del Byte xyH e poi eroga su LPT1 DB "#O00" ;/ ;------------------- DB "#L154" ; Attributo di colore, testo sfondo pp,s DB "#K1926" ; Coordinate di stampa riga, colonna rr,cc DB "#S Premi un tasto per terminare %" DB "#H" ; Aspetta Pressione Tasto DB "#I" ; Fine sequenza di COMANDI DB 00H ;-------------------------------------------------------------------- TxMsg21 DB "#B" ; DeskTop Classico DB "#C" ; Fa sparire il cursore DB "#L007" ; Attributo di colore, testo sfondo pp,s DB "#K0027" ; Coordinate di stampa riga, colonna rr,cc DB "#SGestione CountDown Remoto%" DB "#R0310123611141" ; Stampa una cornice programmabile a video ; rr,cc,rr,cc,t,o,tt,s DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",09H ;/stringa del Byte xyH DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",08H ;/stringa del Byte xyH DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",07H ;/stringa del Byte xyH DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",06H ;/stringa del Byte xyH DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",05H ;/stringa del Byte xyH DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",04H ;/stringa del Byte xyH DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",03H ;/stringa del Byte xyH DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",02H ;/stringa del Byte xyH DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",01H ;/stringa del Byte xyH DB "#J18" ;\Ritardo di 1 secondo, fissa colore e DB "#L151#K1340" ;|coordinate di stampa e poi visualizza la DB "#P",00H ;/stringa del Byte xyH DB "#L007" ; Attributo di colore, testo sfondo pp,s DB "#K2420" ; Coordinate di stampa riga, colonna rr,cc DB "#S CountDown Terminato %" DB "#J36" ; Consuma un ritardo pari a 36*55ms= 2 secondi DB "#U03101236" ; Recupera la cornice DB "#L047" ; Attributo di colore, testo sfondo pp,s DB "#K2420" ; Coordinate di stampa riga, colonna rr,cc DB "#SIl controllo terminer tra 2 secondi%" DB "#J36" ; Consuma un ritardo pari a 36*55ms= 2 secondi DB "#A" ; Fai ClearScreen sul Monitor remoto DB "#D" ; Fa riapparire il cursore DB "#I" ; Fine sequenza di COMANDI DB 00H ;-------------------------------------------------------------------- ;\Deposito per i caratteri a scii numerici digitati in DepoPar DB 20 DUP (00H) ;|fase di acquisizione dei possibili PARAMETRI dei ;|COMANDI che li richiedono;sono previste 20 locazioni ;/utili per esempio per la stampa di una cornice ;--------------------------------------------------------------------- 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 JNZ DESK__ ;| JMP DESK_2 ;| DESK__: 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 15 , 64 , 6 , 7 , 31H , 01 , 01 ,2000H LEA SI,Note_ M_COLOR 3FH MOV CX,13 MOV DH,7 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,7 ,32,3FH ;| M_Chr AL,10,68,3FH ;/ CALL KEYwait ;M_recup altezza,larghezza,riga,colonna,salva M_recup 15 , 64 , 6 , 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 : 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 ;/---------------------------------------------------------------------------\ ;| 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 come base anche dal progetto| ;| finale "AT_PROT",gode della tecnica di decodifica collaudata| ;| con la procedura "AT_Chk", progettata in AT_Test1 e AT_Test2| ;| interpretando in questo caso 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; 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 il loro| ;| significato varia notevolmente in funzione del settore a cui| ;| si riferiscono. | ;\---------------------------------------------------------------------------/ RxD__: MOV DX,CS:[port_D];\ IN AL,DX ;| TEST AL,01H ;|Procedura di seriale utile in fase di lettura JZ RxD__ ;|dei codici ascii del Messaggio SMS non essendo MOV DX,CS:[port_8];|probabile il pericolo di mancata Ricezione IN AL,DX ;| 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 bit7bit4 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 lascia AH=01H (anche se cio sono errori in linea)| ;|/-----------\ | ;|| | La scelta di affidare ad AH l'attendibilit del dato ricevuto| ;|| | consente a questa procedura di tornare comunque al programma| ;|| NB: | chiamante, permetendogli la discrezionalit di rientrare in| ;|| | attesa di dati dalla seriale o di porre termine a se stesso,| ;|| | ma COMPROMETTE l'affidabilit della Ricezione. | ;|\-----------/ | ;\---------------------------------------------------------------------------/ 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 : MaxiChr | ;|DESCRIZIONE: Stampa INGRANDITO il carattere puntato in ingresso da CS:[DI].| ;\---------------------------------------------------------------------------/ MaxiChr:PUSH CX PUSH AX CALL Via_Cur ;\Posiszione di stampa iniziale a partire dalla MOV DH,10 ;/riga 10, colonna 36 MOV CX,8 ;\Predispone la stampa di 8 righe di pseudoPixel GRA_00: PUSH CX ;/(risoluzione GGA, 8*8) M_CURSOR DH,36 ; Fissa la posizione di stampa corrente MOV CX,8 ;\ MOV AH,CS:[DI] ;| GRA_01: SHL AH,1 ;| MOV AL,'' ;|Stampa gli 8 Pseudo-PIXEL di ciascuna delle 8 JC GRA_02 ;|righe previste dalla risoluzione CGA, ACCESI MOV AL,' ' ;|se il bit corrente del byte Corrente (puntato GRA_02: PUSH AX ;|da ES:[DI]) uguale a 1, e SPENTI se vale 0 CALL BIOchr1 ;| POP AX ;| LOOP GRA_01 ;/ POP CX ;\ INC DI ;|Provvede alla stampa sulla riga successiva INC DH ;| LOOP GRA_00 ;/ POP AX POP CX RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Cornice1 | ;| DESCRIZIONE : Stampa una cornice a tutto video, con accesso diretto alla| ;| Ramvideo, in risposta al COMANDO "#E" Cornice di primo tipo.| ;\---------------------------------------------------------------------------/ Cornice1:PUSH SI MOV AX,0B800H MOV ES,AX ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 25 , 80 , 0 , 0 , 04H , 00 , 00 ,1000H POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Cornice2 | ;| DESCRIZIONE : Stampa una cornice a tre settori, con i due esterni, in alto| ;| e in basso, adatti ad ospitare eventuale inestazione e Menu,| ;| e quello centrale a 19 righe, con accesso diretto a Ramvideo| ;| in risposta al COMANDO "#F" Cornice di secondo tipo. | ;\---------------------------------------------------------------------------/ Cornice2:PUSH SI MOV AX,0B800H MOV ES,AX ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 3 , 80 , 0 , 0 , 04H , 00 , 00 ,1000H M_corn 19 , 80 , 3 , 0 , 04H , 00 , 00 ,1000H M_corn 3 , 80 , 22 , 0 , 04H , 00 , 00 ,1000H POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Cornice3 | ;| DESCRIZIONE : Stampa una cornice a tre settori, con i due esterni, in alto| ;| e in basso, adatti ad ospitare eventuale inestazione e Menu,| ;| e quello centrale a 21 righe, con accesso diretto a Ramvideo| ;| in risposta al COMANDO "#G" Cornice di terzo tipo. | ;\---------------------------------------------------------------------------/ Cornice3:PUSH SI MOV AX,0B800H MOV ES,AX ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 3 , 80 , 0 , 0 , 04H , 00 , 00 ,1000H M_corn 21 , 80 , 2 , 0 , 04H , 00 , 00 ,1000H M_corn 3 , 80 , 22 , 0 , 04H , 00 , 00 ,1000H M_Chr '*', 2, 0,04H M_Chr '*', 2,79,04H M_Chr '*',22, 0,04H M_Chr '*',22,79,04H POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : DeskCom | ;| DESCRIZIONE : Stampa una cornice a tre settori, con i due esterni, in alto| ;| e in basso, adatti ad ospitare eventuale inestazione e Menu,| ;| e quello centrale a 21 righe, con accesso diretto a Ramvideo| ;| in risposta al COMANDO "#B" DeskTop Classico | ;\---------------------------------------------------------------------------/ DeskCom:PUSH SI MOV AX,0B800H MOV ES,AX CALL VIA_cur ;\/--------------------------------------------\ MOV AL,' ' ;||**** Piano di lavoro e Menu principale *****| M_COLOR 71H ;|\--------------------------------------------/ CALL Riempi ;/Predispone il Piano Lavoro su tavola zigrinata M_COLOR 70H ;\ MOV DH,0 ;| CALL BARRA ;|Barre per l'Intestazione e per il Menu MOV DH,24 ;| CALL BARRA ;/ POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Intesta | ;| DESCRIZIONE : Consente di inserire uno dei 10 testi predisposti per | ;| intestare il piano di lavoro, adatti ad essere inseriti | ;| nella seconda riga dello schermo, con Cornici2 o Cornici2 | ;| Il numero del messaggio desiderato fornito in ingresso in | ;| forma ascii numerica (da "0" a "9") nella variabile DepoPAR | ;| caricata in fase di ricezione; il messaggio sar stampato | ;| con colore BIANCO BRILLANTE su BLU con tecnica autocentran- | ;| te del testo e la sua dimensione deve rigorosamente essere | ;| al massimo di 78 caratteri | ;| In risposta al COMANDO "#Mn", Intestazione personalizzata | ;\---------------------------------------------------------------------------/ Intesta:PUSH SI MOV DH,1 ; Predipone la stampa sulla seconda riga M_CURSOR DH,1 ;\ COMANDO "#Nn", Menu personalizzato M_COLOR 1FH ;| tipo,n=09 MOV AL,' ' ;|Prepara la barra di 78 caratteri adatta ad MOV CX,78 ;|essere ospitata dalle cornici di tipo Cornice2 Inte0: CALL BIOchr1 ;|o Cornice3 LOOP Inte0 ;/ LEA DI,TabINT ; Punta la Tabella degli indirizzi INTESTAZIONE Inte1: LEA SI,DepoPar ;\Recupera dalla Locazione Deposito il carattere MOV AL,CS:[SI] ;|numerico, da "0" a "9", digitato in fase di ;/acquisizione del Tipo del COMANDO SUB AL,'0' ;\Calcola dinamicamente l'indirizzo del SHL AL,1 ;|messaggio desiderato per intestazione e, con MOV AH,00H ;|l'aiuto della Tabella TabINT ne lascia ADD DI,AX ;|l'indirizzo in SI MOV SI,CS:[DI] ;/ PUSH SI ;\ MOV DL,00H ;| Inte2: MOV AL,CS:[SI] ;| INC DL ;| INC SI ;|Calcola automaticamente la colonna di stampa CMP AL,00H ;|ideale per centrare il messaggio JNE Inte2 ;| DEC DL ;| MOV AL,80 ;| SUB AL,DL ;| MOV DL,2 ;| DIV DL ;| POP SI ;/ M_CURSOR DH,AL ;\ CALL BIOSmsg ;|Stampa il messaggio centrato sulla riga DH POP SI ;/ RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : MenuCom | ;| DESCRIZIONE : Consente di inserire uno dei 10 testi predisposti per | ;| intestare il piano di lavoro, adatti ad essere inseriti | ;| nella penultima riga dello schermo, con Cornici2 o Cornici2 | ;| Il numero del messaggio desiderato fornito in ingresso in | ;| forma ascii numerica (da "0" a "9") nella variabile DepoPAR | ;| caricata in fase di ricezione; il messaggio sar stampato | ;| con colore BIANCO BRILLANTE su BLU con tecnica autocentran- | ;| te del testo e la sua dimensione deve rigorosamente essere | ;| al massimo di 78 caratteri | ;| In risposta al COMANDO "#Nn", Menu personalizzato | ;\---------------------------------------------------------------------------/ MenuCom:PUSH SI MOV DH,23 ; Predipone la stampa sulla penultima riga M_CURSOR DH,1 ;\ COMANDO "#Nn", Menu personalizzato M_COLOR 1FH ;| tipo,n=09 MOV AL,' ' ;|Prepara la barra di 78 caratteri adatta ad MOV CX,78 ;|essere ospitata dalle cornici di tipo Cornice2 Menu0: CALL BIOchr1 ;|o Cornice3 LOOP Menu0 ;/ LEA DI,TabMENU ; Punta la Tabella degli indirizzi di MENU ;\Recupera dalla Locazione Deposito il carattere ;|numerico, da "0" a "9", digitato in fase di ;|acquisizione del Tipo del COMANDO, calcola ;|dinamicamente l'indirizzo del messaggio per il JMP Inte1 ;|MENU e, con l'aiuto della Tabella TabMENU ne ;|estrae l'indirizzo con il quale provvede alla ;|messa a video sulla penultima riga e sulla ;/colonna di stampa ideale per centrarlo ;/---------------------------------------------------------------------------\ ;| PROCEDURA : GoToXY | ;| DESCRIZIONE : Fissa la posizione di stampa sul Monitor Remoto (GoToXY). | ;| In risposta al COMANDO "#Krrcc", Coordinate di stampa | ;\---------------------------------------------------------------------------/ GoToXY: PUSH SI ;\Locazioni Deposito per i 4 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/delle coordinate del COMANDO MOV DH,CS:[DI] ;\ COMANDO "#Krrcc" Coordinate di stampa INC DI ;| colonna cc=0079 SUB DH,'0' ;| riga rr=0024 MOV AL,10 ;|Recupera dalle prime 2 locazioni di deposito MUL DH ;|i caratteri ascii numerici che esprimono la MOV DH,CS:[DI] ;|desiderata coordinata di riga, tra "00" e "24" INC DI ;|e calcola il valore esadecimale corrispondente SUB DH,'0' ;|lasciato alla fine nel registro DH ADD DH,AL ;/ MOV DL,CS:[DI] ;\ INC DI ;| SUB DL,'0' ;|Recupera dalle seconde 2 locazioni di deposito MOV AL,10 ;|i caratteri ascii numerici che esprimono la MUL DL ;|desiderata coordinata di colonna, tra "00" e MOV DL,CS:[DI] ;|a "79" e calcola il valore esadecimale corri- SUB DL,'0' ;|spondente lasciato alla fine nel registro DL ADD DL,AL ;/ M_CURSOR DH,DL POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Colore | ;| DESCRIZIONE : Fissa il colore di ogni carattere posto a video sul Monitor | ;| Remoto da ora in poi. | ;| In risposta al COMANDO "#Lpps", Colore del testo e sfondo. | ;\---------------------------------------------------------------------------/ Colore: PUSH SI ;\Locazioni Deposito per i 3 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/del COLORE di PRIMO PIANO del COMANDO MOV DH,CS:[DI] ;\ COMANDO "#Lpps" Colore testo sfondo INC DI ;| sfondo s=07 SUB DH,'0' ;| primo piano pp=0015 MOV AL,10 ;|Recupera dalle prime 2 locazioni di deposito MUL DH ;|i caratteri ascii numerici che esprimono il MOV DH,CS:[DI] ;|colore di Primo Piano, tra "00" e "15" INC DI ;|e calcola il valore esadecimale corrispondente SUB DH,'0' ;|lasciato alla fine nel registro DH ADD DH,AL ;/ ;\Recupera dall'ultima locazione di deposito MOV AH,CS:[DI] ;|il carattere ascii numerico che esprime il SUB AH,'0' ;|colore di Sfondo, tra "0" e "7" e calcola il ;|valore esadecimale corrispondente lasciato ;/alla fine nel registro AH SHL AH,1 ;\ SHL AH,1 ;|Ricostruisce in AH il codice esadecimale del SHL AH,1 ;|Colore desiderato SHL AH,1 ;| OR AH,DH ;/ M_COLOR AH POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : OutLPT | ;| DESCRIZIONE : Spedisce un byte sul Registro Dati della Porta Parallela | ;| LPT1, in risposta al COMANDO "#Oxy", OUT Dato a 8bit su LPT1| ;| /----------\ -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | bisogna prima installare il Driver Configura_LPT1; scaricalo | ;| | | a: http://www.giobe2000.it/consigli/Scarica_VediLPT_XP.htm | ;| *----------* -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | la SHELL DOS deve essere a "Pieno Schermo" (l'esecuzione in | ;| | | "finestra DOS" non produce effetto sulla Stampante) | ;| *----------* -------------------------------------------------------------| ;| | | In ogni caso PRIMA DI OGNI SESSIONE DOS necessario eseguire| ;| | NB !! | il programma Config_LPT1.EXE in ambiente Windows per attivare| ;| | | la visibilit dei driver installati con Configura_LPT1 !!!!! | ;| \----------/ -------------------------------------------------------------| ;\---------------------------------------------------------------------------/ OutLPT: PUSH SI ;\Locazioni Deposito per i 2 caratteri ascii LEA SI,DepoPar ;|digitati in fase di acquisizione dei 2 nibble ;/del byte da erogare verso la porta parallela ;\ COMANDO "#Oxy" OUT Dato a 8 bit su LPT1 ;| stringa ascii di 2 caratteri ;|Converte la coppia di caratteri ASCII corri- ;|spondenti a simboli del sistema di numerazione ;|esadecimale (da "0" a "9" e da "A" a "F"); CALL Asc2Byt_ ;|tale coppia puntata in ingresso da CS:SI ed ;| trasformata nel numero esadecimale xyH a 8 ;|bit che le corrisponde, lasciato in uscita in ;|AL; il puntatore SI viene incrementato di due ;/posizioni. MOV DX,0378H ;\Mette il dato ricevuto via seriale sulla porta OUT DX,AL ;/Dati della Porta Parallela LPT1 POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : CornCom | ;| DESCRIZIONE : Organizza la stampa completamente automatica di una cornice,| ;| in risposta al COMANDO "#Raallrrcctopps", Stampa cornice | ;\---------------------------------------------------------------------------/ ;\ COMANDO #Raallrrcctopps Stampa una cornice ;| colore sfondo ;| colore primo piano CornCom:PUSH SI ;| ombra MOV AX,0B800H ;| tipo di tratto MOV ES,AX ;| colonna angolo alto ;| riga angolo alto ;| larghezza ;/ altezza ;\Locazioni Deposito per i 13 caratteri ascii LEA DI,DepoPar ;|digitati in fase di acquisizione per definire ;/i parametri desiderati per la cornice ;----------------------------------------------- MOV CH,CS:[DI] ;\[ ***** altezza compresa cornice ********* ] INC DI ;| SUB CH,'0' ;| MOV AL,10 ;|Recupera dalle prime 2 locazioni di deposito MUL CH ;|i caratteri ascii numerici che esprimono MOV CH,CS:[DI] ;|l'altezza aa, tra "03" e "25", e calcola il INC DI ;|valore esadecimale corrispondente, lasciato SUB CH,'0' ;|alla fine nel registro CH ADD CH,AL ;/ ;----------------------------------------------- MOV CL,CS:[DI] ;\[ ***** larghezza compresa cornice ******* ] INC DI ;| SUB CL,'0' ;| MOV AL,10 ;|Recupera dalle seguenti 2 locazioni deposito MUL CL ;|i caratteri ascii numerici che esprimono MOV CL,CS:[DI] ;|la larghezza ll, tra "03" e "80", e calcola il INC DI ;|valore esadecimale corrispondente, lasciato SUB CL,'0' ;|alla fine nel registro CL ADD CL,AL ;/ ;----------------------------------------------- MOV DH,CS:[DI] ;\[ ***** riga angolo alto a sinistra ******* ] INC DI ;| SUB DH,'0' ;| MOV AL,10 ;|Recupera dalle seguenti 2 locazioni deposito MUL DH ;|i caratteri ascii numerici che esprimono MOV DH,CS:[DI] ;|la riga rr, tra "00" e "24", e calcola il INC DI ;|valore esadecimale corrispondente, lasciato SUB DH,'0' ;|alla fine nel registro DH ADD DH,AL ;/ ;----------------------------------------------- MOV DL,CS:[DI] ;\[ ***** colonna angolo alto a sinistra ***** ] INC DI ;| SUB DL,'0' ;| MOV AL,10 ;|Recupera dalle seguenti 2 locazioni deposito MUL DL ;|i caratteri ascii numerici che esprimono MOV DL,CS:[DI] ;|la colonna ll, tra "00" e "79", e calcola il INC DI ;|valore esadecimale corrispondente, lasciato SUB DL,'0' ;|alla fine nel registro DL ADD DL,AL ;/ ;----------------------------------------------- ;\[ ** tipo di tratto, 0=semplice, 1=doppio ** ] ;|Recupera dalla seguente locazione di deposito MOV AH,CS:[DI] ;|il carattere ascii numerico che esprime INC DI ;|il tipo di tratto t, o "0" o "1", e calcola il SUB AH,'0' ;|valore esadecimale corrispondente, lasciato ;/alla fine nel registro AH ;----------------------------------------------- ;\[ **** tipo di ombra, 0=senza, 1=con ******* ] ;|Recupera dalla seguente locazione di deposito MOV AL,CS:[DI] ;|il carattere ascii numerico che esprime INC DI ;|il tipo di ombra o, o "0" o "1", e calcola il SUB AL,'0' ;|valore esadecimale corrispondente, lasciato ;/alla fine nel registro AL ;----------------------------------------------- PUSH AX ; Salva tipo di tratto (AH) e tipo di ombra (AL) ;----------------------------------------------- MOV BH,CS:[DI] ;\[ **** Colore di primo piano e di sfondo *** ] INC DI ;| SUB BH,'0' ;|Recupera dalle seguenti 2 locazioni deposito MOV AL,10 ;|i caratteri ascii numerici che esprimono il MUL BH ;|colore di Primo Piano, tra "00" e "15" MOV BH,CS:[DI] ;|e calcola il valore esadecimale corrispondente INC DI ;|lasciato alla fine nel registro BH SUB BH,'0' ;| ADD BH,AL ;/ ;\Recupera dall'ultima locazione di deposito MOV AH,CS:[DI] ;|il carattere ascii numerico che esprime il SUB AH,'0' ;|colore di Sfondo, tra "0" e "7" e calcola il ;|valore esadecimale corrispondente lasciato ;/alla fine nel registro AH SHL AH,1 ;\ SHL AH,1 ;|Ricostruisce in AH il codice esadecimale del SHL AH,1 ;|Colore desiderato SHL AH,1 ;| OR AH,BH ;/ ;----------------------------------------------- M_COLOR AH ;\[ colore: colore della cornice e sfondo ] POP BX ;|Recupera tipo di tratto (AH) e tipo ombra (AL) ;in BL ;|[ tipo 0=tratto semplice; 1=tratto doppio] ;in BH ;|[ ombra 0=senza; 1=con ombreggiatura ] ;in DH ;|[ riga angolo in alto a sinistra ] ;in DL ;|[ colonna angolo in alto a sinistra ] MOV AH,CH ;|[ altezza compresa cornice ] MOV AL,CL ;|[ larghezza compresa cornice ] MOV CX,6000H ;|[ salva RAM in cui salvare l'area coperta ] CALL RamCorn ;/ ;----------------------------------------------- POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : RecpCom | ;| DESCRIZIONE : Organizza il recupero dell'area coperta da una cornice, | ;| in risposta al COMANDO "#Uaallrrcc", Recupera cornice | ;\---------------------------------------------------------------------------/ ;\ COMANDO #Uaallrrcc Recupera una cornice RecpCom:PUSH SI ;| colonna angolo alto MOV AX,0B800H ;| riga angolo alto MOV ES,AX ;| larghezza ;/ altezza ;\Locazioni Deposito per gli 8 caratteri ascii LEA DI,DepoPar ;|digitati in fase di acquisizione per definire ;/i parametri desiderati per la cornice ;----------------------------------------------- MOV CH,CS:[DI] ;\[ ***** altezza compresa cornice ********* ] INC DI ;| SUB CH,'0' ;| MOV AL,10 ;|Recupera dalle prime 2 locazioni di deposito MUL CH ;|i caratteri ascii numerici che esprimono MOV CH,CS:[DI] ;|l'altezza aa, tra "03" e "25", e calcola il INC DI ;|valore esadecimale corrispondente, lasciato SUB CH,'0' ;|alla fine nel registro CH ADD CH,AL ;/ ;----------------------------------------------- MOV CL,CS:[DI] ;\[ ***** larghezza compresa cornice ******* ] INC DI ;| SUB CL,'0' ;| MOV AL,10 ;|Recupera dalle seguenti 2 locazioni deposito MUL CL ;|i caratteri ascii numerici che esprimono MOV CL,CS:[DI] ;|la larghezza ll, tra "03" e "80", e calcola il INC DI ;|valore esadecimale corrispondente, lasciato SUB CL,'0' ;|alla fine nel registro CL ADD CL,AL ;/ ;----------------------------------------------- MOV DH,CS:[DI] ;\[ ***** riga angolo alto a sinistra ******* ] INC DI ;| SUB DH,'0' ;| MOV AL,10 ;|Recupera dalle seguenti 2 locazioni deposito MUL DH ;|i caratteri ascii numerici che esprimono MOV DH,CS:[DI] ;|la riga rr, tra "00" e "24", e calcola il INC DI ;|valore esadecimale corrispondente, lasciato SUB DH,'0' ;|alla fine nel registro DH ADD DH,AL ;/ ;----------------------------------------------- MOV DL,CS:[DI] ;\[ ***** colonna angolo alto a sinistra ***** ] INC DI ;| SUB DL,'0' ;| MOV AL,10 ;|Recupera dalle seguenti 2 locazioni deposito MUL DL ;|i caratteri ascii numerici che esprimono MOV DL,CS:[DI] ;|la colonna ll, tra "00" e "79", e calcola il INC DI ;|valore esadecimale corrispondente, lasciato SUB DL,'0' ;|alla fine nel registro DL ADD DL,AL ;/ ;----------------------------------------------- ;in DH ;\[ riga angolo in alto a sinistra ] ;in DL ;|[ colonna angolo in alto a sinistra ] MOV AH,CH ;|[ altezza compresa cornice ] MOV AL,CL ;|[ larghezza compresa cornice ] MOV CX,6000H ;|[ salva RAM in cui salvare l'area coperta ] CALL RamRecup ;/ ;----------------------------------------------- POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : DelayTx | ;| DESCRIZIONE : Consuma un ritardo proporzionale al valore nn passato come| ;| Parametro; il ritardo prodotto completamente svincolato| ;| dalla velocit del processore perch utilizza informazioni| ;| prodotte dal Timer di Sistema. | ;| I tempi del ritardo sono multipli del tempo minimo 54,925493| ;| millisecondi ed assicurata la sua portabilit con ogni | ;| sistema operativo (Windows 2000/NT/XP). | ;| Su questa base possibile compilare la seguente Tabella: | ;| /-----*--------\/----*--------\ /----*--------\ | ;| | nn | ritardo|| nn | ritardo| | nn | ritardo| | ;| *-----*--------**----*--------* *----*--------* | ;| | 1 | 55 ms || 10 | 549 ms | | 27 | 1,5 s | | ;| | 2 | 110 ms || 11 | 604 ms | | 36 | 2 s | | ;| | 3 | 164 ms || 12 | 659 ms | | 45 | 2,5 s | | ;| | 4 | 219 ms || 13 | 714 ms | | 54 | 3 s | | ;| | 5 | 274 ms || 14 | 769 ms | | 63 | 3,5 s | | ;| | 6 | 329 ms || 15 | 824 ms | | 73 | 4 s | | ;| | 7 | 384 ms || 16 | 879 ms | | 82 | 4,5 s | | ;| | 8 | 439 ms || 17 | 934 ms | | 91 | 5 s | | ;| | 9 | 494 ms || 18 | 1 s | | 99 | 5,44s | | ;| \-----*--------/\----*--------/ \----*--------/ | ;| In risposta al COMANDO "#Jnn", Ritardo Programmabile | ;\---------------------------------------------------------------------------/ DelayTx:PUSH SI ;\Locazioni Deposito per i 2 caratteri ascii LEA SI,DepoPar ;|digitati in fase di acquisizione della costan- ;/te di tempo nn=0199 del Ritardo programmabile ADD SI,2 ;\La procedura "Dec2Byt" analizza una stringa MOV AL,00H ;|puntata da CS:SI, contenente rigorosamente al MOV CS:[SI],AL ;|massimo 2 caratteri SOLO Ascii NUMERICI e SUB SI,2 ;/terminata con 00H: prepara il terminatore ;\ COMANDO #Jnn" Ritardo programmabile ;| numero n=0199 CALL Dec2Byt ;|Converte la coppia di caratteri ASCII numerici ;|(da "01" a "99"), puntata in ingresso da CS:SI ;|nel numero binario a 8 bit xyH corrispondente ;/lasciato in uscita in AL ;---------------------------------------------------------------------- MOV CL,AL ;\ MOV CH,00H ;|Consuma un ritardo pari a 55ms*CX CALL Delay ;/ POP SI RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : CmdGEN | ;| DESCRIZIONE : Organizza la trasmissione di 100 diverse STRINGHE di COMANDI| ;| la grande parte ancora disponibili; per mostrare la sua| ;| utilit sonoi disponibili alcuni esempi: | ;| Sequenza Comandi n00 - Lettura Tasti Remoti | ;| Sequenza Comandi n01 - Scrittura byte e OUT su LPT1 | ;| Sequenza Comandi n02 - Conto alla rovescia - Gestione tempo| ;| Appendice al COMANDO "#Tnn" Sequenza di COMANDI | ;\---------------------------------------------------------------------------/ CmdGEN: PUSH SI ;\Locazioni Deposito per i 2 caratteri ascii LEA SI,DepoPar ;|digitati in fase di acquisizione del numero ;/d'ordine nn=0099 della Sequenza di COMANDI ADD SI,2 ;\La procedura "Dec2Byt" analizza una stringa MOV AL,00H ;|puntata da CS:SI, contenente rigorosamente al MOV CS:[SI],AL ;|massimo 2 caratteri SOLO Ascii NUMERICI e SUB SI,2 ;/terminata con 00H: prepara il terminatore ;\ COMANDO "#Tnn" Sequenza di COMANDI ;| Codice Sequenza nn=0099 CALL Dec2Byt ;|Converte la coppia di caratteri ASCII numerici ;|(da "00" a "99"), puntata in ingresso da CS:SI ;|nel numero binario a 8 bit xyH corrispondente POP SI ;/lasciato in uscita in AL ;---------------------------------------------------------------------- CMP AL,00H ;\Controlla numero d'ordine della Sequenza di JNE CmdG01 ;/Comandi da servire ;/--------------------------------------------------------------------\ ;|Sequenza Comandi n00 - Lettura Tasti Remoti-Stampa Desktop classico| ;*--------------------------------------------------------------------* ;| Il test mostra la possibilit di interagire con il Computer Remoto | ;| al quale possono essere richiesti (e ricevuti) dati assunti da | ;| sensori o da altri dispositivi d'ingresso; in questo esempio il | ;| Computer Remoto obbligato a rimanere in attesa della pressione | ;| di un tasto sulla sua tastiera. | ;| ------------------------------------------------------------------ | ;| Per ora non prevista la possibilit di restituire | ;| NB: al Telefono Cellulare alcuna informazione di ritorno | ;| nel caso specifico il codice ascii del tasto premuto | ;| ------------------------------------------------------------------ | ;| Sono previste 3 pressioni del tasto remoto, intrammezzate da 4 | ;| sequenze di Comandi: | ;| 1) con la prima predispone sul Monitor Remoto un Desktop classico, | ;| con Titolo ("Collaudo Trasmissione Stringa di Comandi") e | ;| messaggio sulla linea del Menu: | ;| ------------------------------------------------------------------ | ;| "#B" ; DeskTop Classico | ;| "#C" ; Fa sparire il cursore | ;| "#L007" ; testo nero, sfondo bianco | ;| "#K0022" ; riga 0, colonna 22 | ;| "#SCollaudo Trasmissione Stringa di Comandi%" | ;| "#K2419" ; riga 24, colonna 19 | ;| "#S Premi un tasto qualunque per cominciare %" | ;| ------------------------------------------------------------------ | ;| 2) con la seconda inserisce una cornice con ombra contenente un | ;| messaggio di benvenuto: | ;| ------------------------------------------------------------------ | ;| "#R0760091011141" ; Cornice programmabile altezza 7,larghezza| ;| ; 60, riga 9, colonna 10, tratto doppio,| ;| ; ombra si, testo giallo, sfondo blu | ;| "#L151" ; testo bianco brillante, sfondo blu | ;| "#K1225" ; riga 12, colonna 25 | ;| "#S Benvenuto su www.Giobe2000.it %" | ;| "#L007" ; testo nero, sfondo bianco | ;| "#K2419" ; riga 24, colonna 19 | ;| "#SPremi un tasto qualunque per pulire lo schermo%" | ;| ------------------------------------------------------------------ | ;| 3) non appena viene premuto un tasto recupera l'area coperta dalla | ;| cornice, presenta un messaggio di commiato: | ;| ------------------------------------------------------------------ | ;| "#U07600910" ; Recupera la cornice, altezza 7, larghezza| ;| ; 60 riga 9, colonna 10 | ;| "#L007" ; testo nero, sfondo bianco | ;| "#K2419" ; riga 24, colonna 19 | ;| "#S Premi un tasto qualunque per terminare... %" | ;| ------------------------------------------------------------------ | ;| 4) alla pressione del nuovo tasto pone termine al controllo remoto | ;| ------------------------------------------------------------------ | ;| "#A" ; Fai ClearScreen sul Monitor remoto | ;| "#D" ; Fa riapparire il cursore | ;\--------------------------------------------------------------------/ LEA SI,TxMsg01 ;\Punta la prima Sequenza di stringhe di COMANDI JMP ExeC04 ;|relativa la programma predisposto da "#T00" ;/e la mette subito in esecuzione ;---------------------------------------------------------------------- CmdG01: CMP AL,01H ;\Controlla numero d'ordine della Sequenza di JNE CmdG02 ;/Comandi da servire ;/--------------------------------------------------------------------\ ;|Sequenza Comandi n01 - Scrittura byte e OUT su LPT1 | ;*--------------------------------------------------------------------* ;| Il test mostra nuove forme di interazione con il Computer Remoto | ;| mostrando la tecnica per intervenire sulla sua Porta Parallela LPT | ;| direttamente con comandi seriali. Sono previste 2 fasi; durante la | ;| prima sul Monitor Remoto predisposto un Desktop con Cornice di | ;| tipo 3, Intestazione standard n0 ("Collaudo della Porta Seriale | ;| COM1-Protocollo:9600,N,2,8"),Menu n0 ("Copyright www.giobe2000.it | ;| - ing. Giorgio OBER"), proposta di messaggi adatti ad organizzare | ;| la messa a video in una piccola cornice del il byte da spedire | ;| alla LPT1 durante la seconda fase. | ;| ------------------------------------------------------------------ | ;| Per ora non prevista la possibilit di restituire | ;| NB: al Telefono Cellulare alcuna informazione di ritorno | ;| nel caso specifico il codice ascii del tasto premuto | ;| ------------------------------------------------------------------ | ;| "#G" ; Cornice di terzo tipo | ;| "#M0" ; Intestazione personalizzata n0 | ;| "#N0" ; Menu personalizzato n0 | ;| "#C" ; Fa sparire il cursore | ;| "#L150" ; testo bianco brillante, sfondo nero | ;| "#K1023" ; riga 10, colonna 23 | ;| "#SUscita Dato a 8 bit su porta parallela%" | ;| "#R0308123800140" ; Cornice programmabile altezza 3,larghezza| ;| ; 8, riga 12, colonna 38, tratto semplice,| ;| ; ombra no, testo giallo, sfondo nero | ;| "#L150" ; testo bianco brillante, sfondo nero | ;| "#K1617" ; riga 16, colonna 17 | ;| "#SGuarda sul connettore della Porta Parallela LPT1%" | ;| ------------------------------------------------------------------ | ;| Subitoi dopo eroga in sequenza numerose sequenze simili a questa: | ;| ------------------------------------------------------------------ | ;| "#J09" ;\Ritardo di mezzo secondo, fissa colore e | ;| "#L140#K1341" ;|coordinate di stampa, visualizza la stringa | ;| "#P",00000100B ;|del Byte xyH e poi eroga su LPT1 | ;| "#O04" ;/ | ;| ------------------------------------------------------------------ | ;| con il compito di visualizzare la stringa del Byte corrente, xyH | ;| al centro della piccola cornice (riga 13, colonna 41), in colore | ;| giallo su nero (14/0), e di erogare la coppia di caratteri ascii | ;| corrispondenti su LPT1. La sequenza di bytes coinvolti tale da | ;| produrre degli effetti di accensione sulla batteria di led posta | ;| sulla porta paralella: 81H, 42H, 24H, 18H, 24H, 42H, 81H, 00H, 80H | ;| 40H, 20H, 10H, 08H, 04H, 02H, 01H, 02H, 08H, 10H, 20H, 40H, 80H. | ;| ------------------------------------------------------------------ | ;| In chiusura viene fornito il messaggio di commiato: | ;| "#L154" ; testo bianco brillante, sfondo rosso | ;| "#K1926" ; riga 19, colonna 26 | ;| "#S Premi un tasto per terminare %" | ;| "#H" ; Aspetta Pressione Tasto | ;| "#I" ; Fine sequenza di COMANDI | ;| 00H | ;\--------------------------------------------------------------------/ LEA SI,TxMsg11 ;\Punta la prima Sequenza di stringhe di COMANDI JMP ExeC04 ;|relativa la programma predisposto da "#T00" ;/e la mette subito in esecuzione ;-------------------------------------------------------------------- CmdG02: CMP AL,02H ;\Controlla numero d'ordine della Sequenza di JNE CmdG03 ;/Comandi da servire ;/--------------------------------------------------------------------\ ;|Sequenza Comandi n02 - Conto alla rovescia - Gestione tempo remoto | ;*--------------------------------------------------------------------* ;| Il test mostra la possibilit di interagire con il Computer Remoto | ;| per proporre su di esso alcuni eventi temporizzati, con il supporto| ;| di 2 diverse serie di sequenze di Comandi; con la prima predispone | ;| sul Monitor Remoto un Desktop Classico con Intestazione dedicata | ;| ("Gestione CountDown Remoto") ed inserisce una piccola cornice con | ;| ombra al centro del Monitor Remoto: | ;| ------------------------------------------------------------------ | ;| "#B" ; DeskTop Classico | ;| "#C" ; Fa sparire il cursore | ;| "#L007" ; testo nero, sfondo bianco | ;| "#K0027" ; riga 0, colonna 27 | ;| "#SGestione CountDown Remoto%" | ;| "#R0310123611141" ; Cornice programmabile altezza 3,larghezza| ;| ; 10,riga 12, colonna 36, tratto doppio,| ;| ; ombra si, testo giallo, sfondo blu | ;| ------------------------------------------------------------------ | ;| Dopo l'emissione della prima stringa di COMANDI il computer remoto | ;| attiva una sequenza di 10 stringhe di comandi in grado di proporre | ;| la stringa del Byte da 09H a 00H al centro della cornice precedente| ;| con cadenza di 1 secondo: | ;| ------------------------------------------------------------------ | ;| "#J18" ;\Ritardo di 1 secondo, fissa colore e | ;| "#L151#K1340" ;|coordinate di stampa e poi visualizza la | ;| "#P",09H ;/stringa del Byte xyH | ;| ------------------------------------------------------------------ | ;| Al termine del conteggio alla rovescia trasmette la seconda serie | ;| di stringhe di Comandi con la quale predispone sul Monitor Remoto | ;| una sequenza di messaggi ed eventi temporizzati: con cadenza di 2 | ;| secondi recupera lo spazio occupato dalla cornice e produce la | ;| pulizia completa del Monitor. | ;| ------------------------------------------------------------------ | ;| "#L007" ; testo nero, sfondo bianco | ;| "#K2420" ; riga 24, colonna 20 | ;| "#S CountDown Terminato %" | ;| "#J36" ; Consuma un ritardo pari a 36*55ms= 2 sec | ;| "#U03101236" ; Recupera la cornice altezza 3,larghezza| ;| ; 10,riga 12, colonna 36 | ;| "#L047" ; testo rosso, sfondo bianco | ;| "#K2420" ; riga 24, colonna 20 | ;| "#SIl controllo terminer tra 2 secondi%" | ;| "#J36" ; Consuma un ritardo pari a 36*55ms= 2 sec | ;| "#A" ; Fai ClearScreen sul Monitor remoto | ;| "#D" ; Fa riapparire il cursore | ;| "#I" ; Fine sequenza di COMANDI | ;| 00H | ;| ------------------------------------------------------------------ | ;| Per ora non prevista la possibilit di restituire | ;| NB: al Telefono Cellulare alcuna informazione di ritorno | ;| nel caso specifico il codice ascii del tasto premuto | ;\--------------------------------------------------------------------/ LEA SI,TxMsg21 ;\Punta la prima Sequenza di stringhe di COMANDI JMP ExeC04 ;|relativa la programma predisposto da "#T00" ;/e la mette subito in esecuzione ;----------------------------------------------- ; PER ORA NON SONO DISPONIBILI ALTRI SERVIZI ;----------------------------------------------- CmdG03: ;\La sequenza dei COMANDI richiesta non JMP ExeC04 ;|disponibile; torna per interpretare eventuali ;/altri COMANDI ;/---------------------------------------------------------------------------\ ;| PROCEDURA : ErrCOM e ErrPAR | ;| DESCRIZIONE : Mostra il messaggio che segnala COMANDO o PARAMETRO ignoto. | ;\---------------------------------------------------------------------------/ ErrCOM: LEA SI,Testo09 ; "COMANDO " JMP SHORT Err01 ;------------------------------------------------------------ ErrPAR: LEA SI,Testo10 ; "PARAMETRO " Err01: PUSH SI ;\ PUSH DS ;| MOV CX,160 ;| Salva il contenuto della riga 24 RAM_cur 24,0 ;| PUSH ES ;| POP DS ;| ES:[DI] << DS:[SI] MOV SI,DI ;| DI = DI +2 ADD DI,1000H ;| SI = SI +2 CLD ;| REP MOVSW ;/ M_COLOR 4FH ;\ MOV DH,24 ;| CALL BARRA ;| M_CURSOR 24,25 ;|Messaggio d'Errore POP DS ;| M_msgC Testo12,24,3,4FH;| "Il programma ha rilevato un " POP SI ;| "COMANDO " o "PARAMETRO " CALL BIOSmsg ;| "non riconosciuto" M_msgN Testo11 ;/ CALL Del_2000 ; PUSH DS ;\ MOV CX,160 ;| RAM_cur 24,0 ;| Recupera il contenuto della riga 24 PUSH ES ;| POP DS ;| MOV SI,DI ;| ES:[DI] << DS:[SI] ADD SI,1000H ;| DI = DI +2 CLD ;| SI = SI +2 REP MOVSW ;| POP DS ;/ RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : ExeCmd ** ADATTAMENTO di "Rx_Cmd" per TELEFONO CELLULARE **| ;| DESCRIZIONE : Procedura con il compito di rilevare la presenza di eventua-| ;| li stringhe del Protocollo Software originale dentro il SMS| ;| ricevuto dal Telefono Cellulare; se cos interpreta subito| ;| i COMANDI previsti dal protocollo condiviso. | ;| Le eventuali stringhe di COMANDI sono estratte e trasferite | ;| NB: "in chiaro" in una zona di memoria ad esse dedicata, SMStxt,| ;| e terminate con il carattere 00H. | ;\---------------------------------------------------------------------------/ ; /-------------------------------------------------------------------\ ; 01 | Cerca eventuali stringhe di Protocollo Seriale dentro il SMS | ; \-------------------------------------------------------------------/ ExeCmd: ;\Punta l'area deposito dei caratteri ascii ;|alfabetici "in chiaro" ottenuti decodificando LEA SI,SMStxt ;|i bytes dell'area di memoria "SMSbyt", conte- ;|nente le informazioni, codificate a 7 bit, con ;/l'effettivo testo del messaggio ExeC00: MOV AL,CS:[SI] ;\ INC SI ;| CMP AL,00H ;|Cerca il carattere "Prefisso di Comando" JZ ExeC01 ;|nel testo "in chiaro" appena decodificato CMP AL,'#' ;| JZ ExeC02 ;| JMP ExeC00 ;/ ;\Nessun "prefisso di Comando" del Protocollo ;* ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva ExeC01: M_corn 3 , 69 , 3 , 5 , 4CH , 01 , 01 ,1000H M_msgC Testo08,4,10,4FH;*- " Il Messaggio Ricevuto non contiene ;| COMANDI del Protocollo " M_msgC MENU09,24,7 ,70H;|" Premi un tasto per continuare..." CALL KEYwait ;| RET ;/ ; /-------------------------------------------------------------------\ ; 02 | Fasi Preliminari prima di interpretare le stringhe del Protocollo | ; \-------------------------------------------------------------------/ ExeC02: ;\Il valore del puntatore SI quello del primo PUSH SI ;|carattere "#", prefisso di Comando del ;/Protocollo e va conservato con attenzione ;\Trovato "prefisso di Comando" del Protocollo CALL BIOScls ;|In ogni caso pulisce lo schermo, in attesa di ;/ interpretare i COMAMDI ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 3 , 69 , 3 , 5 , 2AH , 01 , 01 ,1000H M_msgC Testo07,4,10,2FH;"Il Computer Remoto sta per eseguire ; i COMANDI del Protocollo" LEA DI,CHAR_00 ;\Punta il primo dei bytes associato al caratte- ADD DI, 3*8 ;|re ASCII NUMERICO "3" (33H) appartenente alla ;/Tabella del SET CGA, 8*8 M_COLOR 0EH ;\ MOV CX,4 ;| ExeC03: CALL MaxiChr ;|Mostra un conteggio alla rovescia da 3 a 0, SUB DI,16 ;|con Numeri Giganti CALL Del_1000 ;| LOOP ExeC03 ;/ ; /-------------------------------------------------------------------\ ; | Punto d'ingresso - Esecuzione delle azioni previste dal Protocollo| ; | Da questo momento questo computer configurato per interpretare i| ; | comandi previsti dal protocollo condiviso con il Telefono Cellula-| ; | re ed obbligato ad interpretare i bytes come azioni da eseguire.| ; | Su richiesta del testo assunto dal SMS (via Telefono Cellulare)| ; | pu eventualmente restituire messaggi o dati ma non sar possibile| ; | intervenire sul controllo di se stesso. | ; | L'elenco dei COMANDI attualmente disponibili (tutti con carattere| ; | "#" per prefisso) proposto qui di seguito: | ; | #A ClearScreen Clasico | ; | #B DeskTop Classico | ; | #C Fa sparire il cursore | ; | #D Fa tornare il cursore | ; 03 | #E Cornice di primo tipo | ; | #F Cornice di secondo tipo | ; | #G Cornice di terzo tipo | ; | #H Aspetta Pressione Tasto | ; | #I Fine Sequenza #Tnn di stringhe di COMANDI | ; | #Jnn Consuma un ritardo pari a n volte 55ms ; | numero n=0199 ; | colonna cc=0079 ; | #Krrcc Coordinate di stampa ; | riga rr=0024 ; | sfondo s=07 ; | #Lpps Attributo di colore, testo sfondo ; | primo piano pp=0015 ; | #Mn Intestazione personalizzata ; | numero n=09 ; | #Nn Menu personalizzato ; | numero n=09 ; | #Oxy Uscita di Dato a 8 bit su porta parallela ; | #Pxy Visualizza la stringa del Byte xyH ; | #Qxywz Visualizza la stringa della Word xywzH ; | larghezza compresa cornice ll=0380 ; | colonna angolo alto a sinistra cc=0079 ; | ombra 0=senza, 1=con ; | colore sfondo s=07 ; | #Raallrrcctopps Stampa una cornice programmabile a video ; | colore primo piano pp=0015 ; | tipo 0=tratto semplice, 1=tratto doppio ; | riga angolo alto a sinistra rr=0024 ; | altezza compresa cornice aa=0325 ; | #Saa..a% Sequenza di caratteri ascii ; | NB: % carattere terminatore di stringa ; | caratteri ascii da porre a video ; | #Tnn Sequenza di COMANDI Precostituiti ; | numero nn=0099 ; | larghezza compresa cornice ll=0380 ; | colonna angolo alto a sinistra cc=0079 ; | #Uaallrrcc Recupera area coperta da cornice ; | riga angolo alto a sinistra rr=0024 ; | altezza compresa cornice aa=0325 ; \-------------------------------------------------------------------/ ;\Recupera il valore del puntatore SI del primo POP SI ;|carattere "#", prefisso di Comando del ;/Protocollo ;---------------------------------------------------------------------- ExeC04: MOV AL,CS:[SI] ;\/--------------------------------------------\ INC SI ;||* RIENTRO DOPO L'ESECUZIONE DI UN COMANDO *| CMP AL,00H ;|\--------------------------------------------/ JNZ ExeC05 ;|Se il byte successivo della stringa in chiaro JMP ExeC61 ;| il teminatore 00H tutti i comandi previsti ExeC05: CMP AL,'#' ;|sono stati eseguiti; altrimenti deve trattarsi JZ ExeC04 ;/di nuovo di un prefisso "#",che viene scartato ;---------------------------------------------------------------------- AND AL,11011111B ;\Controlla se il carattere corrente corrisponde CMP AL,'U' ;|ad un COMANDO ammesso (A, B, C,...) JG ExeC06 ;|/--------------------------------------------\ CMP AL,'A' ;|| FINORA ammessi: A B C D E F G H I J K L | JGE ExeC07 ;|| M N O P Q R S T U . . . | ;/\--------------------------------------------/ ExeC06: CALL ErrCOM ;\Mostra un messaggio di Errore: "COMANDO NON JMP ExeC61 ;/RICONOSCIUTO" e rientra nella fase interattiva ; /-------------------------------------------------------------------\ ; 04 | Gestione dei COMANDI senza Parametri | ; \-------------------------------------------------------------------/ ;\ COMANDO "#A ClearScreen Clasico ;| COMANDO "#B DeskTop Classico ExeC07: CMP AL,'I' ;| COMANDO "#C Fa sparire il cursore JBE ExeC08 ;| COMANDO "#D Fa tornare il cursore JMP ExeC17 ;| COMANDO "#D Fa tornare il cursore ;| COMANDO "#E Cornice di primo tipo ;| COMANDO "#F Cornice di secondo tipo ;| COMANDO "#G Cornice di terzo tipo ;| COMANDO "#H Aspetta Pressione Tasto ;/ COMANDO "#I Fine sequenza COMANDI #Tnn ;---------------------------------------------------------------------- ExeC08: CMP AL,'A' ;\Servizio per il COMANDO "#A" JNE ExeC09 ;/ClearScreen Classico CALL BIOScls ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ;---------------------------------------------------------------------- ExeC09: CMP AL,'B' ;\Servizio per il COMANDO "#B" JNE ExeC10 ;/DeskTop Classico CALL DeskCom ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ;---------------------------------------------------------------------- ExeC10: CMP AL,'C' ;\Servizio per il COMANDO "#C" JNE ExeC11 ;/Fa sparire il cursore CALL Via_Cur ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ;---------------------------------------------------------------------- ExeC11: CMP AL,'D' ;\Servizio per il COMANDO "#D" JNE ExeC12 ;/Fa tornare il cursore CALL Rip_Cur ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ;---------------------------------------------------------------------- ExeC12: CMP AL,'E' ;\Servizio per il COMANDO "#E" JNE ExeC13 ;/Cornice del primo tipo CALL Cornice1 ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ;---------------------------------------------------------------------- ExeC13: CMP AL,'F' ;\Servizio per il COMANDO "#F" JNE ExeC14 ;/Cornice del secondo tipo CALL Cornice2 ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ;---------------------------------------------------------------------- ExeC14: CMP AL,'G' ;\Servizio per il COMANDO "#G" JNE ExeC15 ;/Cornice del terzo tipo CALL Cornice3 ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ;---------------------------------------------------------------------- ExeC15: CMP AL,'H' ;\Servizio per il COMANDO "#H" JNE ExeC16 ;/Aspetta Pressione Tasto CALL KEYwait ;\Esegue il servizio richiesto e, al termine, ;|torna per interpretare eventuali altri COMANDI ;|NB: per ora non prevista la possibilit di ;|restituire al Telefono Cellulare alcuna ;|informazione di ritorno (nel caso specifico il JMP ExeC04 ;/codice ascii del tasto premuto) ;---------------------------------------------------------------------- ExeC16: CMP AL,'I' ;\Servizio per il COMANDO "#I" JNE ExeC17 ;/ Fine sequenza COMANDI "#Tnn" JMP ExeC04 ; Torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 05 | Gestione del COMANDO Colore con 2 Parametri di tipo Ascii Numerico| ; \-------------------------------------------------------------------/ ExeC17: CMP AL,'J' ;\ COMANDO #Jnn" Ritardo programmabile JNE ExeC21 ;| numero nn=0199 ;/ Consuma un ritardo pari a 55ms*nn ;---------------------------------------------------------------------- ;\Locazioni Deposito per i 2 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/relativi alla Costante di ritardo del COMANDO MOV CX,2 ExeC18: MOV AL,CS:[SI] ;\ INC SI ;|Il COMANDO "J" prevede 1 PARAMETRO NUMERICO, CMP AL,'9' ;|corrispondente alla Costante di Tempo, JG ExeC19 ;|espresso da una coppia di caratteri tra "01" CMP AL,'0' ;|e "99" JGE ExeC20 ;/ ExeC19: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP ExeC61 ;/RICONOSCIUTO" e rientra nella fase interattiva ExeC20: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 4 caratte- INC DI ;|ri ascii numerici, a disposizione del codice LOOP ExeC18 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO #Jnn" ;/Ritardo programmabile, numero nn=0199 CALL DelayTx ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 06 | Gestione del COMANDO GoToXY con 4 Parametri di tipo Ascii Numerico| ; \-------------------------------------------------------------------/ ExeC21: CMP AL,'K' ;\ COMANDO "#Krrcc" Coordinate di stampa JNE ExeC25 ;| colonna cc=0079 ;/ riga rr=0024 ;---------------------------------------------------------------------- ;\Locazioni Deposito per i 4 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/delle coordinate del COMANDO MOV CX,4 ExeC22: MOV AL,CS:[SI] ;\Il COMANDO "K" prevede 2 PARAMETRI NUMERICI INC SI ;|corrispondenti alla Riga e alla Colonna desi- CMP AL,'9' ;|derate, espressi da 2 coppie di caratteri, la JG ExeC23 ;|prima da "00" a "24" e la seconda da "00" a CMP AL,'0' ;|"79" JGE ExeC24 ;/ ExeC23: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP ExeC61 ;/RICONOSCIUTO" e rientra nella fase interattiva ;---------------------------------------------------------------------- ExeC24: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 4 caratte- INC DI ;|ri ascii numerici, a disposizione del codice LOOP ExeC22 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Krrcc" ;/Coordinate di stampa, rr=0024, cc=0079 CALL GoToXY ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 07 | Gestione del COMANDO Colore con 3 Parametri di tipo Ascii Numerico| ; \-------------------------------------------------------------------/ ExeC25: CMP AL,'L' ;\ COMANDO "#Lpps" Colore testo sfondo JNE ExeC29 ;| sfondo s=07 ;/ primo piano pp=0015 ;---------------------------------------------------------------------- ;\Locazioni Deposito per i 3 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/delle coordinate del COMANDO MOV CX,3 ExeC26: MOV AL,CS:[SI] ;\Il COMANDO "L" prevede 2 PARAMETRI NUMERICI INC SI ;|corrispondenti al Colore di Primo Piano e al CMP AL,'9' ;|Colore di Sfondo desiderati; si tratta di un JG ExeC27 ;|coppia di caratteri tra "00" e "15" e di un CMP AL,'0' ;|ulteriore carattere tra "0" e "7" JGE ExeC28 ;/ ExeC27: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP ExeC61 ;/RICONOSCIUTO" e rientra nella fase interattiva ;---------------------------------------------------------------------- ExeC28: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 4 caratte- INC DI ;|ri ascii numerici, a disposizione del codice LOOP ExeC26 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Lpps" ;/Colore primo piano pp=0015 sfondo s=07 CALL Colore ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 08 | Gestione dei COMANDI con un solo Parametro di tipo Ascii Numerico | ; \-------------------------------------------------------------------/ ExeC29: CMP AL,'M' ;\ JE ExeC30 ;| COMANDO "#Mn", Intestazione personalizzata CMP AL,'N' ;| COMANDO "#Nn", Menu personalizzato JNE ExeC35 ;| tipo,n=09 ;---------------------------------------------------------------------- ExeC30: PUSH AX ; Salva il carattere del COMANDO, "M" o "N" ;\Locazione Deposito per il carattere ascii LEA DI,DepoPar ;|numerico digitato in fase di acquisizione ;/del Tipo del COMANDO ExeC31: MOV AL,CS:[SI] ;\ INC SI ;| CMP AL,'9' ;|I COMANDI "M" o "N" prevedono entrambi 1 JG ExeC32 ;|PARAMETRO NUMERICO, un carattere tra "0" e "9" CMP AL,'0' ;| JGE ExeC33 ;/ ExeC32: POP AX ;\Mostra un messaggio di Errore: "PARAMETRO NON CALL ErrPAR ;|RICONOSCIUTO" e rientra nella fase interattiva JMP ExeC61 ;/ ;---------------------------------------------------------------------- ExeC33: MOV CS:[DI],AL ; Salva il carattere numerico, da "0" a "9" POP AX ; Recupera il carattere del COMANDO, "M" o "N" ;---------------------------------------------------------------------- CMP AL,'M' ;\Servizio per il COMANDO "#Mn" JNE ExeC34 ;/Intestazione personalizzata tipo,n=09 CALL Intesta ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ;---------------------------------------------------------------------- ExeC34: CMP AL,'N' ;\Servizio per il COMANDO "#Nn" JNE ExeC35 ;/Menu personalizzato tipo,n=09 CALL MenuCom ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 09 | Gestione dei COMANDI con un solo Parametro tipo Ascii Esadecimale | ; \-------------------------------------------------------------------/ ExeC35: CMP AL,'O' ;\ COMANDO "#Oxy" OUT Dato a 8 bit su LPT1 JNE ExeC40 ;| stringa ascii di 2 caratteri ;| corrispondenti al valore del ;/ numero binario a 8 bit ;---------------------------------------------------------------------- ;\Locazioni Deposito per i 2 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/dei nibble del byte richiesto dal COMANDO MOV CX,2 ExeC36: MOV AL,CS:[SI] ;\ INC SI ;|Il COMANDO "O" prevede 1 PARAMETRO ALFANUMERI- CMP AL,'9' ;|CO espresso da una coppia di caratteri scelti JG ExeC38 ;|tra "0" e "9" e tra "A" e "F", per esempio: CMP AL,'0' ;|"03" o "A5" o "6C" o "DD" o .................. JGE ExeC39 ;/ ExeC37: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP ExeC61 ;/RICONOSCIUTO" e rientra nella fase interattiva ExeC38: AND AL,11011111B ;\ CMP AL,'F' ;| JG ExeC37 ;| CMP AL,'A' ;| JB ExeC37 ;/ ;---------------------------------------------------------------------- ExeC39: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 4 caratte- INC DI ;|ri ascii numerici, a disposizione del codice LOOP ExeC36 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Oxy" ;/OUT Dato a 8 bit su LPT1 CALL OutLPT ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 10 | Gestione dei COMANDI con un solo Parametro di tipo Binario a 8 Bit| ; \-------------------------------------------------------------------/ ExeC40: CMP AL,'P' ;\ COMANDO "#Pxy" visualizzazione di Byte JNE ExeC42 ;| valore binario a 8 bit xyH ;/ ;---------------------------------------------------------------------- ;\Il COMANDO "P" prevede 1 PARAMETRO BINARIO, ExeC41: MOV AL,CS:[SI] ;|cio un byte tra 00H e FFH, esprimibile in INC SI ;|ambiente "testuale" tenendo premuto il tasto ;|"ALT" e premendo un numero tra 0 e 255 sulla ;/tastierina numerica ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Pxy" ;|Visualizzazione del Byte xyH nella posizione ;/di stampa e nel colore corrente CALL Byt2Asc ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 11 | Gestione dei COMANDI con un solo Parametro di tipo Binario a 16bit| ; \-------------------------------------------------------------------/ ExeC42: CMP AL,'Q' ;\ COMANDO #Qxywz Visualizzazione di Word JNE ExeC45 ;| valore binario a 16bit xywzH ;/ ;---------------------------------------------------------------------- ;\Il COMANDO "Q" prevede 1 PARAMETRO BINARIO, ExeC43: MOV AL,CS:[SI] ;|cio una worde tra 0000H e FFFFH, esprimibile INC SI ;|in ambiente "testuale" tenendo premuto il ;|tasto "ALT" e premendo un numero tra 0 e 255 ;/sulla tastierina numerica, per due volte!!! MOV BH,AL ; Salva in BH la parte alta della word xywzH ExeC44: MOV AL,CS:[SI] ;\ INC SI ;|Assume anche la parte bassa della word xywzH ;/ MOV AH,BH ;\In AL c' la parte bassa della word xywzH; ;/formatta AX con la parte alta, ancora in BH ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Qxywz" ;|Visualizzazione della Word xywzH nella ;/posizione di stampa e nel colore corrente CALL Wor2Asc ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 12 | Gestione dei COMANDI con 13 Parametri di tipo Ascii Numerico | ; \-------------------------------------------------------------------/ ;\ COMANDO #Raallrrcctopps Stampa una cornice ;| colore sfondo ;| colore primo piano ExeC45: CMP AL,'R' ;| ombra JNE ExeC49 ;| tipo di tratto ;| colonna angolo alto ;| riga angolo alto ;| larghezza ;/ altezza ;---------------------------------------------------------------------- ;\Locazioni Deposito per i 13 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/delle specifiche del COMANDO MOV CX,13 ExeC46: MOV AL,CS:[SI] ;\Il COMANDO "R" prevede 8 PARAMETRI NUMERICI, INC SI ;|espressi da coppie di caratteri o da caratteri CMP AL,'9' ;|singoli, descritti dalle seguenti note: JG ExeC47 ;|"03""25" altezza compresa cornice CMP AL,'0' ;|"03""80" larghezza compresa cornice JGE ExeC48 ;|"00""24" riga angolo in alto a sinistra ;|"00""79" colonna angolo in alto a sinistra ;| "0""1" tipo tratto 0=semplice; 1=doppio ;| "0""1" ombra 0=senza; 1=con ombreggiatura ;|"00""15" colore della cornice ;/ "0""7" colore dello sfondo ExeC47: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP ExeC61 ;/RICONOSCIUTO" e rientra nella fase interattiva ;---------------------------------------------------------------------- ExeC48: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 13 carat- INC DI ;|teri ascii numerici, a disposizione del codice LOOP ExeC46 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Raallrrcctopps" ;/Stampa di Cornice CALL CornCom ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 13 | Gestione dei COMANDI con Parametro di tipo Stringa Ascii | ; \-------------------------------------------------------------------/ ExeC49: CMP AL,'S' ;\COMANDO #Saa..a% stampa una Stringa Ascii JNE ExeC52 ;| NB: terminatore di stringa ;/ ascii da porre a video ;---------------------------------------------------------------------- ExeC50: MOV AL,CS:[SI] ;\ INC SI ;|Il COMANDO "S" prevede 1 PARAMETRO ALFANUMERI- CMP AL,'%' ;|CO espresso da una qualunque sequenza di JNZ ExeC51 ;|caratteri ascii; la sintassi prevede COMUNQUE MOV AL,CS:[SI] ;|che la stringa sia terminata dal carattere "%" INC SI ;| CMP AL,'%' ;|Se nel testo fosse necessaria la presenza del JZ ExeC51 ;|carattere "%" basta digitarlo 2 volte,evitando DEC SI ;|in questo modo di farlo interpretrare come ;/terminatore JMP ExeC04 ;\Solo in questo caso il servizio ha termine e si ;/torna per interpretare eventuali altri COMANDI ;---------------------------------------------------------------------- ;\Ciascun carattere trovato nella stringa ExeC51: CALL BIOchr1 ;|posto a video in sequenza, nella posizione di JMP SHORT ExeC50 ;|stampa corrente, fino a quando sar rilevato ;/il carattere terminatore "%" ; /-------------------------------------------------------------------\ ; 14 | Gestione dei COMANDI con due Parametri di tipo Ascii Numerico | ; \-------------------------------------------------------------------/ ExeC52: CMP AL,'T' ;\ COMANDO "#Tnn" Sequenza di COMANDI JNE ExeC56 ;| Codice Sequenza nn=0099 ;/ Esegue la sequenza di COMANDI ;---------------------------------------------------------------------- ;\Locazioni Deposito per i 2 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/relativi al Numero della Sequenza di COMANDI MOV CX,2 ExeC53: MOV AL,CS:[SI] ;\ INC SI ;|Il COMANDO "T" prevede 1 PARAMETRO NUMERICO, CMP AL,'9' ;|corrispondente al Numero della Sequenza di JG ExeC54 ;|COMANDI espresso da una coppia di caratteri CMP AL,'0' ;|tra "00" e "99" JGE ExeC55 ;/ ExeC54: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP ExeC61 ;/RICONOSCIUTO" e rientra nella fase interattiva ExeC55: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 4 caratte- INC DI ;|ri ascii numerici, a disposizione del codice LOOP ExeC53 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO #Tnn" ;/Sequenza di COMANDI, numero nn=0099 JMP CmdGEN ;\Esegue il servizio richiesto e, al termine, ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 15 | Gestione dei COMANDI con 8 Parametri di tipo Ascii Numerico | ; \-------------------------------------------------------------------/ ;\ COMANDO #Uaallrrcc Recupera una cornice ExeC56: CMP AL,'U' ;| colonna angolo alto JE ExeC57 ;| riga angolo alto JMP ExeC04 ;| larghezza ;/ altezza ;---------------------------------------------------------------------- ;\Locazioni Deposito per gli 8 caratteri ascii ExeC57: LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/relativi al numero d'ordine del COMANDO MOV CX,8 ExeC58: MOV AL,CS:[SI] ;\Il COMANDO "U" prevede 4 PARAMETRI NUMERICI, INC SI ;|espressi da coppie di caratteri descritte ;|dalle seguenti note: CMP AL,'9' ;|"03""25" altezza compresa cornice JG ExeC59 ;|"03""80" larghezza compresa cornice CMP AL,'0' ;|"00""24" riga angolo in alto a sinistra JGE ExeC60 ;/"00""79" colonna angolo in alto a sinistra ExeC59: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP ExeC61 ;/RICONOSCIUTO" e rientra nella fase interattiva ;---------------------------------------------------------------------- ExeC60: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito gli 8 carat- INC DI ;|teri ascii numerici, a disposizione del codice LOOP ExeC58 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Uaallrrcc" ;/Recupera una Cornice CALL RecpCom ;\Esegue il servizio richiesto e, al termine, JMP ExeC04 ;/torna per interpretare eventuali altri COMANDI ; /-------------------------------------------------------------------\ ; 16 | Fase di Rientro nell'ambiente Interattivo di lettura SMS | ; \-------------------------------------------------------------------/ ExeC61:M_msgC Testo13,24,5,0FH;\"sequenza COMANDI di PROTOCOLLO ;/ interamente interpretata" CALL KEYwait ;\Al termine del Servizio di ogni COMANDO viene RET ;|semplicemente imposta l'attesa di un tasto ed ;/il rientro nell'ambiente interattivo ;***************************************************************************** ; ---------------------------------------------- AT1_Demo 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 n1, 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 alla fine del 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;\ M_COLOR 70H ;|Predispone il Menu di gestione del contenuto M_msgN MENU06 ;|Messaggio SMS decodificato: M_COLOR 74H ;| M_msgN MENU07 ;| " F1 Leggi altri messaggi" M_COLOR 70H ;| " F2 Esegui Protocollo " M_msgN MENU08 ;/ ;--------------------------------------------------------------------- xxx11: CALL KEYwait ;\ CMP AL,00H ;|Attende la pressione di un tasto funzionale, JZ xxx12 ;|"F1" o "F2" , o del tasto "Q", nel qual caso AND AL,11011111B ;|viene imposta la fine immediata della sessione CMP AL,'Q' ;|di Comunicazione JZ _OUT ;| JMP xxx11 ;/ ;--------------------------------------------------------------------- xxx12: CMP AH,F1 ;\ JNZ xxx13 ;| CALL Sinc2 ;|Servizio tasto " F1 Leggi altri messaggi" M_recup 14,69,8,5,1000H;| JMP xxx01 ;/ ;--------------------------------------------------------------------- xxx13: CMP AH,F2 ;\ JNZ xxx11 ;| CALL ExeCmd ;|Servizio tasto "F2" - Esecuzione Protocollo CALL DESK_3 ;| 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_Demo ENDP _prog ENDS END INIZIO