PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (febbraio 2005) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : TxR_Chat.ASM /----------------[TxD][RxD]------------------\| ;| AUTORE : Giorgio OBER | ************ *********** ************** || ;| VERSIONE : febbraio 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). | ;| a) versione con presentazione (DESKTOP) | ;| b) il processo Š gestito da tastiera con diversi livelli di | ;| menu interattivi; Š possibile mostrare i dati trasmessi e| ;| ricevuti sia in forma solo ascii sia contemporaneamente | ;| in forma ascii e forma binaria espressa in esadecimale. | ;| c) in Trasmissione aspetta la digitazione di un tasto e poi| ;| ne spedisce il codice ascii | ;| e) in Ricezione NON opera alcun controllo sugli Errori | ;| f) la Ricezione Š alternata alla Trasmissione | ;| g) il protocollo HW impostato per la RICETRASMISSIONE Š: | ;| /--------------------------------\ | ;| | COM1, 9600, N, 2, 8 | | ;| \--------------------------------/ | ;| Questa versione Š specializzata per garantire lo scambio di| ;| testi ("Chat") tra 2 Computer collegati via seriale, sui| ;| ciascuno dei quali Š fatta ovviamente girare una copia di| ;| questo eseguibile. | ;|/-----------\/------------------------------------------------------------\| ;|| ||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 F3 EQU 3DH ;codice Scansione tasto F4 EQU 3EH ;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 KEYwait:NEAR EXTRN Byt2Asc:NEAR EXTRN Wor2Dec:NEAR EXTRN RamCorn:NEAR EXTRN RamRecup: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 TxR_Chat ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP TxR_Chat ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 00H Titolo DB "Programmi per il Collaudo della Porta Seriale ",00H Titolo1 DB "COM",00H Tema0 DB "TxR_Chat-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 Nocom0 DB "La PORTA SERIALE desiderata, COM , ",00H Nocom1 DB "non Š",00H Nocom2 DB " disponibile",00H Centro1 DB "Caratteri Ascii Trasmessi",00H Centro2 DB "Caratteri Ascii Ricevuti",00H Centro3 DB "Bytes Trasmessi",00H Centro4 DB "Bytes Ricevuti",00H MENU01 DB "Inizia",00H MENU02 DB "Quit",00H MENU03 DB "ESC ",00H MENU04 DB " Risincronizza ",00H MENU05 DB "Aiuto",00H BytTxRx DB "[ ",00H Vuota01 DB " " Vuota02 DB " ",00H ;-------------------------------------------------------------------- Note_ DB "Questo eseguibile, ~TxR_Chat.COM~, deve essere in esecuzione",00H DB "su entrambi i Computer coinvolti nella comunicazione seriale.",00H DB " ",00H DB "Non appena si preme il tasto ~Inizia~ ciascuno dei 2 rimane",00H DB "in attesa della presenza in linea dell'altro e quando questo",00H DB "accade Š subito possibile scambiare simultaneamente messaggi.",00H DB " ",00H DB "In caso di caduta del collegamento Š prevista la possibilit…",00H DB "di una risincronizzazione.",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 "Visualizzazione Dati: F1 solo Ascii F2 Ascii & Bytes",00H Testo06 DB "F1",00H Testo07 DB "F2",00H Testo08 DB "F3",00H Testo09 DB "F4",00H Cmd00 DB "Digita 0 per Clearscreen",00H Cmd01 DB "Digita 1 per GotoXY",00H Cmd02 DB "Digita 2 per Colore",00H Cmd03 DB "Digita 3 per Write",00H Cmd__ DB "[Premi un tasto per chiudere]",00H ;-------------------------------------------------------------------- DepoMod DB 00H ;[DepoMod]=00 con "T" Computer locale in Trasmissione ;[DepoMod]=01 con "R" Computer locale in Ricezione PrntMod DB 00H ;[PrntMod]=00 mostra solo il valore ascii (default) ;[PrntMod]=01 mostra anche il valore esadecimale ;-------------------------------------------------------------------- NumRxD DW 0001H ; Numero di Bytes ricevuti DataRxD DB 00H RigRxDa DB 14 ;\Predispone la riga e la colonna di stampa corrente per ColRxDa DB 1 ;|i caratteri RxD AtrRxDa DB 0FH ;/Colore da usare nella stampa dei caratteri RxD RigRxDb DB 20 ;\Predispone la riga e la colonna di stampa corrente per ColRxDb DB 1 ;|i bytes RxD AtrRxDb DB 0FH ;/Colore da usare nella stampa dei bytes RxD NumTxD DW 0001H ; Numero di Bytes trasmessi DataTxD DB 00H ; Primo Carattere da trasmettere (ascii 00) RigTxDa DB 2 ;\Predispone la riga e la colonna di stampa corrente per ColTxDa DB 1 ;|i caratteri TxD AtrTxDa DB 0FH ;/Colore da usare nella stampa dei caratteri TxD RigTxDb DB 8 ;\Predispone la riga e la colonna di stampa corrente per ColTxDb DB 1 ;|i bytes TxD AtrTxDb DB 0FH ;/Colore da usare nella stampa dei bytes TxD ;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 COMx - ADD AL,30H ;| protocollo HW: 9600,N,2,8" M_Chr AL,12,47,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 MENU05,24,16,70H;|\--------------------------------------------/ M_Chr 'A',24,16,74H ;| DESK_1: CALL KEYwait ;| AND AL,11011111B ;|Rimane in attesa dei tasti del Menu principale CMP AL,'I' ;| con "I" inizia il Test JZ DESK_2 ;| CMP AL,'A' ;| con "A" Aiuto JZ Note ;| CMP AL,'Q' ;| con "Q" torna al DOS JNZ DESK_1 ;| JMP _OUT ;/ ;--------------------------------------------------------------------- ;/---------------------------------------------\ ;| Descrive il funzionamento del programma. | ;\---------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva Note: M_corn 11 , 64 , 7 , 7 , 31H , 01 , 01 ,2000H LEA SI,Note_ M_COLOR 3FH MOV CX,9 MOV DH,8 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 11 , 64 , 7 , 7 ,2000H JMP SHORT DESK_1 ;--------------------------------------------------------------------- DESK_2:M_msgC Testo05,24,7,70H;\/--------------------------------------------\ M_msgC Testo06,24,30,74H;||*********** Secondo Menu interno ***********| M_msgC Testo07,24,45,74H;|\--------------------------------------------/ DESK_3: CALL KeyWait ;|Rimane in attesa dei tasti del Menu principale AND AL,11011111B ;| CMP AL,'Q' ;| con "Q" torna al DOS JNZ DESK_4 ;| JMP _OUT ;| DESK_4: CMP AL,00H ;| JNZ DESK_3 ;| CMP AH,F1 ;| Gestione tasto : solo Ascii JNZ DESK_5 ;| MOV Byte Ptr CS:[PrntMod],00;| Stampa dei dati solo in Ascii JMP SHORT DESK_7 ;| DESK_5: CMP AH,F2 ;| Gestione tasto : Ascii & Bytes JNZ DESK_3 ;| MOV Byte Ptr CS:[PrntMod],01;| Stampa dei dati in Asci e Esadecimale ;JMP SHORT DESK_7 ;/ DESK_6: CALL DESK___ ;\Predispone il Piano di lavoro su tavola ;/zigrinata con Intestazione e primo Menu DESK_7: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;/ ;--------------------------------------------------------------------- ;/---------------------------------------------\ ;|Inizializza le variabili - Test Seriale| ;\---------------------------------------------/ MOV Word Ptr CS:[NumRxD],01; Numero di Bytes Ricevuti MOV Byte Ptr CS:[DataTxD],00; Primo Carattere da trasmettere (ascii 00) MOV Byte Ptr CS:[RigRxDa],14;\Predispone la riga e la colonna di stampa cor- MOV Byte Ptr CS:[ColRxDa],01;|rente per i caratteri RxD MOV Byte Ptr CS:[RigRxDb],20;|Predispone la riga e la colonna di stampa cor- MOV Byte Ptr CS:[ColRxDb],01;|rente per i bytes RxD MOV Byte Ptr CS:[AtrRxDb],0FH;/Colore da usare nella stampa dei caratteri RxD MOV Word Ptr CS:[NumTxD],01; Numero di Bytes Trasmessi MOV Byte Ptr CS:[RigTxDa],02;\Predispone la riga e la colonna di stampa cor- MOV Byte Ptr CS:[ColTxDa],01;|rente per i caratteri TxD MOV Byte Ptr CS:[RigTxDb],08;|Predispone la riga e la colonna di stampa cor- MOV Byte Ptr CS:[ColTxDb],01;|rente per i bytes TxD MOV Byte Ptr CS:[AtrTxDb],0FH;/Colore da usare nella stampa dei caratteri TxD RET ;--------------------------------------------------------------------- ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva DESK_8: M_corn 3 , 69 , 3 , 5 , 4CH , 01 , 01 ,1000H M_msgC Testo03,4,13,4FH; "Il Computer Remoto non risponde - RET ; RICEZIONE terminata" ;--------------------------------------------------------------------- ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva DESK_9: 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 Vuota02,24,70,70H CALL Del_1000 CALL Del_2000 M_msgC MENU03,24,70,74H;\"ESC" M_msgC Testo06,24,7,74H;|"F1" M_COLOR 70H ;| M_msgN MENU04 ;|" Risincronizza" M_COLOR 74H ;/ RET ;--------------------------------------------------------------------- DESK_A: CALL BIOScls ;\/--------------------------------------------\ ;||***** Messaggio di commiato in USCITA ***** | ;*\--------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 5 , 69 , 11 , 5 , 1EH , 01 , 01 ,1000H M_msgC Tema0,12, 7,1FH;\ Messaggio di chiusura M_msgC Tema2,14, 9,1FH;/ RET CALL FraseTxR ;/---------------------------------------------------------------------------\ ;|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 | x | x | x | x | x | 1 | 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 : Campi | ;| DESCRIZIONE : Predispone i 2 riquadri di Ricetrasmissione DATI | ;\---------------------------------------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva Campi: M_corn 11 , 80 , 1 , 0 , 0AH , 00 , 00 ,2000H M_Chr '[', 1, 7,0AH ;\ M_COLOR 0AH ;| Primo campo: M_msgN Centro1 ;| [Caratteri Ascii TRASMESSI] MOV AL,']' ;| CALL BIOchr1 ;/ CMP Byte Ptr CS:[PrntMod],00;\Mostra solo il valore ascii (default) del dato JZ Campi1 ;|Trasmesso CALL TxDbyte ;/ Campi1: M_COLOR 70H ;\ MOV DH,12 ;| CALL BARRA ;/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 11 , 80 , 13 , 0 , 0AH , 00 , 00 ,2000H M_Chr '[',13, 7,0AH ;\ M_COLOR 0AH ;| Secondo campo: M_msgN Centro2 ;| [Caratteri Ascii RICEVUTI] MOV AL,']' ;| CALL BIOchr1 ;/ CMP Byte Ptr CS:[PrntMod],00;\Mostra solo il valore ascii (default) del dato JZ Campi2 ;|Ricevuto CALL RxDbyte ;/ Campi2: RET ;---------------------------------------------------------------------- TxDbyte:MOV CX,78 ;\ M_CURSOR 7,1 ;| MOV AL,'-' ;| Primo campo: TxDby1: CALL BIOchr1 ;| linea intermedia LOOP TxDby1 ;| M_Chr '*', 7, 0,0AH ;| M_Chr '*', 7,79,0AH ;/ M_Chr '[', 7, 7,0AH ;\ M_msgN Centro3 ;| Primo campo: MOV AL,']' ;| [Bytes TRASMESSI] CALL BIOchr1 ;/ RET ;---------------------------------------------------------------------- RxDbyte:MOV CX,78 ;\ M_CURSOR 19,1 ;| MOV AL,'-' ;| Secondo campo: RxDby3: CALL BIOchr1 ;| linea intermedia LOOP RxDby3 ;| M_Chr '*',19, 0,0AH ;| M_Chr '*',19,79,0AH ;/ M_Chr '[',19, 7,0AH ;\ M_msgN Centro4 ;| Secondo campo: MOV AL,']' ;| [Bytes RICEVUTI] CALL BIOchr1 ;/ RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : StampaRxD | ;| DESCRIZIONE : Stampa i dati ricevuti dalla porta SERIALE, organizzandoli | ;| in una sola area Caratteri Ascii (default [PrntMod]=00 su 9| ;| righe [RigRxDa] da 14 a 22) o in due aree ridotte, una da 5| ;| righe da 14 a 18 per i caratteri Ascii e una da 3 da 20 a 22| ;| per il corrispondente valore esadecimale (bytes); in ogni| ;| caso la colonna di stampa [ColRxDa] pu• variare da 1 a 79. | ;| Anche il colore [AtrRxDa]/[AtrRxDb] Š gestito dinamicamente.| ;| La gestione del campo Ascii Š operata con scolling del testo| ;| verso l'alto, mentre quella del campo Bytes Š gestita con| ;| sovrapposizione delle informazioni con colori diversi, | ;\---------------------------------------------------------------------------/ StampaRxD: PUSH CX PUSH BX PUSH AX ;--------------------------------------------------------------------- PUSH AX ;\ M_msgC BytTxRx,13,40,0AH;| MOV AX,CS:[NumRxD];| CALL Wor2Dec ;|Stampa e mette a video il numero dei Bytes INC AX ;|ricevuti MOV CS:[NumRxD],AX;| CALL STAsp ;| MOV AL,']' ;| CALL BIOchr1 ;| POP AX ;/ ;---------------------;--[Gestione della Stampa dei Caratteri Ascii]-- MOV BH,AL ; Salva il valore del dato ricevuto corrente MOV DH,CS:[RigRxDa];\Assume la posizione di stampa corrente MOV DL,CS:[ColRxDa];/ MOV CL,CS:[AtrRxDa];\Assume il colore con cui stampare il dato M_COLOR CL ;/ricevuto corrente ;---------------------;--[tasto ]------------------------------ CMP AL,0DH ;\Controlla se il dato ricevuto corrente Š Invio JZ StaRx1 ;/e, in questo caso, evita la stampa a video ;---------------------;--[tasti alfanumerici]------------------------- CALL SET_cur ; Fissa il cursore nella nuova posizione CALL BIOchr1 ;\Mette a video il carattere Ascii del dato ;/ricevuto corrente INC DL ;\Controllo della Colonna corrente: se la stampa CMP DL,79 ;|Š ancora all'interno della cornice, sulla riga JNZ StaRx3 ;/corrente, tutto va bene StaRx1: MOV DL,1 ;\Riporta la colonna di stampa all'interno della INC DH ;/cornice, sulla riga successiva MOV CH,18 ; Riga finale per Ascii con doppia visualizzaz. MOV BL,19 ;\Aggiorna la dimensione del campo di visualiz- CMP Byte Ptr CS:[PrntMod],00;|zazione dei dati ricevuti; per default, nel JNZ StaRx2 ;|caso di sola visualizzazione del valore ascii, ADD BL,4 ;|usa il campo pieno di 9 righe ADD CH,4 ;/Riga finale per visualizzazione SOLO Ascii ;\Controlla se la nuova riga Š essa pure ancora StaRx2: CMP DH,BL ;|all'interno della cornice; se Š cosŤ tutto va JNZ StaRx3 ;/bene PUSH DX ;\Provvede a spostare verso l'alto di una riga i PUSH BX ;|caratteri contenuti nella finestra compresa MOV DH,CH ;|tra l'angolo alto a sinistra (indicato da CH MOV DL,78 ;|riga e CL colonna) e quello in basso a destra MOV CH,14 ;|(inidicato da DH riga e DL colonna); il numero MOV CL,1 ;|di righe su cui Š effettuato lo scrolling dal MOV BH,CS:[AtrRxDa];|basso verso l'alto all'interno della finestra MOV AL,1 ;|Š fornito in AL; l'eventuale testo allocato MOV AH,06H ;|nella riga superiore esce dalla parte alta INT 10H ;|della finestra e viene ovviamente perduto POP BX ;|mentre in basso viene aggiunta una nuova riga POP DX ;|vuota, cioŠ riempita di spazi con colore ;/indicato da BH. DEC DH ;\Le coordinate di stampa sono riportate MOV CL,CS:[AtrRxDa];|nell'angolo in basso a sinistra, sulla riga ;/appena aggiunta dalla procedura di scrolling ;-----[alternativa !! ]-----; versione con sovrapposizione dei caratteri, ; ; invece dello scrolling globale verso l'alto ; MOV DH,14 ;\La cornice Š stata riempita completamente con ; MOV CL,CS:[AtrRxDa];|i caratteri in partenza dalla Seriale; le ; DEC CL ;|coordinate di stampa sono riportate nell'ango- ; CMP CL,0DH ;|lo in alto a sinistra all'interno della corni- ; JNZ StaRx3 ;|ce e, per evidenziare la sovrascrittura, si ; MOV CL,0FH ;|cambia anche il colore di stampa, alternando ;/Bianco Brillante a Giallo,sempre in campo Nero StaRx3: MOV CS:[AtrRxDa],CL; MOV CS:[RigRxDa],DH;\Salva la nuova posizione del cursore MOV CS:[ColRxDa],DL;/ ;----------------------[Gestione della Stampa dei valori Esadecimali]- CMP Byte Ptr CS:[PrntMod],00;\Se il campo di visualizzazione dei dati JZ StaRx5 ;|ricevuti in forma esadecimale NON Š richiesto ;/ignora questa parte di codice MOV AL,BH ; Recupera il valore del dato ricevuto corrente MOV DH,CS:[RigRxDb];\ MOV DL,CS:[ColRxDb];|Fissa il cursore nella nuova posizione CALL SET_cur ;/ MOV CL,CS:[AtrRxDb];\Mette a video il valore esadecimale del M_COLOR CL ;|carattere corrente ricevuto con il colore di CALL Byt2Asc ;/stampa corrente ADD DL,3 ;\Controllo della Colonna corrente: se la stampa CMP DL,79 ;|Š ancora all'interno della cornice, sulla riga JNZ StaRx4 ;/corrente, tutto va bene MOV DL,1 ;\Riporta la colonna di stampa all'interno della INC DH ;/cornice, sulla riga successiva CMP DH,23 ;\Controlla se la nuova riga Š essa pure ancora JNZ StaRx4 ;|all'interno della cornice; se Š cosŤ tutto va ;/bene MOV DH,20 ;\La cornice Š stata riempita completamente con MOV CL,CS:[AtrRxDb];|i caratteri in partenza dalla Seriale; le DEC CL ;|coordinate di stampa sono riportate nell'ango- CMP CL,0DH ;|lo in alto a sinistra all'interno della corni- JNZ StaRx4 ;|ce e, per evidenziare la sovrascrittura, si MOV CL,0FH ;|cambia anche il colore di stampa, alternando StaRx4: MOV CS:[AtrRxDb],CL;/Bianco Brillante a Giallo,sempre in campo Nero MOV CS:[RigRxDb],DH;\Aggiorna il valore corrente del cursore bytes MOV CS:[ColRxDb],DL;/ StaRx5: MOV DH,CS:[RigRxDa];\ MOV DL,CS:[ColRxDa];|Fissa il cursore nella nuova posizione CALL SET_cur ;/ POP AX POP BX POP CX RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : StampaTxD | ;| DESCRIZIONE : Stampa i dati trasmessi dalla porta SERIALE, organizzandoli | ;| in una sola area Caratteri Ascii (default [PrntMod]=00 su 9| ;| righe [RigTxDa] da 2 a 11) o in due aree ridotte, una da 5| ;| righe da 2 a 6, per i caratteri Ascii e una da 3 da 8 a 10| ;| per il corrispondente valore esadecimale (bytes); in ogni| ;| caso la colonna di stampa [ColTxDa] pu• variare da 1 a 79. | ;| Anche il colore [AtrTxDa]/[AtrTxDb] Š gestito dinamicamente.| ;| La gestione del campo Ascii Š operata con scolling del testo| ;| verso l'alto, mentre quella del campo Bytes Š gestita con| ;| sovrapposizione delle informazioni con colori diversi, | ;\---------------------------------------------------------------------------/ StampaTxD: PUSH CX PUSH BX PUSH AX ;--------------------------------------------------------------------- PUSH AX ;\ M_msgC BytTxRx,1,40,0AH;| MOV AX,CS:[NumTxD];| CALL Wor2Dec ;|Stampa e mette a video il numero dei Bytes INC AX ;|trasmessi MOV CS:[NumTxD],AX;| CALL STAsp ;| MOV AL,']' ;| CALL BIOchr1 ;| POP AX ;/ ;---------------------;--[Gestione della Stampa dei Caratteri Ascii]-- MOV BH,AL ; Salva il valore del dato trasmesso corrente MOV DH,CS:[RigTxDa];\Assume la posizione di stampa corrente MOV DL,CS:[ColTxDa];/ MOV CL,CS:[AtrTxDa];\Assume il colore con cui stampare il dato M_COLOR CL ;/trasmesso corrente ;---------------------;--[tasto ]------------------------------ CMP AL,0DH ;\Controlla se il dato trasmesso corrente Š Invio JZ StaTx1 ;/e, in questo caso, evita la stampa a video ;---------------------;--[tasti alfanumerici]------------------------- CALL SET_cur ; Fissa il cursore nella nuova posizione CALL BIOchr1 ;\Mette a video il carattere Ascii del dato ;/trasmesso corrente INC DL ;\Controllo della Colonna corrente: se la stampa CMP DL,79 ;|Š ancora all'interno della cornice, sulla riga JNZ StaTx3 ;/corrente, tutto va bene StaTx1: MOV DL,1 ;\Riporta la colonna di stampa all'interno della INC DH ;/cornice, sulla riga successiva MOV CH,6 ; Riga finale per Ascii con doppia visualizzaz. MOV BL,7 ;\Aggiorna la dimensione del campo di visualiz- CMP Byte Ptr CS:[PrntMod],00;|zazione dei dati trasmessi; per default, nel JNZ StaTx2 ;|caso di sola visualizzazione del valore ascii, ADD BL,4 ;|usa il campo pieno di 9 righe ADD CH,4 ;/Riga finale per visualizzazione SOLO Ascii ;\Controlla se la nuova riga Š essa pure ancora StaTx2: CMP DH,BL ;|all'interno della cornice; se Š cosŤ tutto va JNZ StaTx3 ;/bene PUSH DX ;\Provvede a spostare verso l'alto di una riga i PUSH BX ;|caratteri contenuti nella finestra compresa MOV DH,CH ;|tra l'angolo alto a sinistra (indicato da CH MOV DL,78 ;|riga e CL colonna) e quello in basso a destra MOV CH,2 ;|(inidicato da DH riga e DL colonna); il numero MOV CL,1 ;|di righe su cui Š effettuato lo scrolling dal MOV BH,CS:[AtrTxDa];|basso verso l'alto all'interno della finestra MOV AL,1 ;|Š fornito in AL; l'eventuale testo allocato MOV AH,06H ;|nella riga superiore esce dalla parte alta INT 10H ;|della finestra e viene ovviamente perduto POP BX ;|mentre in basso viene aggiunta una nuova riga POP DX ;|vuota, cioŠ riempita di spazi con colore ;/indicato da BH. DEC DH ;\Le coordinate di stampa sono riportate MOV CL,CS:[AtrTxDa];|nell'angolo in basso a sinistra, sulla riga ;/appena aggiunta dalla procedura di scrolling ;-----[alternativa !! ]-----; versione con sovrapposizione dei caratteri, ; ; invece dello scrollong globale verso l'alto ; MOV DH,2 ;\La cornice Š stata riempita completamente con ; MOV CL,CS:[AtrTxDa];|i caratteri in partenza dalla Seriale; le ; DEC CL ;|coordinate di stampa sono riportate nell'ango- ; CMP CL,0DH ;|lo in alto a sinistra all'interno della corni- ; JNZ StaTx3 ;|ce e, per evidenziare la sovrascrittura, si ; MOV CL,0FH ;|cambia anche il colore di stampa, alternando ;/Bianco Brillante a Giallo,sempre in campo Nero StaTx3: MOV CS:[AtrTxDa],CL; Salva il colore corrente MOV CS:[RigTxDa],DH;\Salva la nuova posizione del cursore MOV CS:[ColTxDa],DL;/ ;----------------------[Gestione della Stampa dei valori Esadecimali]- CMP Byte Ptr CS:[PrntMod],00;\Se il campo di visualizzazione dei dati JZ StaTx5 ;|trasmessi in forma esadecimale NON Š richiesto ;/ignora questa parte di codice MOV AL,BH ; Recupera il valore del dato trasmesso corrente MOV DH,CS:[RigTxDb];\ MOV DL,CS:[ColTxDb];|Fissa il cursore nella nuova posizione CALL SET_cur ;/ MOV CL,CS:[AtrTxDb];\Mette a video il valore esadecimale del M_COLOR CL ;|carattere corrente trasmesso con il colore di CALL Byt2Asc ;/stampa corrente ADD DL,3 ;\Controllo della Colonna corrente: se la stampa CMP DL,79 ;|Š ancora all'interno della cornice, sulla riga JNZ StaTx4 ;/corrente, tutto va bene MOV DL,1 ;\Riporta la colonna di stampa all'interno della INC DH ;/cornice, sulla riga successiva CMP DH,11 ;\Controlla se la nuova riga Š essa pure ancora JNZ StaTx4 ;|all'interno della cornice; se Š cosŤ tutto va ;/bene MOV DH,8 ;\La cornice Š stata riempita completamente con MOV CL,CS:[AtrTxDb];|i caratteri in partenza dalla Seriale; le DEC CL ;|coordinate di stampa sono riportate nell'ango- CMP CL,0DH ;|lo in alto a sinistra all'interno della corni- JNZ StaTx4 ;|ce e, per evidenziare la sovrascrittura, si MOV CL,0FH ;|cambia anche il colore di stampa, alternando StaTx4: MOV CS:[AtrTxDb],CL;/Bianco Brillante a Giallo,sempre in campo Nero MOV CS:[RigTxDb],DH;\Aggiorna il valore corrente del cursore bytes MOV CS:[ColTxDb],DL;/ StaTx5: MOV DH,CS:[RigTxDa];\ MOV DL,CS:[ColTxDa];|Fissa il cursore nella nuova posizione CALL SET_cur ;/ POP AX POP BX POP CX 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 Sincr1 ;/ ;\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 CALL DESK_8 ;\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) ;--------------------------------------------------------------------- Sincr1: CALL DESK_9 ;"Computer Remoto in linea - CALL Campi ;Predispone i 2 riquadri di Ricetrasmissione RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : FraseTxR ************* PRIMA VERSIONE ******************* | ;| DESCRIZIONE : Gestisce la normale ricetrasmissione di stringhe Ascii| ;| ("Chat") mostrando a video le frasi in partenza e quelle in| ;| arrivo in campi diversi. | ;| In ogni momento, premendo il tasto F1, si pu• annullare la| ;| sessione di ricetrasmissione (magari per cambiare modalit…| ;| di visualizzazione dei dati ricetrasmessi) chiedendo una| ;| Risincronizzazione con il computer remoto. | ;| La procedura ha termine con la pressione di . | ;\---------------------------------------------------------------------------/ FraseTxR:MOV DH,CS:[RigTxDa];\ MOV DL,CS:[ColTxDa];|Assume la riga e la colonna corrente e vi CALL SET_cur ;|fissa il cursore CALL RIP_Cur ;/ ;\Controlla la pressione di tasti SENZA FERMARSI Frase0: MOV AH,01H ;|per garantire la trasmissione di dati; se NON INT 16H ;|Š stato premuto alcun tasto (ffZ="1") continua JZ Frase2 ;/verificando se Š pronto un dato in Ricezione CALL KeyWait ; Altrimenti analizza il codice tasto premuto CMP AL,ESC_ ;\ con si termina la sessione di Rice- JZ Frase3 ;/ trasmissione CMP AL,00H ;\Servizio tasti funzionali, F1, F2, ...; se non JNZ Frase1 ;|si tratta di essi si provvede alla stampa CMP AH,F1 ;\Servizio tasto : Risincronizzazione JNZ Frase1 ;/ ;----------------------;\Servizio di Risincronizzazione: se uno dei 2 ;|computer perde il collegamento Š possibile ;/ripristinarlo ;M_corn altezza,larghezza,riga,colonna,salva M_recup 7 , 69 , 8 , 5 ,2000H;|Recupera lo spazio M_recup 7 , 69 , 16 , 5 ,2000H;|occupato dai Campi DATI ;\Ripropone ilmessaggio "Sono in attesa di RICE- CALL DESK_6 ;|ZIONE dal Computer Remoto" e reinizializza le ;/variabili del Test Seriale POP AX ;\NB: recupera con POP AX la posizione pendente JMP TxRx01 ;|nello stack dovuta alla chiamata CALL FraseTxR ;/per poter tornare con JMP invece che con "RET" ;---------------------------------------------------------------------- ;\Trasmette ogni altro carattere digitato, Frase1: CALL TxD_1 ;|spedito sulla porta COM1 non appena si presen- ;/tano le condizioni ottimali per la trasmission CALL StampaTxD ; Servizio carattere trasmesso (stampa a video) Frase2: CALL RxD_3 ;\Riceve altri bytes dalla PORTA SERIALE; se il CMP AH,00H ;|dato Š attendibile (AH=00H) Š lasciato in AL, JNZ Frase0 ;|altrimenti rimane in attesa di trasmissione; CMP AL,0AAH ;|se il dati Š buono abortisce eventuali residui JZ Frase0 ;|di ricezione del sincronismo di collegamento CALL StampaRxD ;/(AL=AAH) e stampa ogni altro dato ricevuto JMP Frase0 Frase3: RET ;***************************************************************************** ; ---------------------------------------------- TxR_Chat 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 TxRx01: CALL Sincro ;|carattere 0AAH,scelto per esprimere la propria ;/disponibilit… a ricevere. ;--------------------------------------------------------------------- CALL FraseTxR ;--------------------------------------------------------------------- _OUT: CALL DESK_A PUSH AX ; /--------------------------------------------\ M_COLOR 07H ; | FASE STANDARD D'USCITA DAL PROGRAMMA | MOV DH,24 ; \--------------------------------------------/ CALL BARRA ; MOV DH,0 ; Pulisce la prima e l'ultima riga del monitor CALL BARRA ; (di solito assegnate al Titolo e al Menu) CALL RIP_cur ; e fissa il cursore sull'ultima; con questo MOV DH,23 ; artificio al termine del programma il "prompt" MOV DL,0 ; cade nel punto ottimale, senza inquinare CALL SET_cur ; l'immagine in uscita,ovviamente ancora a video POP AX ; ; Torna al DOS liberando la memoria usata dal ; programma, restituendo il controllo al proces- ; so padre (generalmente COMMAND.COM); il valore MOV AH,4CH ; posto eventualmente in AL prima di uscire pu• INT 21H ; essere testato a livello DOS con la funzione ; 4DH o mediante la lettura della variabile DOS ; "ERRORLEVEL" TxR_Chat ENDP _prog ENDS END INIZIO