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_PROT.ASM /----------------[TxD][RxD]------------------\| ;| AUTORE : Giorgio OBER | ************ *********** ************** || ;| VERSIONE : giugno 2005 \------------------[COM1]--------------------/| ;| DESCRIZIONE : Questo programma, dotato di Desktop di presentazione e di| ;| menu interattivi, la VERSIONE DEFINITIVA del progetto per| ;| il controllo remoto di un Computer con Telefono Cellulare. | ;| | ;| Ovviamente dopo la fase di "Richiesta Sincronizzazione", il| ;| Computer da sottoporre a controllo remoto rimane in costante| ;| attesa della ricezione del solo messaggio SMS n1 da un| ;| Telefono Cellulare ad esso collegato via porta seriale,senza| ;| nessuna possibilit di intervenire su nessuna delle sue| ;| risorse (monitor, tastiera, parallela, dischi, ...). | ;| | ;| Non appena il comando AT+CMGR=1 restituisce un messaggio SMS| ;| attendibile, la sua stringa PDU (Protocol Data Unit) viene| ;| decodificata con la tecnica messa a punto con i progetti| ;| precedenti (AT_Test1 e AT_Test2) ed ispezionata alla ricerca| ;| dei Comandi previsti dal nostro Protocollo Seriale, inserite| ;| nel testo "in chiaro" dell'SMS;se esse sono presenti vengono| ;| immediatamente interpretate dal computer remoto, costretto| ;| ad intervenire funzionalmemte sulle sue periferiche e/o su| ;| qualunque sua parte hardware a disposizione. | ;| | ;| Quando il Comando stato eseguito il messaggio SMS che lo| ;| richiesto viene immediatamente cancellato dalla memoria del| ;| Telefonino spedendogli il comando AT+CMGD=1; in questo modo| ;| tutta la sequenza pu ricominciare, in attesa di altri| ;| controlli remoti. | ;| | ;| Ricordo che il precedente progetto, AT1_Demo, stato| ;| sviluppato proprio per simulare l'effetto imposto al PC in| ;| questa versione finale, collaudando localmente fino a 9| ;| diverse stringhe di Comando, dopo averle memorizzate nelle| ;| rispettive locazioni del Telefonino con altrettanti SMS. | ;| | ;| 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_PROT ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP AT1_PROT ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 00H NoSMS DB 00H Titolo DB " Controllo Remoto del PC con SMS via ",00H Titolo1 DB "COM1",00H Tema0 DB "AT1_PROT - 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 MENU01 DB "Inizia",00H MENU02 DB "Quit",00H MENU03 DB "Aiuto",00H MENU04 DB "F1",00H MENU05 DB " Risincronizza",00H MENU06 DB "Premi un tasto per continuare... ",00H Vuota01 DB " " Vuota02 DB " ",00H ;--------------------------------------------------------------------- Note_ DB "Questo eseguibile, ~AT1_PROT.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 "Se il messaggio SMS contiene stringhe previste dal Protocollo",00H DB "Software originale descritto in dettaglio nella allegata",00H DB "documentazione (vedi anche le pagine di ~www.giobe2000.it~)",00H DB "il Computer sotto controllo si mette automaticamente in Modo",00H DB "COMANDI, cio sar obbligato ad interpretare in modo",00H DB "operativo le sequenze di bytes che gli saranno di seguito",00H DB "spedite, dopo essere stare estratte dal Messaggio SMS.",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 N1",00H Testo05 DB "Sono in attesa del messaggio SMS n1 dal Telefono Cellulare",00H Testo06 DB "Il Computer Remoto sta per eseguire i COMANDI del Protocollo",00H Testo07 DB " Il Messaggio Ricevuto non contiene COMANDI del Protocollo ",00H Testo08 DB " COMANDO ",00H Testo09 DB "PARAMETRO",00H Testo10 DB " non riconosciuto",00H Testo11 DB "ERRORE di SINTASSI: Il programma ha rilevato un ",00H Testo12 DB " La Sequenza dei COMANDI del PROTOCOLLO stata eseguita... ",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 ;-------------------------------------------------------------------- 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 ;--------------------------------------------------------------------- ;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 : SMS_01 | ;| DESCRIZIONE : Estrae ogni carattere dalla stringa PDU del messaggio SMS| ;| n1, salvandone i valori in 2 buffer interni diversi; poich| ;| lo scopo dell'indagine decodificare il testo, per poter| ;| verificare la presenza di eventuali Comandi del Protocollo| ;| Software, viene evitata ogni visualizzazione dei dati di| ;| volta in volta rilevati nella stringa PDU in arrivo dal| ;| Telefonino. | ;| | ;| Se sei interessato ai dettagli relativi alla descrizione del| ;| processo di decodifica della stringa PDU, puoi fare riferi-| ;| mento alla procedura "AT_SMS" proposta nell'ambito del| ;| progetto "AT1_Demo", appositamente studiato per descrivere| ;| e simulare l'effetto imposto al PC dalle stringhe di Comando| ;| pre memorizzate nelle prime 9 locazioni del Telefonino con| ;| la spedizione di altrettanti messaggi SMS. | ;\---------------------------------------------------------------------------/ 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 ;/ ;----------------------------------------------------------------------------- SMS_01: PUSH DX LEA SI,SMSrxd ;\Punta la zona di memoria in cui salvare i ;/caratteri Ascii contenuti nella stringa PDU ; /-------------------------------------------------------------------\ ; | La prima parte della stringa PDU contiene informazioni sul Centro| ; | Servizi (SMSC, Short Message Service Center) che ha gestito il| ; | messaggio SMS; per esempio: | ; 01 | ڿ 7 coppie di caratteri scambiate | ; | 07 91 93 33 85 28 52 00 >>>> + 39 335 8822500 | ; | N=7 tipo di SCA | ; | | ; | 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 caratteri ad essi relativi, posizionando il| ; | puntatore sul primo del prossimo settore. | ; | La descrizione dettagliata di ciascuno di questi ottetti dispo-| ; | disponibile nel commento della "AT_SMS", nel progetto "AT1_Demo". | ; \-------------------------------------------------------------------/ CALL RxD__ ;\ MOV CS:[SI],AL ;|Memorizza i 2 caratteri ascii esadecimali con INC SI ;|il numero dei caratteri del settore Centro CALL RxD__ ;|Servizi (SMSC, Short Message Service Center) MOV CS:[SI],AL ;| DEC SI ;/ ;\Trasforma in byte (in AL) la prima coppia di CALL Asc2Byt_ ;|caratteri trovata nella stringa e formatta il MOV AH,00H ;|risultato a 16 bit (in AX = CX) per preparare MOV CX,AX ;|il contatore dei bytes da saltare, compreso ;|quello associato alla coppia di caratteri ;/prevista per il "Tipo" di SMSC ;\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_01: CALL RxD__ ;\Memorizza i successivi (N+1)*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_01 ;/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); per esempio: | ; 02 | 1 coppia di caratteri | ; | 00 | ; | | ; | Poich le informazioni contenute in questo byte non sono utiliz-| ; | zate dal nostro progetto, il codice generato per tenerne conto si| ; | limita a saltare i 2 caratteri ad esso relativi, posizionando il| ; | puntatore sul primo del prossimo settore. | ; | La descrizione dettagliata di ciascuno di questi ottetti dispo-| ; | disponibile nel commento della "AT_SMS", nel progetto "AT1_Demo". | ; \-------------------------------------------------------------------/ 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; per esempio: | ; 03 | ڿ 7 coppie di caratteri scambiate| ; | 0E 85 00 93 40 16 89 67 54 >>>> + 00 39 0461 987645 | ; | N=14 tipo di OA | ; | | ; | 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 caratteri ad essi relativi, posizionando il| ; | puntatore sul primo del prossimo settore. | ; | La descrizione dettagliata di ciascuno di questi ottetti dispo-| ; | disponibile nel commento della "AT_SMS", nel progetto "AT1_Demo". | ; \-------------------------------------------------------------------/ 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 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 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 ;| INC SI ;/ AT_02: 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_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)la JE AT_03 ;/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" ; /-------------------------------------------------------------------\ ; | 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), esempio: | ; 04 | 1 coppia di caratteri | ; | 39 | ; | | ; | 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; per esempio: | ; 05 | 1 coppia di caratteri | ; | 00 | ; | | ; | Poich le informazioni contenute in questi 2 bytes non sono utili| ; | al nostro progetto, il codice generato per tenerne conto si| ; | limita a saltare i 4 caratteri ad essi relativi, posizionando il| ; | puntatore sul primo del prossimo settore. | ; | La descrizione dettagliata di ciascuno di questi ottetti dispo-| ; | disponibile nel commento della "AT_SMS", nel progetto "AT1_Demo". | ; \-------------------------------------------------------------------/ 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 ;|della data,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; per esempio: | ; | 503011 715325 40 | ; 06 | 3 coppie di caratteri scambiate | ; | 50 30 11 >>>> 05/03/11 >>> 2005 marzo 11 >>> 11/03/05 | ; | | ; | 3 coppie di caratteri scambiate | ; | 71 53 25 >>>> 17:35:52 >>> ore 17, minuti 35, secondi 52| ; | | ; | 1 coppia di caratteri | ; | 40 time zone, GMT+ | ; | | ; | Poich le informazioni contenute in questi 7 bytes non sono utili| ; | al nostro progetto, il codice generato per tenerne conto si| ; | limita a saltare i 14 caratteri ad essi relativi, posizionando il| ; | puntatore sul primo del prossimo settore. | ; | La descrizione dettagliata di ciascuno di questi ottetti dispo-| ; | disponibile nel commento della "AT_SMS", nel progetto "AT1_Demo". | ; \-------------------------------------------------------------------/ 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 ;/ 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 ;/ CALL RxD__ ;\ MOV CS:[SI],AL ;| INC SI ;|Memorizza i 2 caratteri ascii esadecimali con CALL RxD__ ;|l'informazione "TZ=", senza metterli a video MOV CS:[SI],AL ;| INC SI ;/ ; /-------------------------------------------------------------------\ ; | Il settimo e ultimo settore della stringa PDU contiene l'unica| ; | parte veramente utile al nostro progetto: 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 | ; | | ; | Le informazioni contenute in questi bytes sono proprio quelle che| ; | interessano al nostro progetto; il codice seguente deve estrarne| ; | il testo "in chiaro" e metterlo a disposizione per recuperare gli| ; | eventiali caratteri associati ai Comandi del Protocollo Software. | ; | La descrizione dettagliata di ciascuno di questi ottetti dispo-| ; | disponibile nel commento della "AT_SMS", nel progetto "AT1_Demo". | ; \-------------------------------------------------------------------/ ; | 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 CMP AL,LineF ;| JNE AT_07 ;/ 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 ; | 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 ; | 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 ;---------------------------------------------------------------------- AT_18: POP DX RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : INIserial | ;|DESCRIZIONE: Seleziona automaticamente la porta seriale COM predisposta dal| ;| valore della costante "COM_num" (per default EQU 01H= COM1), e| ;| se la porta seriale desiderata NON presente nel sistema,| ;| lascia in uscita in SI il valore 0000H; altrimenti lascia in| ;| SI l'indirizzo Base dell'UART sotto controllo ([port_8]= 03F8H| ;| o 02F8H o 03E8H o 02E8H) e rende facilmente reperibili TUTTI i| ;| Registri della serie virtualizzandoli con altrettante variabili| ;| /------*-----*-----*-----*-----*-----------------------------\| ;| |******| COM1| COM2| COM3| COM4|Descrizione || ;| *------*-----*-----*-----*-----*-----------------------------*| ;| |port_8|03F8H|02F8H|03E8H|02E8H|Scritt/Lett DATO -LSBdivisore|| ;| |port_9|03F9H|02F9H|03E9H|02E9H|Abilitaz Interruz-MSBdivisore|| ;| |port_A|03FAH|02FAH|03EAH|02EAH|Identif interruzioni || ;| |port_B|03FBH|02FBH|03EBH|02EBH|Registro controllo LINEA || ;| |port_C|03FCH|02FCH|03ECH|02ECH|Registro controllo MODEM || ;| |port_D|03FDH|02FDH|03EDH|02EDH|Registro stato LINEA || ;| |port_E|03FEH|02FEH|03EEH|02EEH|Registro stato del MODEM || ;| \------*-----*-----*-----*-----*-----------------------------/| ;| Inizializza inoltre: | ;| a) la velocit di ricetrasmissione caricando il divisore a 16| ;| bit, predisposto dalla costante "Baude" (default EQU 000CH=| ;| 19200baud) nei Registri [port_9]=MSB e [port_8]=LSBdivisore| ;| b) il valore dei parametri desiderati per il protocollo HW, in| ;| in accordo con le scelte suggerite dalla costante "Protoc"| ;| (default EQU 07H= 8 bit di dato e 2 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 07| ;||= 8 bit di dato e 2 di stop, nessuna parit)| ;|\--------------------------------------------/ ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ ;|[port_B]| 0 | 0 | 0 | x | 0 | 1 | 1 | 1 | 07H ;| \---*---*---*---*---*---*---*---/ ;|Protocollo/ | | | | | \---*-8 dato ;|Break disab.--/ | | | \-----2 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 ("Sincro" o "Chk_SMS") ;\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 o CALL Chk_SMS), ;/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 : Leggi01 | ;| DESCRIZIONE : Trasmette sulla PORTA SERIALE la stringa "AT+CMGR=1" per| ;| obbligare il Telefono Cellulare a restituire il primo SMS.| ;| Poich il Telefono Cellulare restituisce in sincronismo gli| ;| stessi caratteri ("AT+CMGR=1") essi vengono consumati| ;| direttamente durante l'esecuzone di questa procedura. | ;\---------------------------------------------------------------------------/ AT_CMGR DB "AT+CMGR=1",0DH,00H Leggi01:LEA SI,AT_CMGR ; Punta la stringa di richiesta del primo SMS Leg0: MOV AL,CS:[SI] ; CMP AL,00H ; Controlla se finita JZ Leg2 ; CALL TxD_1 ; Trasmette il carattere corrente INC SI ; Punta il prossimo Leg1: CALL RxD_3_ ;\Riceve di ritorno il carattere corrente CMP AH,00H ;|attendendo il momento giusto (AH=00H) JNZ Leg1 ;/ JMP SHORT Leg0 Leg2: RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Delet01 | ;| DESCRIZIONE : Trasmette sulla PORTA SERIALE la stringa "AT+CMGD=1" per| ;| obbligare il Telefono Cellulare a cancellare il primo SMS. | ;| Poich il Telefono Cellulare restituisce in sincronismo gli| ;| stessi caratteri ("AT+CMGD=1") essi vengono consumati| ;| direttamente durante l'esecuzone di questa procedura. | ;\---------------------------------------------------------------------------/ AT_CMGD DB "AT+CMGD=1",0DH,00H Delet01:LEA SI,AT_CMGD ; Punta la stringa di cancellaz. del primo SMS Del0: MOV AL,CS:[SI] ; CMP AL,00H ; Controlla se finita JZ Del2 ; CALL TxD_1 ; Trasmette il carattere corrente INC SI ; Punta il prossimo Del1: CALL RxD_3_ ;\Riceve di ritorno il carattere corrente CMP AH,00H ;|attendendo il momento giusto (AH=00H) JNZ Del1 ;/ JMP SHORT Del0 Del2: RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Chk_SMS | ;| DESCRIZIONE : Verifica della presenza del Messaggio SMS nel Telefono | ;| Cellulare: in risposta alla richiesta il Telefono trasmette | ;| "di ritorno" gli stessi caratteri trasmessi cio, per l'SMS | ;| n1, la stringa: n---*\ | ;| "AT+CMGR=1""+CMGR: 1,,35" | ;| dove n una stringa formata da 1 o pi caratteri ascii | ;| numerici, da "0" in su (per esempio n= "100"); se questo | ;| numero "0" il messaggio non presente. | ;\---------------------------------------------------------------------------/ Chk_SMS: MOV Byte Ptr CS:[NoSMS],00H; Inizializza [NoSMS] per "Messaggio inesisente" ;\I codici ascii Numerici posti dopo la stringa ;|"+CMGR: 1,," e prima della coppia Chk_s0: CALL Chk_RxD ;|finale indicano la quantit di bytes CMP AL,',' ;|associata al messaggio: se essa vale "0" il JNE Chk_s0 ;|messaggio SMS non disponibile nel Telefonino CALL Chk_RxD ;|NB: Chk_RxD lascia in AL il byte ricevuto, se CMP AL,',' ;|ci sono le condizioni per la ricezione, altri- JNE Chk_s0 ;|menti rimane in attesa che esse si verifichino CALL Chk_RxD ;|testando nel frattempo la pressione dei tasti ;|"Q" o "F1", per garantire la possibilit di ;/porre comunque termine o di risincronizzare CMP AL,'0' ;\Il messaggio SMS N1 non disponibile nel JE Chk_s1 ;/Telefono Cellulare ripete ad oltranza l'attesa ;--------------------------------------------------------------------- MOV Byte Ptr CS:[NoSMS],01H ;\Non appena il messaggio SMS n1 disponi- ; M_corn 4,69,3,5,19H,01,01,1000H;|bile segnala, per qualche istante: ; M_msgC Testo04,4,12,1FH ;|"Il Telefono Cellulare ha trasmesso il ; ;| messaggio SMS N1" ; M_msgC Testo06,5,9,1FH ;|"Il Computer Remoto sta per eseguire ; CALL DEL_2000 ;/ i COMANDI del Protocollo" ;--------------------------------------------------------------------- Chk_s1: CALL Chk_RxD ;\ CMP AL,Invio ;|Consuma COMUNQUE i bytes che concludono la JNE Chk_s1 ;|ricezione dell'intestazione del messaggio SMS, CALL Chk_RxD ;|per esempio 2C 2C 33 35 0D 0A ",,35" CMP AL,LineF ;|oppure: 2C 2C 31 30 30 0D 0A ",,100" JNE Chk_s1 ;/ 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,Testo08 ; "COMANDO " JMP SHORT Err01 ;------------------------------------------------------------ ErrPAR: LEA SI,Testo09 ; "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 Testo11,24,3,4FH;| "Il programma ha rilevato un " POP SI ;| "COMANDO " o "PARAMETRO " CALL BIOSmsg ;| "non riconosciuto" M_msgN Testo10 ;/ 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 Testo07,4,10,4FH;*- " Il Messaggio Ricevuto non contiene ;| COMANDI del Protocollo " M_msgC MENU06,24,7 ,70H;|" Premi un tasto per continuare..." CALL KEYwait ;| RET ;/ ; /-------------------------------------------------------------------\ ; 02 | Fasi Preliminari prima di interpretare le stringhe del Protocollo | ; \-------------------------------------------------------------------/ ExeC02: ; /-------------------------------------------------------------------\ ; | 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 ; \-------------------------------------------------------------------/ 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: 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 3 , 69 , 3 , 5 , 19H , 01 , 01 ,1000H M_msgC Testo12,4, 8,1FH; " La Sequenza dei COMANDI del PROTOCOLLO CALL DEL_2000 ; stata eseguita... " ;\Al termine del Servizio di ogni COMANDO viene RET ;|semplicemente imposto il rientro nell'ambiente ;/interattivo ;***************************************************************************** ; ---------------------------------------------- AT1_PROT 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 possibile stabilire un contatto viene ;|mostrato il messaggio "Il Telefono Cellulare CALL Sincro ;|non risponde: accendilo e Risincronizza F1!" CALL DEL_2000 ;|ed sempre possibile porre fine all'attesa ;|premendo "Q"; in caso contrario (risposta "OK" ;|al comando "AT") viene subito segnalato ;/"Telefono Cellulare IN LINEA..." ; /-------------------------------------------------------------------\ ; 03 | Richiesta di LETTURA del 1 messaggio SMS al Telefono Cellulare | ; \-------------------------------------------------------------------/ xxx01: M_corn 3,69,3,5,4CH,01,01,1000H;\Prepara il sistema come se il messaggio n1 M_msgC Testo05,4, 9,4FH ;|non sia ancora disponibile: ;|"Sono in attesa del messaggio SMS n1 ;/ dal Telefono Cellulare" xxx02: CALL Leggi01 ;\Trasmette al cellulare la stringa: ;/ "AT+CMGR=1" ; /-------------------------------------------------------------------\ ; 04 | Verifica della presenza del Messaggio SMS nel Telefono Cellulare | ; \-------------------------------------------------------------------/ ;\Riceve dal cellulare la stringa: ;| "AT+CMGR=1""+CMGR: 1,,n" ;|con n="0" se il messaggio SMS N1 non dispo- ;|nibile, oppure n=stinga numerica (p.es "100") CALL Chk_SMS ;|se il messaggio N1 regolarmente presente; ;|In caso di mancata ricezione dati dal Telefono ;|Cellulare prevista la possibilit di porre ;|termine al programma (premendo il tasto "Q") o ;/di risincronizzare il collegamento (con "F1") CMP Byte Ptr CS:[NoSMS],00H;\Se il Messaggio SMS stato trovato nel JNZ xxx04 ;|Telefono Cellulare viene analizzato per ;/mettere in esecuzione i comandi del PROTOCOLLO ;--------------------------------------------------------------------- MOV CX,6 ;\Altrimenti recupera i 6 caratteri previsti in xxx03: CALL RxD_3_ ;|questo caso, in chiusura del messaggio SMS: CMP AH,00H ;| "OK" JNZ xxx03 ;|e rientra nel MAIN LOOP in attesa di rilevare LOOP xxx03 ;|la presenza di un "nuovo" primo messaggino JMP xxx02 ;/ ; /-------------------------------------------------------------------\ ; | Organizza la ricezione e la memorizzazione del Messaggio SMS| ; 05 | richiesto al Telefono Cellulare, in risposta alla richiesta fatta.| ; \-------------------------------------------------------------------/ xxx04: CALL SMS_01 ; /-------------------------------------------------------------------\ ; | Eventuale esecuzione del Protocollo contenuto nel Messaggio n1; | ; 06 | al termine sua immediata cancellazione | ; \-------------------------------------------------------------------/ CALL ExeCmd ;\Esegue le stringhe "#...." del PROTOCOLLO CALL DESK_3 ;/ CALL Delet01 ;\Trasmette al cellulare la stringa: ;/ "AT+CMGD=1" MOV CX,6 ;\Recupera i 6 caratteri previsti come sempre xxx05: CALL RxD_3_ ;|in chiusura del messaggio SMS ricevuto: CMP AH,00H ;| "OK" JNZ xxx05 ;|e rientra nel MAIN LOOP in attesa di rilevare LOOP xxx05 ;|la presenza di un "nuovo" primo messaggino JMP xxx01 ;/ ; /-------------------------------------------------------------------\ ; 07 | 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_PROT ENDP _prog ENDS END INIZIO