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 : TxD0Com1.ASM /------------------[TxD]---------------------\| ;| AUTORE : Giorgio OBER | ************ Versione 00 ************** || ;| VERSIONE : dicembre 2004 \------------------[COM1]--------------------/| ;| DESCRIZIONE : Organizza la TRASMISSIONE di DATI attraverso la porta | ;| seriale (UART) del computer con la tecnica dell'interroga- | ;| zione (POLLING): | ;| 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 "TxD1Com1.ASM". || ;|\-----------/\------------------------------------------------------------/| ;| b) in AUTOMATICO il programma TRASMETTE in continuazione | ;| (sulla porta COM1) la sequenza dei caratteri ascii dal | ;| primo standard [=00H, 0] all'ultimo esteso [=FFH, 255]; | ;| in MANUALE il programma aspetta la digitazione di un | ;| tasto e poi ne TRASMETTE il codice ascii, fino alla | ;| pressione del tasto | ;| c) il protocollo HW impostato per la TRASMISSIONE SERIALE Š:| ;| /--------------------------------\ | ;| | COM1, 9600, N, 2, 8 | | ;| \--------------------------------/ | ;| e non pu• essere cambiato in modo dinamico da programma;| ;| Š comunque disponibile la versione "Txd0Com2.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 ESC_ EQU 27 ;codice del tasto ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP TxD0Com1 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- DatTxD DB 00H Testo DB "TxD0Com1 - TRASMISSIONE SERIALE su COM1" DB " - Protocollo HW: 9600,N,2,8",CR,LF,CR,LF DB "Premi [M] per trasmettere il codice dei tasti premuti",CR,LF DB " [A] per trasmettere la sequenza ASCII indefinitamente",CR,LF,"$" Testo1 DB CR,LF,"Premi ESC per terminare....",CR,LF,"$" Testo2 DB CR,LF,"Premi un tasto qualunque per terminare....",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 : TxD_0 | ************* Versione 00 ************* || ;| \--------------------------------------------/| ;| 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_0: MOV BL,AL ; Salva il carattere da trasmettere in BL ;\/-[port_D]-----------------------------------\ ;|| Registro di stato della LINEA SERIALE | MOV DX,03FDH ;|\--------------------------------------------/ TxD101: IN AL, DX ;|Controlla lo stato della linea seriale per TEST AL,20H ;|vedere se la porta seriale Š pronta per la JZ TxD101 ;|TRASMISIONE di un NUOVO DATO ;| /-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 ;\/-[port_8]-----------------------------------\ MOV DX,03F8H ;|| Registro BUFFER TRASMISSIONE (in SCRITTURA)| MOV AL,BL ;|\--------------------------------------------/ OUT DX,AL ;|In trasmissione la porta [port_8] costituisce ;/il registro BUFFER di TRASMISSIONE RET ;***************************************************************************** ; ---------------------------------------------- TxD0Com1 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- ;\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… 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 ;/ xxx00: MOV AH,00H ;\ INT 16H ;|Aspetta la pressione di un tasto AND AL,11011111B ;|a livello BIOS CMP AL,'M' ;| JZ xxx03 ;| con "A" Trasmissione Automatica CMP AL,'A' ;| con "M" Trasmissione Manuale JNZ xxx00 ;/ ;--------------------------------------------------------------------- xxx01: LEA DX,Testo2 ;\Stampa frase a livello DOS MOV AH,09H ;|"premi un tasto qualunque per terminare...." INT 21H ;/ MOV AL,00H ;\Prepara il primo Carattere da trasmettere MOV CS:[DatTxD],AL;/ xxx02: MOV AL,CS:[DatTxD];\Preleva il carattere corrente dalla locazione CALL TxD_0 ;|deposito, aspetta le condizioni ottimali per ;/la trasmissione e poi lo spedisce in linea PUSH AX ;\ MOV BH,00H ;| MOV AH,0EH ;|Stampa un carattere a livello BIOS INT 10H ;| POP AX ;/ INC AL ;\Prepara il prossimo carattere e lo inserisce MOV CS:[DatTxD],AL;/nel deposito MOV AH,01H ;\Controlla la Pressione di Tasti SENZA FERMARSI INT 16H ;|se NON Š stato premuto alcun tasto (ffZ="1", JZ xxx02 ;/Z) rimane comunque in trasmissione automatica JMP _OUT ;--------------------------------------------------------------------- xxx03: LEA DX,Testo1 ;\Stampa frase a livello DOS MOV AH,09H ;|"premi ESC per terminare...." INT 21H ;/ xxx04: MOV AH,00H ;\ INT 16H ;|Aspetta la pressione di un tasto CMP AL,ESC_ ;| con ESC torna al DOS JZ _OUT ;/ ;\Trasmette ogni altro carattere digitati viene CALL TxD_0 ;|spedito sulla porta COM1 non appena si presen- ;/tano le condizioni ottimali per la trasmission MOV BH,00H ;\ MOV AH,0EH ;|Stampa un carattere a livello BIOS INT 10H ;/ JMP xxx04 ; ;--------------------------------------------------------------------- _OUT: MOV AH,4CH ;Torna al DOS INT 21H TxD0Com1 ENDP _prog ENDS END INIZIO