PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (marzo 2005) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : TxR_Srvr.ASM /----------------[TxD][RxD]------------------\| ;| AUTORE : Giorgio OBER | ************ *********** ************** || ;| VERSIONE : marzo 2005 \------------------[COM1]--------------------/| ;| DESCRIZIONE : Organizza la RICETRASMISSIONE di testi e/o di DATI tra due | ;| Computer tramite le rispettive porte seriali (UART), con | ;| tecnica d'interrogazione (POLLING), con p rotocollo HW | ;| impostato per: | ;| /--------------------------------\ | ;| | COM1, 9600, N, 2, 8 | | ;| \--------------------------------/ | ;| Questo programma Š una variante di ~TxR_Prot~ ed Š stato| ;| progettato per rendere possibile il Controllo Remoto, via| ;| seriale COM1, del Computer sul quale Š in esecuzione, da| ;| parte di un ~Single-Chip~ o da un ~MicroComputer~, ma anche| ;| ovviamente da un altro Personal Computer. | ;| | ;| Non appena si preme il tasto ~Inizia~ il programma rimane in| ;| attesa del byte 0AAH prima o poi spedito dal suo controllore| ;| per segnalare la sua presenza in linea; quando questo accade| ;| il programma restituir… il medesimo codice 0AAH. | ;| | ;| Subito dopo il programma rimane in attesa del byte 0FFH e,| ;| quando lo riceve, lo restituisce e si mette automaticamente| ;| in Modo COMANDI, cioŠ sar… in grado di interpretare in modo| ;| operativo le sequenze di bytes che gli saranno di seguito| ;| spedite, in rigoroso accordo con le stringhe previste dal| ;| Protocollo originale; 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=01ö99 | ;| /*------------colonna cc=00ö79 | ;| #Krrcc Coordinate di stampa | ;| \*--------------riga rr=00ö24 | ;| /-------------sfondo s=0ö7 | ;| #Lpps Attributo di colore, testo sfondo | ;| \*--------------primo piano pp=00ö15 | ;| #Mn Intestazione personalizzata | ;| \---------------numero n=0ö9 | ;| #Nn Menu personalizzato | ;| \---------------numero n=0ö9 | ;| #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=03ö80 | ;| || /*--------colonna angolo alto a sinistra cc=00ö79 | ;| || || /------ombra 0=senza, 1=con | ;| || || | /---colore sfondo s=0ö7 | ;| #Raallrrcctopps Stampa una cornice programmabile a video | ;| || || | \*----colore primo piano pp=00ö15 | ;| || || \-------tipo 0=tratto semplice, 1=tratto doppio | ;| || \*----------riga angolo alto a sinistra rr=00ö24 | ;| \*--------------altezza compresa cornice aa=03ö25 | ;| #Saa..a 0DH Sequenza di caratteri ascii | ;| || | \--------carattere terminatore =0DH=13= | ;| \*--*-----------caratteri ascii da porre a video | ;| #Tnn Sequenza di COMANDI Precostituiti | ;| \*--------------numero nn=00ö99 | ;| /*------------larghezza compresa cornice ll=03ö80 | ;| || /*--------colonna angolo alto a sinistra cc=00ö79 | ;| #Uaallrrcc Recupera area coperta da cornice | ;| || \*----------riga angolo alto a sinistra rr=00ö24 | ;| \*--------------altezza compresa cornice aa=03ö25 | ;|/-----------\/------------------------------------------------------------\| ;|| ||La tecnica di Trasmissione Š affidata alla procedura TxD_1. || ;|| ||La tecnica di Ricezione (procedura RxD_3) Š sufficientemente|| ;|| ||AFFIDABILE, aspettando le condizioni ottimali per consentire|| ;|| ||la lettura del dato, sebbene il tempo consumato (per altro|| ;|| ||breve) consumato nella stampa del carattere ricevuto e nella|| ;|| ||verifica della pressione di un tasto (per consentire di por-|| ;|| NB: ||re termine all'esecuzione del programma dopo la ricezione),|| ;|| ||operata dal MAIN PROGRAM, possa potenzialmente causare la|| ;|| ||perdita di qualche bytes in arrivo. || ;|\-----------/\------------------------------------------------------------/| ;|/-----------\ Per cambiare PORTA utilizzata, Velocit… di ricetrasmissione| ;|| | e Protocollo Seriale scegli altri valori tra quelli possibili| ;|| | per le costanti qui sotto; per COM_num e Baude basta spostare| ;|| NB: | il "punto e virgola" mentre per Protoc bisogna riassemblare| ;|| | il byte con i campi desiderati. | ;|| | -------------------------------------------------------------| ;|\-----------/ Maggiori dettagli sono disponibili nella sezione dedicata | ;| alla porta seriale sul sito *** http://www.giobe2000.it *** | ;\---------------------------------------------------------------------------/ Invio EQU 0DH ;codice del tasto ESC_ EQU 27 ;codice del tasto F1 EQU 3BH ;codice Scansione tasto F2 EQU 3CH ;codice Scansione tasto COM_num EQU 01H ;PORTA utilizzata = COM1 /--------------------------------\ ;EQU 02H ;PORTA utilizzata = COM2 |Scegli la porta COM desiderata | ;EQU 03H ;PORTA utilizzata = COM3 |[ default: programma per COM1 ] | ;EQU 04H ;PORTA utilizzata = COM4 \--------------------------------/ ;---------------------------------------------------------- ;/--------------------------------------------------------\ ;| Scegli la COSTANTE per la VELOCITA` desiderata | ;*--------*-------------------------------*---------------* ;|Costante|********** Baud RATE *********| Errore | ;*--------*-----------------------*-------*---------------* ;EQU 0900H ;|=2304 = (115200/2304) = 50.0 | 50 | ---- | ;EQU 0600H ;|=1536 = (115200/1536) = 75.0 | 75 | ---- | ;EQU 0417H ;|=1047 = (115200/1047) = 110.0 | 110 |(errore 0.026 )| ;EQU 0359H ;|= 857 = (115200/857 ) = 134.4 | 135 |(errore 0.058 )| ;EQU 0300H ;|= 768 = (115200/768 ) = 150.0 | 150 | ---- | ;EQU 0180H ;|= 384 = (115200/384 ) = 300.0 | 300 | ---- | ;EQU 00C0H ;|= 192 = (115200/192 ) = 600.0 | 600 | ---- | ;EQU 0060H ;|= 96 = (115200/96 ) = 1200.0 | 1200 | ---- | ;EQU 0040H ;|= 64 = (115200/64 ) = 1800.0 | 1800 | ---- | ;EQU 003AH ;|= 58 = (115200/58 ) = 1986.2 | 2000 |(errore 0.69) | ;EQU 0030H ;|= 48 = (115200/48 ) = 2400.0 | 2400 | ---- | ;EQU 0020H ;|= 32 = (115200/32 ) = 3600.0 | 3600 | ---- | ;EQU 0018H ;|= 24 = (115200/24 ) = 4800.0 | 4800 | ---- | ;EQU 0010H ;|= 16 = (115200/16 ) = 7200.0 | 7200 | ---- | Baude EQU 000CH ;|= 12 = (115200/12 ) = 9600.0 | 9600 | ---- | ;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]=07H--------------------------------* ;| default .... ..11 >>>>> 8 bit per il DATO | Protoc EQU 07H ;| .... ..10 >>>>> 7 bit per il DATO | ;| .... ..01 >>>>> 6 bit per il DATO | ;| .... ..00 >>>>> 5 bit per il DATO | ;*--------------------------------------------------------* ;| default .... .1.. >>>>> 2 bit di stop | ;| .... .0.. >>>>> 1 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 RAMcur:NEAR EXTRN KEYwait:NEAR EXTRN Asc2Byt:NEAR EXTRN Dec2Byt:NEAR EXTRN Byt2Asc:NEAR EXTRN Wor2Asc:NEAR EXTRN Wor2Dec:NEAR EXTRN RamCorn:NEAR EXTRN RamRecup:NEAR EXTRN Del_1000:NEAR EXTRN Delay:NEAR EXTRN Del_2000:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC TxR_Srvr ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP TxR_Srvr ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 00H Nocom0 DB "La PORTA SERIALE desiderata, COM , ",00H Nocom1 DB "non Š",00H Nocom2 DB " disponibile",00H Titolo DB "Programma per il Collaudo della Porta Seriale ",00H Titolo1 DB "COM",00H Tema0 DB "TxR_Srvr-RICETRASMISSIONE SERIALE su " DB "COM1 - Protocollo:9600,N,2,8",00H Tema1 DB " La RiceTrasmissione Š gestita in POLLING",00H Tema2 DB " Copyright www.giobe2000.it - ing. Giorgio OBER ",00H Vuota01 DB " " Vuota02 DB " " Vuota03 DB " ",00H Testo01 DB "Sono in attesa di RICEZIONE dal Computer Remoto",00H Testo02 DB "in attesa",00H Testo03 DB "Il Computer Remoto non risponde - RICEZIONE terminata",00H Testo04 DB "Computer Remoto in linea - Digita i comandi o i testi",00H Testo05 DB " COMANDO ",00H Testo06 DB "PARAMETRO ",00H Testo07 DB "non riconosciuto",00H Testo08 DB "Il Computer Remoto Š pronto, in attesa di COMANDI...",00H MENU00 DB "Inizia",00H MENU01 DB "Aiuto",00H MENU02 DB "Quit",00H ;-------------------------------------------------------------------- Note_ DB "Questo eseguibile, ~TxR_Srvr.COM~, Š stato progettato per",00H DB "rendere possibile, mediante comunicazione seriale via COM1,",00H DB "il Controllo Remoto del Computer sul quale Š in esecuzione,",00H DB "esercitato in particolare da un ~Single-Chip~ o da un ~Micro",00H DB "Computer~ ma ovviamente anche da un altro Personal Computer.",00H DB " ",00H DB "Non appena si preme il tasto ~Inizia~ il programma rimane in",00H DB "attesa del byte 0AAH prima o poi spedito dal suo controllore",00H DB "per segnalare la sua presenza in linea; quando questo accade",00H DB "il programma restituir… il medesimo codice 0AAH. ",00H DB " ",00H DB "Subito dopo il programma rimane in attesa del byte 0FFH e,",00H DB "quando lo riceve, lo restituisce e si mette automaticamente",00H DB "in Modo COMANDI, cioŠ sar… in grado di interpretare in modo",00H DB "operativo le sequenze di bytes che gli saranno di seguito",00H DB "spedite, in rigoroso accordo con le stringhe previste dal",00H DB "Protocollo originale descritto in dettaglio nella allegata",00H DB "documentazione (vedi anche le pagine di ~www.giobe2000.it~)",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:9600,N,2,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 ;-------------------------------------------------------------------- ;\Se la variabile [StngMod] vale 00 la "Rx_Cmd" pu• ;|consultare la tastiera, per dare in ogni momento la ;|possibilit… di porre termine alla ricezione; questa ;|scelta Š opportuna durante la ricezione di singole StngMod DB 00H ;|Stringhe di COMANDI ma, surante la ricezione di una ;|Sequenza di Stringhe di COMANDI, organizzata dal ;|COMANDO "#Tnn", per ridurre al minimo i tempi morti ;|viene evitato di consultare la tastiera, forzando ;/la variabile [StngMod] a 01 con il COMANDO "#I" ;-------------------------------------------------------------------- ;\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 ;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___:CALL VIA_cur ;\/--------------------------------------------\ MOV AL,'°' ;||**** Piano di lavoro e Menu principale *****| M_COLOR 71H ;|\--------------------------------------------/ CALL Riempi ;/Predispone il Piano Lavoro su tavola zigrinata Barra1: 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 Intestazione e primo Menu ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 5 , 69 , 11 , 5 , 1EH , 01 , 01 ,1000H ;\Si recupera il valore iniziale di SI e, se Š POP SI ;|diverso da 0000H significa che la porta CMP SI,0000H ;|richiesta Š presente nel sistema, per cui JNZ DESK_0 ;|si prosegue con la presentazione del Menu ;/principale del progamma ;--------------------------------------------------------------------- M_msgC Nocom0,12,13,1FH;\/--------------------------------------------\ M_COLOR 9FH ;||** Porta NON installata: segnala l'errore **| M_msgN Nocom1 ;|\--------------------------------------------/ M_COLOR 1FH ;| 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 ;/ ;\NB: recupera con POP AX la posizione pendente POP AX ;|nello stack dovuta alla chiamata "CALL DESKTOP ;/per poter tornare con JMP invece che con "RET" JMP _OUT ; Rientro al Main con terminazione immedata ;--------------------------------------------------------------------- DESK_0: M_msgC Tema0,12, 7,1FH;\/--------------------------------------------\ M_msgC Tema1,14, 7,1FH;||***** Porta installata: test eseguibile ****| MOV AL,CS:[depPOR];|\--------------------------------------------/ ADD AL,30H ;|"TRASMISSIONE SERIALE su COMx - M_Chr AL,12,47,1EH ;| protocollo HW: 9600,N,2,8" M_Chr AL, 0,61,74H ;/ <<<< Visualizza anche nella barra del Titolo M_msgC MENU00,24,7,70H;\/--------------------------------------------\ M_Chr 'I',24, 7,74H ;||************ Primo Menu interno ************| M_msgC MENU01,24,16,70H;|\--------------------------------------------/ M_Chr 'A',24,16,74H ;| DESK_1: CALL KEYwait ;| AND AL,11011111B ;|Rimane in attesa dei tasti del Menu principale CMP AL,'I' ;| con "I" inizia il Test JZ DESK_2 ;| CMP AL,'A' ;| con "A" Aiuto JZ Note ;| CMP AL,'Q' ;| con "Q" torna al DOS JNZ DESK_1 ;/ ;\NB: recupera con POP AX la posizione pendente POP AX ;|nello stack dovuta alla chiamata "CALL DESKTOP ;/per poter tornare con JMP invece che con "RET" JMP _OUT ; Rientro al Main con terminazione immedata ;--------------------------------------------------------------------- ;/---------------------------------------------\ ;| Descrive il funzionamento del programma. | ;\---------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva Note: M_corn 20 , 64 , 2 , 7 , 31H , 01 , 01 ,2000H LEA SI,Note_ M_COLOR 3FH MOV CX,18 MOV DH,3 MOV DL,9 Note1: M_CURSOR DH,DL CALL BIOSmsg INC SI INC DH LOOP Note1 CALL KEYwait ;M_recup altezza,larghezza,riga,colonna,salva M_recup 20 , 64 , 2 , 7 ,2000H JMP SHORT DESK_1 ;-------------------------------------------------------------------- DESK_2:M_msgC Vuota01,24,7,74H; ;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 Vuota01,24,7,74H;\ "Sono in attesa di RICEZIONE M_msgC Testo01,4,17,4FH;| dal Computer Remoto" M_msgC Testo02,4,22,0CFH;/ RET ;--------------------------------------------------------------------- ;\/--------------------------------------------\ DESK_3: CALL BIOScls ;||***** Messaggio di commiato in USCITA ***** | ;*\--------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 5 , 69 , 11 , 5 , 1EH , 01 , 01 ,1000H M_msgC Tema0,12, 7,1FH;\ Messaggio di chiusura M_msgC Tema2,14, 9,1FH;/ RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA :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=| ;| 9600 baud) 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: 9600 bps = 9600 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=9600 baud) | ;|\--------------------------------------------/ ;|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 bit7öbit4 tutti a ;|"0" tutte le interruzioni da parte della ;|SERIALE sono disabilitate ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ ;|[port_9]| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00H ;| \---*---*---*---*-no*-no*-no*-no/ ;|non usati-*---*---*---/ | | | | RxD ;|Variazione Stato Linea----/ | | \-pieno ;/Variazione Registro Modem-----/ \-TxD vuoto ;/---------------------------------------------------------------------------\ ;| /--------------------------------------------\| ;| PROCEDURA : TxD_1 | ************* Versione 01 ************* || ;| \--------------------------------------------/| ;| DESCRIZIONE : Trasmette sulla PORTA SERIALE il byte fornito in AL, aspet-| ;| tando le condizioni ottimali per consentire la TRASMISSIONE| ;| del dato desiderato (cioŠ che il "Registro di memorizzazione| ;| del trasmettitore" sia VUOTO) | ;\---------------------------------------------------------------------------/ TxD_1: MOV BL,AL ; Salva il carattere da trasmettere in BL ;\/-[port_D]-----------------------------------\ ;|| Registro di stato della LINEA SERIALE | ;|\--------------------------------------------/ ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ ;|[port_D]| x | x | 1 | x | x | x | x | x | 20H ;| \---*---*---*---*---*---*---*---/ ;| \-[port_8] o FIFO Tx vuoto MOV DX,CS:[port_D];|Controlla lo stato della linea seriale per TxD101: IN AL, DX ;|vedere se la porta seriale Š pronta per la TEST AL,20H ;|TRASMISIONE di un NUOVO DATO (in questo caso JZ TxD101 ;|il bit5 del "registro di stato" Š a "1", ad ;|indicare che il "Registro di memorizzazione ;|del trasmettitore" Š VUOTO; solo ora il dato ;|successivo da trasmettere pu• essere collocato ;|in uscita (cioŠ proprio in quel registro) il ;|che mette di nuovo automaticamente a "0" il ;|bit5 del registro di stato finch‚ il "registro ;|di memorizzazione del trasmettitore" Š pronto ;/ad accettare un altro carattere ;\/-[port_8]-----------------------------------\ ;|| Registro BUFFER TRASMISSIONE (in SCRITTURA)| MOV DX,CS:[port_8];|\--------------------------------------------/ MOV AL,BL ;|In trasmissione la porta [port_8] costituisce OUT DX,AL ;|il registro BUFFER di TRASMISSIONE: il codice ;|attualmente presente il BL viene spedito sulla ;/porta seriale RET ;/---------------------------------------------------------------------------\ ;| /--------------------------------------------\| ;| PROCEDURA : RxD_3 | ************* Versione 03 ************* || ;| \--------------------------------------------/| ;| 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. | ;|/-----------\ | ;|| | 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,01H ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ JNZ RxD301 ;|[port_D]| x | x | 1 | x | x | x | x | x | 01H ;| \---*---*---*---*---*---*---*---/ ;/ Dato ricevuto pronto-----------------/ MOV AH,01H ;\Se invece non Š stato rilevato alcun Nuovo RET ;/Dato Ricevuto: si rimane 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 : Cornice1 | ;| DESCRIZIONE : Stampa una cornice a tutto video, con accesso diretto alla| ;| Ramvideo, in risposta al COMANDO "#E" Cornice di primo tipo.| ;\---------------------------------------------------------------------------/ Cornice1: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 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: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 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: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 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: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 ;/ 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:MOV DH,1 ; Predipone la stampa sulla seconda riga M_CURSOR DH,1 ;\ COMANDO "#Nn", Menu personalizzato M_COLOR 1FH ;| \---tipo,n=0ö9 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 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:MOV DH,23 ; Predipone la stampa sulla penultima riga M_CURSOR DH,1 ;\ COMANDO "#Nn", Menu personalizzato M_COLOR 1FH ;| \---tipo,n=0ö9 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 | ;\---------------------------------------------------------------------------/ ;\Locazioni Deposito per i 4 caratteri ascii GoToXY: 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=00ö79 SUB DH,'0' ;| \*-------riga rr=00ö24 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 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. | ;\---------------------------------------------------------------------------/ ;\Locazioni Deposito per i 3 caratteri ascii Colore: 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=0ö7 SUB DH,'0' ;| \*---primo piano pp=00ö15 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 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 !!!!! | ;| \----------/ -------------------------------------------------------------| ;\---------------------------------------------------------------------------/ ;\Locazioni Deposito per i 2 caratteri ascii OutLPT: 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 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 ;| |||||||||\-----ombra CornCom: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 ;/ ;----------------------------------------------- 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 ;| ||||||\*-------colonna angolo alto RecpCom: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 ;/ ;----------------------------------------------- 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 | ;\---------------------------------------------------------------------------/ ;\Locazioni Deposito per i 2 caratteri ascii DelayTx:LEA SI,DepoPar ;|digitati in fase di acquisizione della costan- ;/te di tempo nn=01ö99 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=01ö99 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 ;/ RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : ErrCOM e ErrPAR | ;| DESCRIZIONE : Mostra il messaggio che segnala COMANDO o PARAMETRO ignoto. | ;\---------------------------------------------------------------------------/ ErrCOM: LEA SI,Testo05 ; "COMANDO " JMP SHORT Err01 ;------------------------------------------------------------ ErrPAR: LEA SI,Testo06 ; "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 ;| POP SI ;| CALL BIOSmsg ;/ M_msgN Testo07 ; "non riconosciuto" 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 : Sincro | ;| DESCRIZIONE : Aspetta che il computer remoto sia collegato, continuando,| ;| nell'attesa, a trasmettere il carattere 0AAH, scelto per| ;| esprimere la propria disponibilit… a ricevere. | ;| Se il collegamento non si realizza Š possibile terminare la| ;| sessione di ricetrasmissione premendo il tasto "Q" [quit]| ;| per restituire il controllo al sistema operativo. | ;| In ogni caso viene fornita una adeguata segnalazione. | ;\---------------------------------------------------------------------------/ Sincro: MOV AL,0AAH ;\Spedisce al Computer remoto il codice AAH CALL TxD_1 ;|che esprime la sua disponibilit… a ricevere ;/dati e la sua presenza in linea CALL RxD_3 ;\Riceve un byte dalla PORTA SERIALE; se il ;/dato Š attendibile (AH=00H) Š lasciato in AL CMP AH,00H ;\ JNZ Sincr0 ;|Se la Ricezione Š andata a buon fine verifica CMP AL,0AAH ;|se il dato ricevuto non Š quello previsto per JNZ Sincro ;|il sincronismo di collegamento (AH=00,AL=AAH) JMP Sincr2 ;/ ;\In caso contrario controlla la pressione di Sincr0: MOV AH,01H ;|tasti SENZA FERMARSI per garantire l'uscita INT 16H ;|in caso di attesa troppo lunga; se NON Š JZ Sincro ;|stato premuto alcun tasto (ffZ="1") continua ;/la RiceTrasmissione automatica ;--------------------------------------------------------------------- CALL KEYwait ;\"Il Computer Remoto non risponde - AND AL,11011111B ;| RICEZIONE terminata" CMP AL,'Q' ;|Vuota il Buffer della Tastiera e controlla se JNZ Sincro ;|Š stato premuto il tasto "Q": se non Š cosŤ la ;/Rice-Trasmissione automatica continua ;--------------------------------------------------------------------- ;/---------------------------------------------\ ;|*** Segnala Computer remoto non collegato ***| ;\---------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva Sincr1: M_corn 3 , 69 , 3 , 5 , 4CH , 01 , 01 ,1000H M_msgC Testo03,4,13,4FH; "Il Computer Remoto non risponde - ; RICEZIONE terminata" ;\Se Š stato premuto il tasto "Q" si torna al POP AX ;|DOS per salto (JMP) recuperando prima, con un JMP _OUT ;|artificio (POP AX) la posizione pendente nello ;/ stack (dovuta all'ingresso per CALL NEAR) ;--------------------------------------------------------------------- ;/---------------------------------------------\ ;|*** MENU INTERNO durante la gestione dati ***| ;\---------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva Sincr2: M_corn 3 , 69 , 3 , 5 , 2AH , 01 , 01 ,1000H M_msgC Testo04,4,13,2FH; "Computer Remoto in linea - Digita i comandi" M_msgC Vuota03,24,70,70H CALL Del_1000 CALL Del_2000 RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Rx_Cmd ************** VERSIONE RIDOTTA ******************* | ;| DESCRIZIONE : Procedura con il compito di ricevere i COMANDI in arrivo dal| ;| computer remoto; per iniziare ad interpretare i comandi in| ;| arrivo aspetta conferma dal Computer Remoto, cioŠ rimane in| ;| attesa del byte di "Inizio Modo Comandi", FFH. | ;| Non appena il byte Š ricevuto avvisa il computer remoto che| ;| Š disponibile a ricevere i suoi COMANDI spedendo di ritorno| ;| il byte FFH. | ;| Da questo momento questo computer Š configurato per ricevere| ;| i comandi previsti dal protocollo, condiviso con il computer| ;| remoto, ed Š obbligato ad interpretare i bytes in arrivo| ;| come ~azioni~ da eseguire. Su richiesta del Computer remoto| ;| pu• eventualmente restituire messaggi o dati ma non gli sar…| ;| possibile intervenire sul suo controllo... | ;| Dopo la ricezione di ogni COMANDO Š possibile intervenire da| ;| tastiera con la pressione un tasto qualunque per annullare| ;| la sessione di ricezione COMANDI. | ;| 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 | ;| #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=01ö99 | ;| /*------------colonna cc=00ö79 | ;| #Krrcc Coordinate di stampa | ;| \*--------------riga rr=00ö24 | ;| /-------------sfondo s=0ö7 | ;| #Lpps Attributo di colore, testo sfondo | ;| \*--------------primo piano pp=00ö15 | ;| #Mn Intestazione personalizzata | ;| \---------------numero n=0ö9 | ;| #Nn Menu personalizzato | ;| \---------------numero n=0ö9 | ;| #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=03ö80 | ;| || /*--------colonna angolo alto a sinistra cc=00ö79 | ;| || || /------ombra 0=senza, 1=con | ;| || || | /---colore sfondo s=0ö7 | ;| #Raallrrcctopps Stampa una cornice programmabile a video | ;| || || | \*----colore primo piano tt=00ö15 | ;| || || \-------tipo 0=tratto semplice, 1=tratto doppio | ;| || \*----------riga angolo alto a sinistra rr=00ö24 | ;| \*--------------altezza compresa cornice aa=03ö25 | ;| #Saa..a 0DH Sequenza di caratteri ascii | ;| || | \--------carattere terminatore =0DH=13= | ;| \*--*-----------caratteri ascii da porre a video | ;| #Tnn Sequenza di COMANDI Precostituiti | ;| \*--------------numero nn=00ö99 | ;| /*------------larghezza compresa cornice ll=03ö80 | ;| || /*--------colonna angolo alto a sinistra cc=00ö79 | ;| #Uaallrrcc Recupera area coperta da cornice | ;| || \*----------riga angolo alto a sinistra rr=00ö24 | ;| \*--------------altezza compresa cornice aa=03ö25 | ;\---------------------------------------------------------------------------/ ; /-------------------------------------------------------------------\ ; 01 | Fasi Preliminari in attesa del sincronismo FFH del Modo COMANDI | ; \-------------------------------------------------------------------/ Rx_Cmd: CALL RxD_3 ;\Riceve un byte dalla PORTA SERIALE; se il ;/dato Š attendibile (AH=00H) Š lasciato in AL CMP AH,00H ;\ JNZ Rx_C00 ;|Se la Ricezione Š andata a buon fine verifica CMP AL,0FFH ;|se il dato ricevuto non Š quello previsto per JNZ Rx_Cmd ;|il sincronismo di collegamento (AH=00,AL=FFH) JMP Rx_C01 ;/ ;\In caso contrario controlla la pressione di Rx_C00: MOV AH,01H ;|tasti SENZA FERMARSI per garantire l'uscita INT 16H ;|in caso di attesa troppo lunga; se NON Š JZ Rx_Cmd ;|stato premuto alcun tasto (ffZ="1") continua ;/la RiceTrasmissione automatica ;----------------------------------------------- ;/---------------------------------------------\ ;|*** Segnala Computer remoto non collegato ***| ;\---------------------------------------------/ ;\Vuota il Buffer della Tastiera e torna al DOS CALL KEYwait ;|con la segnalazione: JMP Sincr1 ;|"Il Computer Remoto non risponde - ;/ RICEZIONE terminata" ;----------------------------------------------- ;/---------------------------------------------\ ;|*** Modo COMANDI attivato: mostra l'evento **| ;\---------------------------------------------/ ;\Non appena Š stato interpretato il byte FFH in ;|arrivo dal Computer Remoto viene spedito di Rx_C01: MOV AL,0FFH ;|ritorno un byte uguale, FFH; questa operazione CALL TxD_1 ;|avvisa il programma remoto che Š il momento di ;|cominciare a trasmettere COMANDI, anche se non ;/Š strettamente necessario... Rx_C02: CALL BIOScls ;\In ogni caso pulisce lo schermo, in attesa di ;/ interpretare i COMAMDI ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 3 , 69 , 3 , 5 , 2AH , 01 , 01 ,1000H M_msgC Testo08,4,13,2FH;"Computer Remoto Š pronto in attesa di COMANDI" ; /-------------------------------------------------------------------\ ; 02 | Punto di Rientro del MAIN LOOP nella Ricezione in Modo COMANDI | ; \-------------------------------------------------------------------/ ;\Se Š in atto la ricezione di una Sequenza di Rx_C03: ;|Stringhe di COMANDI, organizzata dal COMANDO CMP Byte Ptr CS:[StngMod],01;|"#Tnn",viene evitato di consultare la tastiera JZ Rx_C04 ;|per ridurre al minimo i tempi morti per inter- ;/cessione della variabile [StngMod], posta a 1 ;----------------------------------------------- ;\Controlla la pressione di tasti SENZA FERMARSI MOV AH,01H ;|per garantire la trasmissione di dati; se NON INT 16H ;|Š stato premuto alcun tasto (ffZ="1") continua JZ Rx_C04 ;/verificando se Š pronto un dato in Ricezione ;----------------------------------------------- ;/---------------------------------------------\ ;|*** Segnala Computer remoto non collegato ***| ;\---------------------------------------------/ ;\Vuota il Buffer della Tastiera e torna al DOS CALL KEYwait ;|con la segnalazione: JMP Sincr1 ;|"Il Computer Remoto non risponde - ;/ RICEZIONE terminata" ; /-------------------------------------------------------------------\ ; 03 | Punto di Ingresso nella Gestione di ogni nuovo COMANDO | ; \-------------------------------------------------------------------/ Rx_C04: CALL RxD_3 ;\Riceve le stringhe di COMANDI dalla SERIALE; CMP AH,00H ;|se il dato Š attendibile (AH=00H) Š lasciato JNZ Rx_C03 ;/in AL altrimenti rimane in attesa di ricezione ;\Il primo carattere da ricevere dal Computer CMP AL,'#' ;|remoto deve essere il prefisso di COMANDI, "#" JNZ Rx_C03 ;/previsto dal protocollo ;---------------------------------------------------------------------- Rx_C06: CALL RxD_3 ;\Se il prefisso Š arrivato la prossima lettura CMP AH,00H ;|deve essere una delle lettere previste dal JNZ Rx_C06 ;|protocollo, da "A" a "U"; se il dato Š atten- ;/dibile (AH=00H) la lettera Š lasciata in AL ;---------------------------------------------------------------------- AND AL,11011111B ;\Controlla se il carattere ricevuto corrisponde CMP AL,'U' ;|ad un COMANDO ammesso (A, B, C,...) JG Rx_C07 ;|/--------------------------------------------\ CMP AL,'A' ;|| FINORA ammessi: A B C D E F G H I J K L | JGE Rx_C08 ;|| M N O P Q R S T U . . . | ;/\--------------------------------------------/ Rx_C07: CALL ErrCOM ;\Mostra un messaggio di Errore: "COMANDO NON JMP Rx_C03 ;/RICONOSCIUTO" e pone termine alla sessione ; /-------------------------------------------------------------------\ ; 04 | Gestione dei COMANDI senza Parametri | ; \-------------------------------------------------------------------/ ;\ COMANDO "#A ClearScreen Clasico ;| COMANDO "#B DeskTop Classico Rx_C08: CMP AL,'I' ;| COMANDO "#C Fa sparire il cursore JBE Rx_C09 ;| COMANDO "#D Fa tornare il cursore JMP Rx_C18 ;| 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 ;---------------------------------------------------------------------- Rx_C09: CMP AL,'A' ;\Servizio per il COMANDO "#A" JNE Rx_C10 ;/ClearScreen Classico CMP Byte Ptr CS:[StngMod],01;\Se NON Š in atto la ricezione di una Sequenza JNZ Rx_C0_ ;|di Stringhe di COMANDI organizzata dal COMANDO ;/"#Tnn" viene semplicemente pulito lo schermo ;----------------------------------------------- ;\Altrimenti (servizio #A in coda a una Sequenza ;|di Stringhe di COMANDI organizzata dal COMANDO JMP Rx_C02 ;|"#Tnn" il servizio di Clearscreen viene ;|arricchito con il messaggio di attesa: ;/"Computer Remoto Š pronto in attesa di COMANDI" ;----------------------------------------------- Rx_C0_: CALL BIOScls ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;---------------------------------------------------------------------- Rx_C10: CMP AL,'B' ;\Servizio per il COMANDO "#B" JNE Rx_C11 ;/DeskTop Classico CALL DeskCom ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;---------------------------------------------------------------------- Rx_C11: CMP AL,'C' ;\Servizio per il COMANDO "#C" JNE Rx_C12 ;/Fa sparire il cursore CALL Via_Cur ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;---------------------------------------------------------------------- Rx_C12: CMP AL,'D' ;\Servizio per il COMANDO "#D" JNE Rx_C13 ;/Fa tornare il cursore CALL Rip_Cur ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;---------------------------------------------------------------------- Rx_C13: CMP AL,'E' ;\Servizio per il COMANDO "#E" JNE Rx_C14 ;/Cornice del primo tipo CALL Cornice1 ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;---------------------------------------------------------------------- Rx_C14: CMP AL,'F' ;\Servizio per il COMANDO "#F" JNE Rx_C15 ;/Cornice del secondo tipo CALL Cornice2 ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;---------------------------------------------------------------------- Rx_C15: CMP AL,'G' ;\Servizio per il COMANDO "#G" JNE Rx_C16 ;/Cornice del terzo tipo CALL Cornice3 ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;---------------------------------------------------------------------- Rx_C16: CMP AL,'H' ;\Servizio per il COMANDO "#H" JNE Rx_C17 ;/Aspetta Pressione Tasto CALL KEYwait ;\Esegue il servizio richiesto e, al termine, CALL TxD_1 ;|dopo aver trasmesso il codice del Tasto premuto JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;---------------------------------------------------------------------- Rx_C17: CMP AL,'I' ;\Servizio per il COMANDO "#I" JNE Rx_C18 ;/ Fine sequenza COMANDI "#Tnn" ;\Se la ricezione di una Sequenza di Stringhe di ;|COMANDI, organizzata dal COMANDO "#Tnn", si ;|ritiene ultimata, bisogna forzare la variabile MOV Byte Ptr CS:[StngMod],00;|[StngMod] a 0 per consentire alla "Rx_Cmd" di ;|tornare a consultare la tastiera, consentendo ;/in ogni momento di porre termine alla ricezion JMP Rx_C04 ; Torna in attesa di ricezione di altri COMANDI ; /-------------------------------------------------------------------\ ; 05 | Gestione del COMANDO Colore con 2 Parametri di tipo Ascii Numerico| ; \-------------------------------------------------------------------/ Rx_C18: CMP AL,'J' ;\ COMANDO #Jnn" Ritardo programmabile JNE Rx_C22 ;| \*---numero n=01ö99 ;/ 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 Rx_C19: CALL RxD_3 ;\Il COMANDO "J" prevede la ricezione di 2 CMP AH,00H ;|PARAMETRI NUMERICI; quando il dato Š JNZ Rx_C19 ;|attendibile (AH=0H) il valore Š lasciato in AL CMP AL,'9' ;|Rimane in attesa della pressione del numero JG Rx_C20 ;|corrispondente alla Costante di Tempo; CMP AL,'0' ;|si tratta di una coppia di caratteri tra JGE Rx_C21 ;/"01" e "99" Rx_C20: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP Rx_C03 ;/RICONOSCIUTO" e pone termine alla sessione Rx_C21: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 4 caratte- INC DI ;|ri ascii numerici, a disposizione del codice LOOP Rx_C19 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO #Jnn" ;/Ritardo programmabile, numero n=01ö99 CALL DelayTx ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ; /-------------------------------------------------------------------\ ; 06 | Gestione del COMANDO GoToXY con 4 Parametri di tipo Ascii Numerico| ; \-------------------------------------------------------------------/ Rx_C22: CMP AL,'K' ;\ COMANDO "#Krrcc" Coordinate di stampa JNE Rx_C26 ;| ||\*--colonna cc=00ö79 ;/ \*-------riga rr=00ö24 ;---------------------------------------------------------------------- ;\Locazioni Deposito per i 4 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/delle coordinate del COMANDO MOV CX,4 Rx_C23: CALL RxD_3 ;\Il COMANDO "K" prevede la ricezione di 4 CMP AH,00H ;|PARAMETRI NUMERICI; quando il dato Š attendi- JNZ Rx_C23 ;|bile (AH=0H) il numero Š lasciato in AL CMP AL,'9' ;|Rimane in attesa dei numeri corrispondenti ai JG Rx_C24 ;|Parametri Riga e Colonna desiderati; si tratta CMP AL,'0' ;|di 2 coppie di numeri, la prima da 00 a 24 e JGE Rx_C25 ;/la seconda da 00 a 79 Rx_C24: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP Rx_C03 ;/RICONOSCIUTO" e pone termine alla sessione ;---------------------------------------------------------------------- Rx_C25: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 4 caratte- INC DI ;|ri ascii numerici, a disposizione del codice LOOP Rx_C23 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Krrcc" ;/Coordinate di stampa, rr=00ö24, cc=00ö79 CALL GoToXY ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ; /-------------------------------------------------------------------\ ; 07 | Gestione del COMANDO Colore con 3 Parametri di tipo Ascii Numerico| ; \-------------------------------------------------------------------/ Rx_C26: CMP AL,'L' ;\ COMANDO "#Lpps" Colore testo sfondo JNE Rx_C30 ;| ||\--sfondo s=0ö7 ;/ \*---primo piano pp=00ö15 ;---------------------------------------------------------------------- ;\Locazioni Deposito per i 3 caratteri ascii LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/delle coordinate del COMANDO MOV CX,3 Rx_C27: CALL RxD_3 ;\Il COMANDO "L" prevede la ricezione di 3 CMP AH,00H ;|PARAMETRI NUMERICI; quando il dato Š attendi- JNZ Rx_C27 ;|bile (AH=0H) il numero Š lasciato in AL CMP AL,'9' ;|Rimane in attesa dei numeri corrispondenti ai JG Rx_C28 ;|Parametri Colore Primo Piano e Colore Sfondo CMP AL,'0' ;|desiderati; si tratta di 3 numeri, la coppia JGE Rx_C29 ;/da 00 a 15 e un valore da 0 a 7 Rx_C28: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP Rx_C03 ;/RICONOSCIUTO" e pone termine alla sessione ;---------------------------------------------------------------------- Rx_C29: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 4 caratte- INC DI ;|ri ascii numerici, a disposizione del codice LOOP Rx_C27 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Lpps" ;/Colore primo piano pp=00ö15 sfondo s=0ö7 CALL Colore ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ; /-------------------------------------------------------------------\ ; 08 | Gestione dei COMANDI con un solo Parametro di tipo Ascii Numerico | ; \-------------------------------------------------------------------/ Rx_C30: CMP AL,'M' ;\ JE Rx_C31 ;| COMANDO "#Mn", Intestazione personalizzata CMP AL,'N' ;| COMANDO "#Nn", Menu personalizzato JNE Rx_C36 ;| \---tipo,n=0ö9 ;---------------------------------------------------------------------- Rx_C31: 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 Rx_C32: CALL RxD_3 ;\ CMP AH,00H ;|I COMANDI "M" o "N" prevedono la ricezione di JNZ Rx_C32 ;|un PARAMETRO NUMERICO, da "0" a "9"; se il CMP AL,'9' ;|dato Š attendibile (AH=0H) il numero Š JG Rx_C33 ;|lasciato in AL e si provvede a controlle se CMP AL,'0' ;|corrisponde ad uno di quello attesi JGE Rx_C34 ;/ Rx_C33: POP AX ;\Mostra un messaggio di Errore: "PARAMETRO NON CALL ErrPAR ;|RICONOSCIUTO" e pone termine alla sessione JMP Rx_C03 ;/ ;---------------------------------------------------------------------- Rx_C34: 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 Rx_C35 ;/Intestazione personalizzata tipo,n=0ö9 CALL Intesta ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;---------------------------------------------------------------------- Rx_C35: CMP AL,'N' ;\Servizio per il COMANDO "#Nn" JNE Rx_C36 ;/Menu personalizzato tipo,n=0ö9 CALL MenuCom ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ; /-------------------------------------------------------------------\ ; 09 | Gestione dei COMANDI con un solo Parametro tipo Ascii Esadecimale | ; \-------------------------------------------------------------------/ Rx_C36: CMP AL,'O' ;\ COMANDO "#Oxy" OUT Dato a 8 bit su LPT1 JNE Rx_C41 ;| \----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 Rx_C37: CALL RxD_3 ;\Il COMANDO "O" prevede la ricezione di 2 CMP AH,00H ;|PARAMETRI ALFANUMERICI; quando il dato Š JNZ Rx_C37 ;|attendibile (AH=0H) il valore Š lasciato in AL CMP AL,'9' ;|Rimane in attesa della pressione del numero JG Rx_C39 ;|corrispondente al Tipo di Comando desiderato; CMP AL,'0' ;|si tratta di una coppia di caratteri tra JGE Rx_C40 ;/"0" e "9" e tra "A" e "F" Rx_C38: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP Rx_C03 ;/RICONOSCIUTO" e pone termine alla sessione Rx_C39: AND AL,11011111B ;| CMP AL,'F' ;| JG Rx_C38 ;| CMP AL,'A' ;| JB Rx_C38 ;| ;---------------------------------------------------------------------- Rx_C40: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 4 caratte- INC DI ;|ri ascii numerici, a disposizione del codice LOOP Rx_C37 ;/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 Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ; /-------------------------------------------------------------------\ ; 10 | Gestione dei COMANDI con un solo Parametro di tipo Binario a 8 Bit| ; \-------------------------------------------------------------------/ Rx_C41: CMP AL,'P' ;\ COMANDO "#Pxy" visualizzazione di Byte JNE Rx_C43 ;| \-----valore binario a 8 bit xyH ;/ ;---------------------------------------------------------------------- Rx_C42: CALL RxD_3 ;\Il COMANDO "P" prevede la ricezione di un CMP AH,00H ;|PARAMETRO BINARIO; quando il dato Š attendibi- JNZ Rx_C42 ;/le (AH=0H) il valore a 8 bit Š lasciato in AL ;---------------------------------------------------------------------- ;\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 Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ; /-------------------------------------------------------------------\ ; 11 | Gestione dei COMANDI con un solo Parametro di tipo Binario a 16bit| ; \-------------------------------------------------------------------/ Rx_C43: CMP AL,'Q' ;\ COMANDO #Qxywz Visualizzazione di Word JNE Rx_C46 ;| \----valore binario a 16bit xywzH ;/ ;---------------------------------------------------------------------- Rx_C44: CALL RxD_3 ;\Il COMANDO "Q" prevede la ricezione di un CMP AH,00H ;|PARAMETRO BINARIO; quando il dato Š attendibi- JNZ Rx_C44 ;/le (AH=0H) il valore a 8 bit Š lasciato in AL MOV BH,AL ; Salva in BH la parte alta della word xywzH Rx_C45: CALL RxD_3 ;\ CMP AH,00H ;|Assume anche la parte bassa della word xywzH JNZ Rx_C45 ;/ 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 Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ; /-------------------------------------------------------------------\ ; 12 | Gestione dei COMANDI con 13 Parametri di tipo Ascii Numerico | ; \-------------------------------------------------------------------/ ;\ COMANDO #Raallrrcctopps Stampa una cornice ;| ||||||||||||\--colore sfondo ;| ||||||||||\*---colore primo piano Rx_C46: CMP AL,'R' ;| |||||||||\-----ombra JNE Rx_C50 ;| ||||||||\------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 Rx_C47: CALL RxD_3 ;\Il COMANDO "R" prevede la ricezione di 13 CMP AH,00H ;|PARAMETRI NUMERICI; quando il dato Š attendi- JNZ Rx_C47 ;|bile (AH=0H) il numero Š lasciato in AL CMP AL,'9' ;|Rimane in attesa dei numeri corrispondenti a: JG Rx_C48 ;|03ö25 altezza compresa cornice CMP AL,'0' ;|03ö80 larghezza compresa cornice JGE Rx_C49 ;|00ö24 riga angolo in alto a sinistra ;|00ö79 colonna angolo in alto a sinistra ;| 0ö1 tipo 0=tratto semplice; 1=tratto doppio ;| 0ö1 ombra 0=senza; 1=con ombreggiatura ;|00ö15 colore della cornice ;/ 0ö7 colore dello sfondo Rx_C48: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP Rx_C03 ;/RICONOSCIUTO" e pone termine alla sessione ;---------------------------------------------------------------------- Rx_C49: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito i 13 carat- INC DI ;|teri ascii numerici, a disposizione del codice LOOP Rx_C47 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Raallrrcctopps" ;/Stampa di Cornice CALL CornCom ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ; /-------------------------------------------------------------------\ ; 13 | Gestione dei COMANDI con Parametro di tipo Stringa Ascii | ; \-------------------------------------------------------------------/ Rx_C50: CMP AL,'S' ;\ COMANDO "#Sa..a",0DH stampa Stringa Ascii JNE Rx_C53 ;| |||| \---carattere terminatore ;/ \***-------caratteri ascii ;---------------------------------------------------------------------- Rx_C51: CALL RxD_3 ;\Il COMANDO "S" prevede la ricezione di alcuni CMP AH,00H ;|CARATTERI alfanumerici; se il carattere Š JNZ Rx_C51 ;|attendibile (AH=0H) Š lasciato in AL CMP AL,Invio ;|Ciascun carattere Š posto a video in sequenza, JNZ Rx_C52 ;|nella posizione di stampa corrente, fino alla JMP Rx_C03 ;|ricezione del byte 0DH (Invio) ricevuto il Rx_C52: CALL BIOchr1 ;|quale torna in attesa di ricezione di altri JMP SHORT Rx_C51 ;/COMANDI ; /-------------------------------------------------------------------\ ; 14 | Gestione dei COMANDI con due Parametri di tipo Ascii Numerico | ; \-------------------------------------------------------------------/ Rx_C53: CMP AL,'T' ;\ COMANDO "#Tnn" Sequenza di COMANDI JNE Rx_C54 ;/ \*----Codice Sequenza nn=00ö99 ;---------------------------------------------------------------------- ;\Quando si da' inizio alla ricezione di una ;|Sequenza di Stringhe di COMANDI (per effetto ;|di questo COMANDO "#Tnn") bisogna forzare la MOV Byte Ptr CS:[StngMod],01;|variabile [StngMod] a 1 per evitare alla ;|"Rx_Cmd" di consultare la tastiera, al fine di ;/ridurre al minimo ogni perdita di tempo JMP Rx_C04 ; Esegue la sequenza di COMANDI ; /-------------------------------------------------------------------\ ; 15 | Gestione dei COMANDI con 8 Parametri di tipo Ascii Numerico | ; \-------------------------------------------------------------------/ ;\ COMANDO #Uaallrrcc Recupera una cornice Rx_C54: CMP AL,'U' ;| ||||||\*-------colonna angolo alto JE Rx_C55 ;| ||||\*---------riga angolo alto JMP Rx_C03 ;| ||\*-----------larghezza ;/ \*-------------altezza ;---------------------------------------------------------------------- ;\Locazioni Deposito per gli 8 caratteri ascii Rx_C55: LEA DI,DepoPar ;|numerici digitati in fase di acquisizione ;/relativi al numero d'ordine del COMANDO MOV CX,8 ;\Il COMANDO "U" prevede la ricezione di 8 Rx_C56: CALL RxD_3 ;|PARAMETRI NUMERICI; quando il dato Š attendi- CMP AH,00H ;|bile (AH=0H) il numero Š lasciato in AL JNZ Rx_C56 ;|Rimane in attesa dei numeri corrispondenti a: CMP AL,'9' ;|03ö25 altezza compresa cornice JG Rx_C57 ;|03ö80 larghezza compresa cornice CMP AL,'0' ;|00ö24 riga angolo in alto a sinistra JGE Rx_C58 ;/00ö79 colonna angolo in alto a sinistra Rx_C57: CALL ErrPAR ;\Mostra un messaggio di Errore: "PARAMETRO NON JMP Rx_C03 ;/RICONOSCIUTO" e pone termine alla sessione ;---------------------------------------------------------------------- Rx_C58: MOV CS:[DI],AL ;\Salva nelle locazioni di deposito gli 8 carat- INC DI ;|teri ascii numerici, a disposizione del codice LOOP Rx_C56 ;/chiamato ad espletare il servizio ;---------------------------------------------------------------------- ;\Servizio per il COMANDO "#Uaallrrcc" ;/Recupera una Cornice CALL RecpCom ;\Esegue il servizio richiesto e, al termine, JMP Rx_C03 ;/torna in attesa di ricezione di altri COMANDI ;***************************************************************************** ; ---------------------------------------------- TxR_Srvr proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- ;/---------------------------------[Inizializza il PROTOCOLLO per il Test]---\ MOV Byte Ptr CS:[depPOR],COM_num;\Per cambiare PORTA utilizzata, Velocit… | MOV Word Ptr CS:[DepVEL],Baude ;|di ricetrasmissione e Protocollo Seriale | MOV Byte Ptr CS:[DepTIP],Protoc ;/cambia le costanti all'inizio del codice | ;\---------------------------------------------------------------------------/ ;\Inizializza i Registri della porta seriale in ;|accordo con i parametri di protocollo deside- CALL INIserial ;|rati (velocit… di linea, numero bit di dato ;|e di stop, tipo di parit…) e in funzione della ;|porta COMx desiderata (default COM1) ;|NB: lascia in uscita SI=0000H se la porta ;/ desiderata NON Š presente nel sistema ;\Predispone il Piano di Lavoro e inizializza le ;|Variabili necessarie per il Programma Seriale CALL DeskTop ;|NB: se il valore ricevuto in ingresso in SI Š ;|0 la porta seriale desiderata NON Š presente ;|nel sistema e la procedura impone automatica- ;/mente il rientro al DOS (a livello _OUT) ;\Aspetta che il computer remoto sia collegato, ;|continuando, nell'attesa, a trasmettere il CALL Sincro ;|carattere 0AAH,scelto per esprimere la propria ;/disponibilit… a ricevere. ;\/--------------------------------------------\ CALL Rx_Cmd ;|| ATTIVA LA FASE DI RICEZIONE COMANDI | ;/\--------------------------------------------/ _OUT: CALL DESK_3 PUSH AX ; /--------------------------------------------\ M_COLOR 07H ; | FASE STANDARD D'USCITA DAL PROGRAMMA | MOV DH,24 ; \--------------------------------------------/ CALL BARRA ; MOV DH,0 ; Pulisce la prima e l'ultima riga del monitor CALL BARRA ; (di solito assegnate al Titolo e al Menu) CALL RIP_cur ; e fissa il cursore sull'ultima; con questo MOV DH,23 ; artificio al termine del programma il "prompt" MOV DL,0 ; cade nel punto ottimale, senza inquinare CALL SET_cur ; l'immagine in uscita,ovviamente ancora a video POP AX ; ; Torna al DOS liberando la memoria usata dal ; programma, restituendo il controllo al proces- ; so padre (generalmente COMMAND.COM); il valore MOV AH,4CH ; posto eventualmente in AL prima di uscire pu• INT 21H ; essere testato a livello DOS con la funzione ; 4DH o mediante la lettura della variabile DOS ; "ERRORLEVEL" TxR_Srvr ENDP _prog ENDS END INIZIO