PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (dicembre 2004) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : RxD0Com2.ASM /------------------[RxD]---------------------\| ;| AUTORE : Giorgio OBER | ************* Versione 00 ************* || ;| VERSIONE : dicembre 2004 \------------------[COM2]--------------------/| ;| DESCRIZIONE : Organizza la RICEZIONE di DATI dalla porta seriale (UART) | ;| del computer con la tecnica dell'interrogazione (POLLING). | ;|/-----------\/------------------------------------------------------------\| ;|| ||La tecnica di Ricezione (procedura RxD_0) Š sufficientemente|| ;|| ||AFFIDABILE, aspettando le condizioni ottimali per consentire|| ;|| ||la lettura del dato, ma la stampa del carattere ricevuto e|| ;|| ||la verifica della pressione di un tasto (per consentire di|| ;|| NB: ||porre termine all'esecuzione del programma dopo la ricezione|| ;|| ||di un Dato), esercitate nel MAIN PROGRAM, consumano troppo|| ;|| ||tempo e possono causare una INTOLLERABILE perdita di qualche|| ;|| ||byte in arrivo, rendendo INUTILIZZABILE questo programma. || ;|| ||Una Ricezione SICURA deve far riferimento alle Tecniche di|| ;|| ||Interruzione e disporre di un Buffer adeguato (RxD5Com1.ASM)|| ;|\-----------/\------------------------------------------------------------/| ;| a) versione ESSENZIALE, SENZA presentazione (DESKTOP) | ;|/-----------\/------------------------------------------------------------\| ;|| ||* Pu• essere compilata SENZA librerie Giobe.ASM/Giobe.MAC **|| ;|| ||------------------------------------------------------------|| ;|| NB: ||La versione COMPLETA, AMPIAMENTE COMMENTATA e INTERFACCIATA|| ;|| ||con MENU INTERATTIVI, per un migliore controllo del|| ;|| ||programma, Š disponibile con il nome "RxD1Com1.ASM". || ;|\-----------/\------------------------------------------------------------/| ;| b) NON opera alcun controllo in Ricezione | ;| c) in mancanza di DATI in arrivo dalla Porta Seriale la| ;| procedura di RICEZIONE BLOCCA inesorabilmente l'esecuzio-| ;| ne del programma ed impedisce il suo controllo con tasti | ;| d) il protocollo HW impostato per la RICEZIONE SERIALE Š: | ;| /--------------------------------\ | ;| | COM2, 9600, N, 2, 8 | | ;| \--------------------------------/ | ;| e non pu• essere cambiato in modo automatico; Š comunque| ;| disponibile la versione "Rxd0Com1.ASM" per COM1. | ;| | ;|/-----------\ La versione COMPLETA, AMPIAMENTE COMMENTATA e INTERFACCIATA| ;|| NB: | con MENU INTERTTIVI (per un migliore controllo del programma)| ;|\-----------/ Š disponibile con il nome "RxD1Com2.ASM". | ;| -------------------------------------------------------------| ;| Maggiori dettagli sono disponibili nella sezione dedicata | ;| alla porta seriale sul sito *** http://www.giobe2000.it *** | ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: CR EQU 0DH ;codice Ascii del tasto LF EQU 0AH ;codice Ascii del tasto ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP RxD0Com2 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- Testo DB "RxD0Com2 - RICEZIONE SERIALE su COM2" DB " - Protocollo HW: 9600,N,2,8",CR,LF,CR,LF DB "NB: se non ci sono dati in arrivo il programma non pu• terminare!" DB CR,LF DB "NB: per terminare premi un tasto DURANTE la ricezione dei dati" DB CR,LF,CR,LF DB "Premi un tasto per iniziare la Ricezione...",CR,LF,"$" ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;|PROCEDURA : INIserial ********* VERSIONE NON AUTOMATICA RIDOTTA ******** | ;|DESCRIZIONE: Inizializza la porta seriale COM2 per funzionare con protocol-| ;| lo 9600,N,2,8 (velocit… 9600 baud, nessuna parit…, 2 bit di| ;| stop e 8 bit di dato); nessun evento seriale protr… richiedere| ;| servizio d'interruzione e il Registro di controllo MODEM Š| ;| fissato a 03H (attivati i segnali modem "DTR" e "RTS"). | ;\---------------------------------------------------------------------------/ INIserial: ;\/-[port_B]-----------------------------------\ MOV DX,02FBH ;|| Registro di controllo della LINEA | MOV AL,80H ;|\--------------------------------------------/ OUT DX,AL ;/Predispone l'accesso ai registri divisori MOV AX,000CH ;\/-[port_9]- [port_8]-------------------------\ MOV DX,02F8H ;|| Registri Divisori di Baud RATE (MSB/LSB) | OUT DX,AL ;|\--------------------------------------------/ MOV AL,AH ;|La costante di divisione =12 =000CH, preparata MOV DX,02F9H ;|in AX (AL=LSB, AH=MSD) per una velocit… di OUT DX,AL ;/115200/12=9600 baud, Š trasferita nei Registri ;\/-[port_B]-----------------------------------\ ;|| Registro di controllo della LINEA | ;|\--------------------------------------------/ ;|Predispone la ricetrasmissone con i parametri MOV DX,02FBH ;|nessuna parit…, 2 bit di stop e 8 bit di dato MOV AL,07H ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ OUT DX,AL ;|[port_B]| 0 | 0 | 0 | x | 0 | 1 | 1 | 1 | 07H ;| \---*---*---*---*---*---*---*---/ ;|Protocollo/ | | | | | \---*-8 dato ;|Break disab.--/ | | | \-----2 bit stop ;/Parit… disab.-----/ \---*-----nessuna parit… ;\/-[port_C]-----------------------------------\ ;|| Registro di controllo del MODEM | ;|\--------------------------------------------/ ;|Inizializza il Registro per condizioni normali MOV DX,02FCH ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ MOV AL,03H ;|[port_C]| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 03H OUT DX,AL ;| \---*---*---*---*---*---*---*---/ ;|non usati-*---*---/ | | | | \DTR on ;|no LookBack Mode------/ | | \----RTS on ;/INT disabilitate----OUT2--/ \OUT1-non usata ;\/-[port_9]-----------------------------------\ ;|| Registro di Abilitazione delle INTERRUZIONI| ;|\--------------------------------------------/ ;|Disabilita tutte le sorgenti d'interruzione MOV DX,02F9H ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ MOV AL,00H ;|[port_9]| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 00H OUT DX,AL ;| \---*---*---*---*-no*-no*-no*-no/ ;|non usati-*---*---*---/ | | | | RxD ;|Variazione Stato Linea----/ | | \-pieno ;/Variazione Registro Modem-----/ \-TxD vuoto RET ;/---------------------------------------------------------------------------\ ;| /--------------------------------------------\| ;| PROCEDURA : RxD_0 | ************* Versione 00 ************* || ;| \--------------------------------------------/| ;| 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). | ;|/-----------\ | ;|| | La procedura NON ATTIVA alcuna verifica di Time-Out, quindi| ;|| | nell'IMPOSSIBILITA` di ASSUMERE DATI dalla porta SERIALE| ;|| NB: | non consente di tornare al programma chiamante e si BLOCCA| ;|| | in ATTESA | ;|\-----------/ | ;\---------------------------------------------------------------------------/ RxD_0: MOV DX,02FDH ;\/-[port_D]-----------------------------------\ ;|| Registro di stato della LINEA SERIALE | RxD000: IN AL,DX ;|\--------------------------------------------/ TEST AL,01H ;|Controlla lo stato della linea seriale per ve- JZ RxD000 ;|dere se c'Š un DATO RICEVUTO PRONTO (bit0="1") ;| /-7-*-6-*-5-*-4-*-3-*-2-*-1-*-0-\ ;|[port_D]| x | x | 1 | x | x | x | x | x | 01H ;| \---*---*---*---*---*---*---*---/ ;/ Dato ricevuto pronto-----------------/ ;\/-[port_8]-----------------------------------\ MOV DX,02F8H ;|| Registro BUFFER di RICEZIONE (in LETTURA) | IN AL,DX ;|\--------------------------------------------/ ;/Legge in AL il DATO PRONTO in RICEZIONE RET ;***************************************************************************** ; ---------------------------------------------- RxD0Com2 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- MOV AH,00H ;\ MOV AL,03H ;|ClearScreen a livello BIOS INT 10H ;/ LEA DX,Testo ;\ MOV AH,09H ;|Stampa frase a livello DOS INT 21H ;/ MOV AH,00H ;\Aspetta la pressione di un tasto INT 16H ;/a livello BIOS ;\Inizializza i Registri della porta COM2 per CALL INIserial ;|funzionare a 9600 baud, con 2 bit di stop e 8 ;/bit di dato, senza controllo di parit… ;\Riceve un byte dalla PORTA SERIALE lasciandolo xxx00: CALL RxD_0 ;|in AL; se NON ARRIVA il programma NON E' ;/IN GRADO DI ESSERE TERMINATO !!!!!!!!!!!!!!! ;/---------------------------------------------\ ;|NB: le 5 istruzioni seguenti, indispensabili| ;| per mostrare a video il carattere ricevu-| ;| to e per terminare la fase di ricezione,| ;| possono consumare troppo tempo e causare| ;| la perdita di qualche byte in arrivo... | ;\---------------------------------------------/ MOV BH,00H ;\ MOV AH,0EH ;|Stampa un carattere a livello BIOS INT 10H ;/ MOV AH,01H ;\Controlla la Pressione di Tasti SENZA FERMARSI INT 16H ;|se NON Š stato premuto alcun tasto (ffZ="1", JZ xxx00 ;/Z) rimane comunque in attesa di dati in arrivo MOV AH,4CH ;Torna al DOS INT 21H RxD0Com2 ENDP _prog ENDS END INIZIO