PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2003) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : In_LPT1a.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2003 | ;| DESCRIZIONE : Controllo di una PORTA PARALLELA a basso livello, al fine di| ;| acquisire lo stato di 8 sensori. | ;| /----------\ -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | bisogna prima installare il Driver Configura_LPT1; scaricalo | ;| | | a: http://www.giobe2000.it/consigli/Scarica_VediLPT_XP.htm | ;| *----------* -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | la SHELL DOS deve essere a "Pieno Schermo" (l'esecuzione in | ;| | | "finestra DOS" non produce effetto sulla Stampante) | ;| *----------* -------------------------------------------------------------| ;| | | In ogni caso PRIMA DI OGNI SESSIONE DOS Š necessario eseguire| ;| | NB !! | il programma Config_LPT1.EXE in ambiente Windows per attivare| ;| | | la visibilit… dei driver installati con Configura_LPT1 !!!!! | ;| \----------/ -------------------------------------------------------------| ;\---------------------------------------------------------------------------/ ;/---------------------------------------------------------------------------\ ;| Il programma consente la verifica dell'uso improprio della PORTA PARALLELA| ;| per operazioni di INPUT; Š noto che in condizioni normali sul connettore| ;| d'uscita del computer sono disponibili 12 linee di OUT [8 per i bit di DA-| ;| TO (pin 2ö9) e le linee di STROBE (pin 1),AUTOFEED (pin 14), INIT (pin 16)| ;| e SELECT IN (pin 17)] e 5 linee di IN [ACKNOWLEDGE (pin 10), BUSY (pin 11)| ;| PAPER EMPTY (pin 12), SELECT (pin 13) e ERROR (pin 15)]; con un banale| ;| HardWare aggiuntivo collegato direttamente in uscita alla PORTA PARALLELA,| ;| (un 74LS157, quadruplo multiplexer da due a una) Š possibile quindi gesti-| ;| re la lettura di otto interruttori (o sensori) utilizzando una delle linee| ;| di OUT (per esempio STROBE, pin1) per convogliare in sequenza le due met…| ;| su quattro delle cinque linee di IN disponibili; lo schema elettrico di| ;| tale interfaccia elimina ogni residuo dubbio. Da notare che sul connettore| ;| rimane comunque disponibile LA NORMALE PORTA di OUT, governabile con un| ;| qualunque protocollo di HANDSHAKE, implementato dalle rimanenti quattro| ;| linee (tre di OUT e una di IN). | ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: PRNdato EQU 378H ;Registro dei DATI ( USCITA ) PRNstat EQU 379H ;Registro di STATO (INGRESSO) PRNcomd EQU 37AH ;Registro di CONTROLLO ( USCITA ) ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC ; 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 SET_cur:NEAR EXTRN VIA_cur:NEAR EXTRN RIP_cur:NEAR EXTRN KEYwait:NEAR EXTRN STAsp:NEAR EXTRN Acapo:NEAR EXTRN BIOScls:NEAR EXTRN BIOchr1:NEAR EXTRN BIObeep:NEAR EXTRN BIOSmsg:NEAR EXTRN Byt2Asc:NEAR EXTRN RAMcls:NEAR EXTRN RAMchr:NEAR EXTRN RAMcur:NEAR EXTRN RAMmes:NEAR EXTRN RIEMPI:NEAR EXTRN RAMpiu:NEAR ; DICHIARAZIONI PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB PUBLIC In_LPT1a ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP In_LPT1a ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 1FH TESTO1 DB "Acquisizione di un dato a 8 bit dalla porta parallela",00H TESTO2 DB "TUTORIAL ASSEMBLY --- www.Giobe2000.it ---",00H TESTO3 DB "Quit",00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;|PROCEDURA : DeskTop | ;|DESCRIZIONE: Procedura che inizializza completamente il piano di lavoro.| ;\---------------------------------------------------------------------------/ DeskTop:CALL RAMcls ;Pulisce lo schermo e inizializza il segmento ;dedicato alla RamVideo (ES=0B800H) CALL VIA_cur ; Rende il cursore invisibile M_COLOR 71H ; MOV AL,"°" ; CALL RIEMPI ; RAMrepC 80," ", 0, 0,30H; RAMrepC 80," ",24, 0,30H; RAMcol TESTO1, 0,10,3FH; Organizza il piano di presentazione RAMcol TESTO2,24,10,3FH; RAMcol TESTO3,24,73,30H; RAM_cur 24,73 ; M_COLOR 3FH ; MOV AL,"Q" ; CALL RAMchr ; RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Delay__ | ;|DESCRIZIONE : Il ritardo prodotto Š legato dalla velocit… del processore | ;| perch‚ utilizza le un ciclo di istruzioni.. Š di circa 1 ms | ;\---------------------------------------------------------------------------/ Delay__:PUSH CX MOV CX,0000H ;65536 del2_: PUSH AX PUSH BX PUSH CX PUSH DX POP DX POP CX POP BX POP AX LOOP del2_ POP CX RET ;***************************************************************************** ; ---------------------------------------------- In_LPT1a proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- ; --------------------------------------------- CALL DeskTop ; Organizza il piano di presentazione ; --------------------------------------------- ; /-[037AH/027AH - PORTA d'USCITA dei COMANDI]-\ ; | /-7-*-6-*-5-*4--*-3-*-2-*-1-*-0-\ | ; | | * | * | * | * |Out|Out|Out|Out| | ; |non \---*---*---*---*---*---*---*---/ | ; |disponib.*---*---*---/ | | | | | ; |pin 17 Negato------------/ | | pin 1 | ; |pin 16 ----------------------/ | Negato | ; |pin 14 Negato--------------------/ | ; \--------------------------------------------/ Prnt00: MOV AL,00H ; Forza a "0" la linea collegata al pin1 (bit0 MOV DX,PRNcomd ; della porta d'USCITA COMANDI) a beneficio del OUT DX,AL ; multiplexer 74LS157; esso collega quindi i CALL Delay__ ; primi 4 interruttori (SW3öSW0) alle linee di ; ingresso scelte per questa interfaccia, cioŠ ; rispettivamente ai pin11 (bit7), pin10 (bit6), ; pin12 (bit5) e pin13 (bit4) ; /-[0379H/0279H-PORTA d'INGRESSO dello STATO]-\ ; | /-7-*-6-*-5-*4--*-3-*-2-*-1-*-0-\ | ; | | In| In| In| In| In| * | * | * | | ; | \---*---*---*---*---*---*---*---/ | ; | | | | | | \---*---/ | ; |pin 11 Negato| | | | non disponibili| ; |pin 10 ------/ | | \---- pin 15 | ; |pin 12 ----------/ \-------- pin 13 | ; \--------------------------------------------/ ; Esegue praticamente la lettura dei primi 4 in- MOV DX,PRNstat ; terruttori SW3öSW0, copiandone il valore ri- IN AL,DX ; spettivamente nei bit7öbit4 di AL corrispon- ; denti internamente alle linee di IN scelte per ; questa interfaccia, cioŠ ai pin11 (bit7), ; pin10 (bit6), pin12 (bit5) e pin13 (bit4) XOR AL,10000000B ; Formatta in BL la prima met… dell'informazione SHR AL,1 ; desiderata compattandola nella forma 0000xxxxH SHR AL,1 ; Da notare che, essendo la linea BUSY invertita SHR AL,1 ; da HW (con un inverter) dentro la scheda del SHR AL,1 ; computer Š NECESSARIO "raddrizzare" da SW que- MOV BL,AL ; sto bit7 per evitare l'errata interpretazione ; /-[037AH/027AH - PORTA d'USCITA dei COMANDI]-\ ; \--------------------------------------------/ MOV AL,01H ; Forza a "1" la linea OUT di "STROBE" (bit0 MOV DX,PRNcomd ; della porta d'USCITA COMANDI) a beneficio del OUT DX,AL ; multiplexer 74LS157; esso collega quindi i ri- CALL Delay__ ; manenti 4 interruttori (SW7öSW4) alle linee di ; ingresso scelte per questa interfaccia, cioŠ ; ancora rispettivamente ai pin11 (bit7), pin10 ; (bit6), pin12 (bit5) e pin13 (bit4) ; /-[0379H/0279H-PORTA d'INGRESSO dello STATO]-\ ; \--------------------------------------------/ ; Esegue praticamente la lettura dei secondi 4 MOV DX,PRNstat ; interruttori SW7öSW4, copiandone il valore an- IN AL,DX ; cora rispettivamente nei bit7öbit4 di AL, sem- ; pre associati internamente alle linee di IN di ; questa interfaccia, cioŠ ai pin11 (bit7), ; pin10 (bit6), pin12 (bit5) e pin13 (bit4) ; Formatta in AL la seconda met… dell'informa- ; zione desiderata nella forma xxxx0000H masche- ; randone la parte bassa; anche in questo caso XOR AL,10000000b ; Š NECESSARIO "raddrizzare" da SW il bit7 asso- AND AL,0F0H ; ciato alla linea BUSY per evitare l'errata in- ; terpretazione del dato acquisito, essendo essa ; come detto, invertita da HW (con un inverter) ; dentro la scheda del computer OR AL,BL ; * Ricostruisce in AL il byte ora acquisito ** PUSH AX ; Provvede alla stampa a video del byte appena M_cursor 13,39 ; acquisito, a verifica del funzionamento del POP AX ; pacchetto HW/SW che si occupa di questa acqui- CALL Byt2Asc ; sizione di DATI ; Funzione BIOS INT 16H che consente di verifi- MOV AH,01H ; care la eventuale pressione di tasti senza INT 16H ; fermarsi; Š cosŤ possibile tornare al DOS con JZ Prnt00 ; la pressione di un tasto qualunque, senza in- ; terrompere il "polling" della porta d'ingresso ; (NB: ffZ="1" = nessuna pressione tasti (Z) ) _OUT: PUSH AX ; Torna al DOS con la memoria liberata e con la RAMrepC 80," ", 0,0,0FH; chiusura di tutti i file; cede il controllo RAMrepC 80," ",24,0,0FH; al processo padre (generalmente COMMAND.COM); CALL RIP_cur ; il valore posto eventualmente in AL prima di MOV DH,23 ; uscire pu• essere testato in uscita con la MOV DL,0 ; funzione 4DH o mediante la lettura della CALL SET_cur ; variabile DOS "ERRORLEVEL" POP AX MOV AH,4CH INT 21H In_LPT1a ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare