PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (gennaio 2005) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : B3_1Mou2.ASM /---------------[RxD da mouse]---------------\| ;| AUTORE : Giorgio OBER | ********* Versione con RxD_1 ********** || ;| VERSIONE : gennaio 2005 \------------------[COM2]--------------------/| ;| DESCRIZIONE : Organizza la RICEZIONE di DATI generati ad un Mouse seriale| ;| collegato alla porta (UART) COM2 del computer con la | ;| tecnica dell'interrogazione (POLLING). | ;| | ;|/-----------\ Il collaudo Š stato operato con un MOUSE a 3 pulsanti, in| ;|| 3 | grado di trasmettere alla porta seriale dei pacchetti di 3| ;|| bytes | bytes alla volta, dopo ogni pressione o rilascio dei suoi| ;|\-----------/ pulsanti o dopo lo spostamento del Mouse . | ;| | ;|/-----------\/------------------------------------------------------------\| ;|| ||La tecnica di Ricezione (procedura RxD_1) Š 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 la perdita di qualche byte in arrivo|| ;|| ||Tuttavia la bassa velocit… seriale (1200 baud) rende poco|| ;|| ||probabile questo evento, come si pu• facilmente verificare|| ;|| ||confrontando l'esecuzione di questo programma con quella|| ;|| ||della versione "B3_3Mou2.ASM", basata sulla tecnica di|| ;|| ||INTERRUZIONE, particolarmente impegnativa, ma assolutamente|| ;|| ||PERFETTA e AFFIDABILE. || ;|\-----------/\------------------------------------------------------------/| ;| a) versione con presentazione (DESKTOP) | ;| b) NON opera alcun controllo sugli Errori in Ricezione | ;| c) in mancanza di DATI in arrivo dalla Porta Seriale, cioŠ| ;| in assenza di movimento o click del Mouse, la procedura| ;| di RICEZIONE BLOCCA l'esecuzione del programma, ma basta| ;| premere un tasto qualunque insieme ad un movimento o un| ;| click del Mouse per tornare al programma chiamante. | ;| d) Il protocollo HW impostato per la RICEZIONE SERIALE Š | ;| quello necessario per effettuare il test con MOUSE| ;| collegato sulla porta COM2 (ogni modifica consente ancora| ;| la ricezione, ma con informazioni non decodificabili e | ;| casuali): | ;| /--------------------------------\ | ;| | COM2, 1200, N, 1, 7 | | ;| \--------------------------------/ | ;|/-----------\ Per cambiare PORTA utilizzata dal Mouse Š possibile assegnare| ;|| | al parametro COM_num (qui sotto) un valore diverso; come| ;|| | anticipato non Š invece opportuno (anche se masochisticamente| ;|| | possibile) riassegnare valori diversi ai parametri Baude| ;|| NB: | (Velocit… di ricetrasmissione, fissato a 0060H = 1200 Baude)| ;|| | e Protoc (Protocollo Seriale, fissato a 02H = 7 bit per DATO,| ;|| | 1 bit di stop, nessuna parit…). | ;|| | -------------------------------------------------------------| ;|\-----------/ E' comunque disponibile la versione "B3_1Mou1.ASM" per COM1. | ;| -------------------------------------------------------------| ;| Maggiori dettagli sono disponibili nella sezione dedicata | ;| alla porta seriale sul sito *** http://www.giobe2000.it *** | ;\---------------------------------------------------------------------------/ ;/---------------------------------------------------------------------------\ ;| ;Specificare il Numero di bytes desiderati per ciascuna| Max EQU 3 ;colonna di dati; valori possibili vanno da 1 (un byte| ;| ;per 20 colonne) a 26 (26 bytes per una sola colonna)| ;\---------------------------------------------------------------------------/ COM_num EQU 02H ;PORTA utilizzata = COM2 /--------------------------------\ ;EQU 01H ;PORTA utilizzata = COM1 |Scegli la porta COM desiderata | ;EQU 03H ;PORTA utilizzata = COM3 |[ default: programma per COM2 ] | ;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 | ---- | Baude 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 | ---- | ;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 02H ;| default .... ..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 ; 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 STAsp:NEAR EXTRN BIOSmsg: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 ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC B3_1Mou2 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP B3_1Mou2 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 00H Numero DW 0000H Titolo DB "Programmi per il Collaudo della Porta Seriale ",00H Titolo1 DB "COM",00H Tema0 DB "B3_1Mou2 - RICEZIONE da Mouse su COM2" DB " - Protocollo HW: 1200,N,1,7",00H Tema1 DB "NB: per terminare il programma premi " DB "[Q]uit mentre muovi il Mouse",00H Tema2 DB "Se il Mouse non Š presente su COM2 " DB "non potrai tornare al DOS !!!",00H Tema3 DB "Premi [I] con Mouse collegato - " DB "un tasto qualunque per terminare",00H Tema4 DB " ATTENZIONE ",00H Nocom0 DB "La PORTA SERIALE desiderata, COM , ",00H Nocom1 DB "non Š",00H Nocom2 DB " disponibile",00H Centro1 DB "Bytes ricevuti dal Mouse",00H MENU01 DB "Inizia",00H MENU02 DB "Quit",00H Mouse DB "Muovi o fai click sul Mouse",00H BytRxD DB "Bytes ricevuti: ",00H NumChar DB 00H ;Numero corrente dei bytes scritti in ogni colonna di dati NumByte DB Max ;Numero di bytes desidetrati per ogni colonna di dati, di ;norma prefissato dal programmatore all'inizio con "EQU" RigCorr DB 2 ;Numero della riga corrente per i bytes ColCorr DB 3 ;Numero della colonna corrente per i bytes Colore DB 1FH ;Colore corrente usato nella stampa dei bytes ;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 con Mouse Seriale;| ;| inizializza le Variabili necessarie per il programma di Test| ;| 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. | ;\---------------------------------------------------------------------------/ ;/----------------------------------------------\ DESKTOP: ;|Inizializza le variabili - Test Seriale| ;\----------------------------------------------/ PUSH SI ; In ingresso SI=0000 se la porta richiesta NON ; Š presente nel sistema... MOV AL,'°' ;\ M_COLOR 71H ;|Predispone il Piano di gioco su tavola CALL Riempi ;|zigrinata CALL VIA_cur ;/ M_COLOR 70H ;\ MOV DH,0 ;| CALL BARRA ;| M_msgC Titolo, 0,12,70H;| M_COLOR 74H ;|Intestazione M_msgN Titolo1 ;/ MOV DH,24 ;\ CALL BARRA ;|Menu M_msgC MENU02,24,70,70H;| M_Chr 'Q',24,70,74H ;/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva M_corn 5 , 69 , 9 , 5 , 1EH , 01 , 01 ,1000H POP SI ;\ CMP SI,0000H ;| JNZ DESK_0 ;| M_msgC Nocom0,11,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,11,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,10, 7,1FH;\Messaggio di test eseguibile M_msgC Tema1,12, 7,1FH;| MOV AL,CS:[depPOR];|"RICEZIONE SERIALE su COMx - ADD AL,30H ;| protocollo HW: 9600,N,2,8" M_Chr AL,10,43,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 *************| DESK_1: CALL KEYwait ;|\---------------------------------------------/ AND AL,11011111B ;|Rimane in attesa dei tasti del Menu principale: CMP AL,'I' ;| JZ DESK_2 ;| con "I" inizia il Test CMP AL,'Q' ;| con "Q" torna al DOS JNZ DESK_1 ;| JMP _OUT ;/ ;--------------------------------------------------------------------- ;/----------------------------------------------\ ;|Messaggio di avvertimento prima di cominciare | ;\----------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva DESK_2: M_corn 5 , 69 , 9 , 5 , 4EH , 01 , 01 ,2000H ;--------------------------------------------------------------------- M_msgC Tema2,10, 7,4FH;\Messaggio di uscita senza mouse M_msgC Tema3,12, 7,4FH;| M_msgC Tema4,9,34,0CFH;| CALL KEYwait ;| AND AL,11011111B ;|Rimane in attesa dei tasti del Menu principale: CMP AL,'I' ;| con "I" inizia il Test JZ DESK_3 ;| JMP _OUT ;/ ;--------------------------------------------------------------------- ;/----------------------------------------------\ ;|Predispone Piano di Lavoro Test Mouse Seriale| ;\----------------------------------------------/ ;M_corn altezza,larghezza,riga,colonna,colore,tipo,ombra,salva DESK_3: M_corn 23 , 80 , 1 , 0 , 03H , 00 , 00 ,2000H MOV CX,5 ;\ MOV DL,14 ;| DESK_4: PUSH CX ;| MOV DH,1 ;| MOV AL,'*' ;| M_CURSOR DH,DL ;| CALL BIOchr1 ;| INC DH ;| MOV AL,'|' ;|Colonne centrali della tabella d'acquisizione MOV CX,21 ;| DESK_5: M_CURSOR DH,DL ;| CALL BIOchr1 ;| INC DH ;| LOOP DESK_5 ;| MOV AL,'*' ;| M_CURSOR DH,DL ;| CALL BIOchr1 ;| ADD DL,13 ;| POP CX ;| LOOP DESK_4 ;/ M_Chr '[', 1,26,03H ;\ M_COLOR 03H ;| Menu M_msgN Centro1 ;| M_COLOR 03H ;| Primo campo di acquisizione Dati seriali MOV AL,']' ;| [Bytes ricevuti] CALL BIOchr1 ;/ M_msgC Mouse,24,3,70H ; "Muovi o fai click sul Mouse" RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : GoToXY | ;| DESCRIZIONE : Controlla e aggiorna la posizione di stampa corrente al fine| ;| di organizzare la stampa stessa su colonne perallele; per| ;| aumentare la leggibilit… cambia colore dopo ogni pagina. | ;\---------------------------------------------------------------------------/ GoToXY: MOV DH,CS:[RigCorr];\Assume la riga e la colonna di stampa corrente MOV DL,CS:[ColCorr];/ INC DH ;| CMP DH,23 ;|Controllo della Riga corrente˙ JNZ goto2 ;| MOV DH,02 ;/ MOV DL,CS:[ColCorr];\ ADD DL,13 ;| CMP DL,79 ;| JL goto1 ;| MOV DL,03 ;/ MOV CL,CS:[Colore];\ ADD CL,10H ;| TEST CL,80H ;|Controllo del Colore corrente JZ goto0 ;| AND CL,7FH ;|Ricostruisce sfondo BLU OR CL,10H ;| goto0: MOV CS:[Colore],CL;| M_COLOR CL ;/ goto1: MOV CS:[ColCorr],DL;\ goto2: MOV CS:[RigCorr],DH;| CALL SET_cur ;|Fissa la posizione di stampa, stampando subito RET ;/ ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Stampa | ;| DESCRIZIONE : Stampa i dati ricevuti dalla porta SERIALE, organizzandoli a| ;| Max a Max su colonne progressive. | ;\---------------------------------------------------------------------------/ Stampa: PUSH CX PUSH BX PUSH AX INC CS:[Numero] ;*Aggiorna il numero dei Bytes Ricevuti MOV CL,CS:[Colore];* Colore corrente usato nella stampa dei dati MOV CH,CS:[NumByte];\Se Non si tratta del primo dei Max bytes pre- CMP CS:[NumChar],CH;|visti per ogni colonna di dati si prosegue con JNZ stamp0 ;/la stampa degli altri, nella stessa colonna ;\Altrimenti riporta a zero il Numero di bytes MOV Byte Ptr CS:[NumChar],00H;|stampati sulla riga corrente e riporta la po- CALL GoToXY ;|sizione di stampa nel punto pi— opportuno, con ;/il colore corrente stamp0: ;\ INC Byte Ptr CS:[NumChar];|Converte il dato esadecimale presente in AL CALL STAsp ;|nella coppia di caratteri ASCII corrispondenti CALL Byt2Asc ;/[tra due spazi] MOV CH,CS:[NumByte];\Se si tratta dell'ultimo dei Max bytes previ- CMP CS:[NumChar],CH;|sti sulla colonna di dati corrente, stampa uno JNZ stamp1 ;|spazio subito dopo di esso, con il colore cor- CALL STAsp ;/rente M_msgC BytRxD,24,35,70H;\ M_COLOR 74H ;| MOV AX,CS:[Numero];|Stampa e mette a video il numero dei Bytes CALL Wor2Dec ;|ricevuti MOV AL,CS:[Colore];| M_COLOR AL ;/ stamp1: POP AX POP BX POP CX RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : INIserial | ;|DESCRIZIONE: Seleziona automaticamente la porta seriale COM predisposta dal| ;| valore della costante "COM_num" (per default EQU 02H= COM2), 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 02H=COM2), 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 COM2: MOV CS:[port_A],AX;| INC AX ;|[port_8]=02F8H Registro Scrittura/Lettura DATO MOV CS:[port_B],AX;|[port_9]=02F9H Abilitazione interruzioni INC AX ;|[port_A]=02FAH Identificatore interruzioni MOV CS:[port_C],AX;|[port_B]=02FBH Registro di controllo LINEA INC AX ;|[port_C]=02FCH Registro di controllo MODEM MOV CS:[port_D],AX;|[port_D]=02FDH Registro di stato linea seriale INC AX ;|[port_E]=02FEH 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 : RxD_1 | ************* Versione 01 ************* || ;| \--------------------------------------------/| ;| 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_1: MOV DX,CS:[port_D];\/-[port_D]-----------------------------------\ ;|| Registro di stato della LINEA SERIALE | RxD100: IN AL,DX ;|\--------------------------------------------/ TEST AL,01H ;|Controlla lo stato della linea seriale per ve- JZ RxD100 ;|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,CS:[port_8];|| Registro BUFFER di RICEZIONE (in LETTURA) | IN AL,DX ;|\--------------------------------------------/ ;/Legge in AL il DATO PRONTO in RICEZIONE RET ;***************************************************************************** ; ---------------------------------------------- B3_1Mou2 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 COM2) ;|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) ;--------------------------------------------------------------------- ;\Per consentire una corretta visualizzazione MOV DX,CS:[port_8];|di dati che provengono dal MOUSE viene operata IN AL,DX ;|una prericezione del carattere presente nel ;/Registro di Ricezione,azzerandone il contenuto ;--------------------------------------------------------------------- MOV Word Ptr CS:[Numero],00; Numero di Bytes ricevuti MOV Byte Ptr CS:[RigCorr],01;\Predispone la riga e la colonna di stampa cor- MOV Byte Ptr CS:[ColCorr],03;|rente al valore 2,3 (la riga viene incrementa- ;/ta automaticamente da GoToxy) MOV AL,1FH ;\Fissa il Colore da usare nella stampa dei dati MOV CS:[Colore],AL;| M_COLOR AL ;/ ;\Provvede a fissare la posizione iniziale del CALL GoToXY ;|cursore video (riga 1, colonna 0 ) e stampa ;/subito uno spazio a livello BIOS ;--------------------------------------------------------------------- ;\Riceve un byte dalla PORTA SERIALE lasciandolo ;|in AL, aspettando le condizioni ottimali per xxx00: CALL RxD_1 ;|consentire la ricezione del dato desiderato ;|(cioŠ che la linea sia libera); se il dato ;|seriale NON ARRIVA il programma NON E' IN ;/GRADO DI ESSERE TERMINATO !!! ;/---------------------------------------------\ ;|NB: le 3 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... | ;\---------------------------------------------/ CALL Stampa ; Fornisce il resoconto sulla RICEZIONE 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 ;--------------------------------------------------------------------- CALL KEYwait ;\******* Gestione Menu interno ******** AND AL,11011111B ;| CMP AL,'Q' ;| con "Q" torna al DOS JNZ xxx00 ;/ ;-------------------------------------------------------------------- _OUT: 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" B3_1Mou2 ENDP _prog ENDS END INIZIO