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 : RxD0Com1.ASM /------------------[RxD]---------------------\| ;| AUTORE : Giorgio OBER | ************ Versione 00 ************** || ;| VERSIONE : dicembre 2004 \------------------[COM1]--------------------/| ;| 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 sugli errori 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 Š: | ;| /--------------------------------\ | ;| | COM1, 9600, N, 2, 8 | | ;| \--------------------------------/ | ;| e non pu• essere cambiato in modo automatico; Š comunque| ;| disponibile la versione "Rxd0Com2.ASM" per COM2. | ;| -------------------------------------------------------------| ;| 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 RxD0Com1 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- Testo DB "RxD0Com1 - RICEZIONE SERIALE su COM1" 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 COM1 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,03FBH ;|| 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,03F8H ;|| Registri Divisori di Baud RATE (MSB/LSB) | OUT DX,AL ;|\--------------------------------------------/ MOV AL,AH ;|La costante di divisione =12 =000CH, preparata MOV DX,03F9H ;|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,03FBH ;|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,03FCH ;| /-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,03F9H ;| /-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,03FDH ;\/-[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,03F8H ;|| Registro BUFFER di RICEZIONE (in LETTURA) | IN AL,DX ;|\--------------------------------------------/ ;/Legge in AL il DATO PRONTO in RICEZIONE RET ;***************************************************************************** ; ---------------------------------------------- RxD0Com1 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 COM1 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 !!!!!!!!!!!!!!! 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 RxD0Com1 ENDP _prog ENDS END INIZIO