PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (luglio 2012) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : Exad9368.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : luglio 2012 | ;| DESCRIZIONE : Gestione di una PORTA PARALLELA a basso livello, al fine di| ;| controllare due decoder con memoria 9368 con ingressi posti| ;| sulla porta 0378H, a loro volta chiamati al controllo di due| ;| DIGIT FND500, interessati da tre tipi di conteggio. | ;| /----------\ -------------------------------------------------------------| ;| | | 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 !!!!! | ;| \----------/ -------------------------------------------------------------| ;\---------------------------------------------------------------------------/ ;/---------------------------------------------------------------------------\ ;| NB : NUOVO PROGETTO | ;| LINK : http://www.giobe2000.it/HW/Parallela/Pag/Asm15_0.htm | ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: PRNdato EQU 378H ;Registro dei DATI ( USCITA ) 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 STASP:NEAR EXTRN KEYwait: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 EXTRN Del_1000:NEAR ; DICHIARAZIONI PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB PUBLIC Exad9368 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP Exad9368 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;\---------------------------------------------------------------------------/ ATTRIB DB 1FH Depo DB 00H ; Prepara il dato a 8 bit da spedire alla porta TESTO1 DB "Conteggio su due unit… di visualizzazione 9368/FND500 via LPT1",00H TESTO2 DB "--[ www.Giobe2000.it ]--",00H TESTO3 DB "Up",00H TESTO4 DB "Down",00H TESTO5 DB "Inc",00H TESTO6 DB "dec",00H TESTO7 DB "Reset",00H TESTO8 DB "Blank",00H TESTO9 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, 2,3FH; Organizza il piano di presentazione RAMcol TESTO2,24, 2,3FH; "www.Giobe2000.it --- " RAMcol TESTO3,24,33,30H; "Up" RAMcol TESTO4,24,37,30H; "Down" RAMcol TESTO5,24,43,30H; "Inc" RAMcol TESTO6,24,48,30H; "dEc" RAMcol TESTO7,24,53,30H; "Reset" RAMcol TESTO8,24,60,30H; "Blank" RAMcol TESTO9,24,73,30H; "Quit" M_COLOR 3FH ; RAM_cur 24,33 ; MOV AL,"U" ; "Up" CALL RAMchr ; RAM_cur 24,37 ; MOV AL,"D" ; "Down" CALL RAMchr ; RAM_cur 24,43 ; MOV AL,"I" ; "Inc" CALL RAMchr ; RAM_cur 24,49 ; MOV AL,"E" ; "dEc" CALL RAMchr ; RAM_cur 24,53 ; MOV AL,"R" ; "Reset" CALL RAMchr ; RAM_cur 24,60 ; MOV AL,"B" ; "Blank" CALL RAMchr ; RAM_cur 24,73 ; MOV AL,"Q" ; "Quit" CALL RAMchr ; RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Out08bit | ;|DESCRIZIONE: Procedura che provvede a fissare sui due decoder con memoria | ;| 9368 il dato a 8 bit predisposto nel registro AL. | ;| In pratica il byte predisposto prima sulla porta 0378H (copia| ;| di AL) e poi trasferito a valle dei due 9368. | ;\---------------------------------------------------------------------------/ Out08bit:PUSH AX ; CALL OK_Dgt ; Toglie comunque l'eventuale effetto "Blank" MOV DX,0378H ; Punta il Registro DATI 0378H della parallela OUT DX,AL ; Eroga il byte desiderato POP AX ; /[opzionale]---------------------------------\ M_CURSOR 13,38 ; | Provvede alla stampa a video dell'informa- | CALL STASP ; | zione (1 byte) che sta per essere spedito | CALL Byt2Asc ; | al registro DATI della porta parallela | CALL STASP ; \--------------------------------------------/ RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : IncDepo | ;|DESCRIZIONE: Procedura che provvede ad incrementare il valore corrente | ;| della variabile "Depo", lasciandola aggiornata con esso. | ;| Il byte aggiornato č lasciato in AL, a disposizione delle | ;| procedure che alimentano il 9368, attraverso la porta 0378H. | ;\---------------------------------------------------------------------------/ IncDepo:MOV AL,[SI] ; INC AL ; MOV [SI],AL ; RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : DecDepo | ;|DESCRIZIONE: Procedura che provvede ad decrementare il valore corrente | ;| della variabile "Depo", lasciandola aggiornata con esso. | ;| Il byte aggiornato č lasciato in AL, a disposizione delle | ;| procedure che alimentano il 9368, attraverso la porta 0378H. | ;\---------------------------------------------------------------------------/ DecDepo:MOV AL,[SI] ; DEC AL ; MOV [SI],AL ; RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : OK_Dgt | ;|DESCRIZIONE: Procedura che provvede a riabilitare l'accensione dei Digit | ;\---------------------------------------------------------------------------/ OK_Dgt: PUSH AX ; MOV DX,037AH ; Punta il Registro di CONTROLLO, 037AH SSP LPT1 ; Forza a "0" il bit0 del registro di Controllo MOV AL,00 ; per assicurare un livello ALTO sul pin1 del OUT DX,AL ; connettore della parallela (NB: il valore del ; bit č invertito internamente); in questo modo ; lo "1" logico sull'ingresso BI/RBO del Decoder ; con memoria 9368 produce la riaccensione ; immediata di tutti i segmenti dei Digit POP AX RET ;--------------------------------------------------------------------- ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Servizi per "tasto premuto" | ;|DESCRIZIONE: NB: non sono procedure ma semplice codice in grado di | ;| garantire il servizio richiesto da un tasto autorizzato. | ;| A ciascun servizio si accede infatti con un salto condizionato| ;| (dalla flag di Zero, JZ) e vi si esce con un salto incondizio-| ;| nato (JMP) nel loop d'attesa ( .. non esiste dunque "RET"). | ;\---------------------------------------------------------------------------/ UpByt: CALL IncDepo ; Incrementa il valore della variabile "Depo" CALL Out08bit ; Memorizza il dato corrente sulle linee di OUT. CALL Del_1000 ; Genera un ritardo fisso di circa 1 secondo ; Funzione BIOS INT 16H che consente di verifi- MOV AH,01H ; care la eventuale pressione di tasti senza INT 16H ; fermarsi; se ffZ="1" = nessuna pressione tasti JZ UpByt ; (Z): Š cosŤ possibile continuare il conteggio ; in avanti del contatore, senza interruzioni. JMP xxx02 ; Non appena viene rilevata la pressione di un ; tasto qualunque (ffZ="0" = tasto premuto , NZ) ; si rientra nella procedura d'attesa ;--------------------------------------------------------------------- DwnByt: CALL DecDepo ; Decrementa il valore della variabile "Depo" CALL Out08bit ; Memorizza il dato corrente sulle linee di OUT. CALL Del_1000 ; Genera un ritardo fisso di circa 1 secondo. ; Funzione BIOS INT 16H che consente di verifi- MOV AH,01H ; care la eventuale pressione di tasti senza INT 16H ; fermarsi; se ffZ="1" = nessuna pressione tasti JZ DwnByt ; (Z): Š cosŤ possibile continuare il conteggio ; indietro del contatore, senza interruzioni. JMP xxx02 ; Non appena viene rilevata la pressione di un ; tasto qualunque (ffZ="0" = tasto premuto , NZ) ; si rientra nella procedura d'attesa ;--------------------------------------------------------------------- IncByt: CALL IncDepo ; JMP xxx01 ; ;--------------------------------------------------------------------- DecByt: CALL DecDepo ; JMP xxx01 ; ;--------------------------------------------------------------------- BlkDgt: PUSH AX ; MOV DX,037AH ; Punta il Registro di CONTROLLO, 037AH SSP LPT1 ; Forza a "1" il bit0 del registro di Controllo MOV AL,01 ; per assicurare un livello BASSO sul pin1 del OUT DX,AL ; connettore della parallela (NB: il valore del ; bit č invertito internamente); in questo modo ; lo "0" logico sull'ingresso BI/RBO del Decoder ; con memoria 9368 produce lo spegnimento imme- ; diato di tutti i segmenti dei Digit POP AX ; /[opzionale]---------------------------------\ M_CURSOR 13,39 ; | Provvede alla stampa a video di due spazi | CALL STASP ; | al posto dell'informazione (1 byte) che di | CALL STASP ; | solito viene spedita al registro DATI LPT1 | ; \--------------------------------------------/ JMP xxx02 ; Rientra in attesa della pressione di un tasto ;--------------------------------------------------------------------- ;***************************************************************************** ; ---------------------------------------------- Exad9368 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- CALL DeskTop ; Organizza il piano di presentazione LEA SI,Depo ; Prepara il dato a 8 bit da spedire alla porta xxx00: MOV AL,00H ; Inizializza l'interfaccia 74LS374 col valore MOV [SI],AL ; necessario per far partire il conteggio da 0 ; cioŠ i nostri Digit FND500 mostreranno "00" ;/---------------------------------------------\ xxx01: CALL Out08bit ;|Memorizza il dato corrente sulle linee di OUT| ;\---------------------------------------------/ xxx02: CALL KEYwait ; Si ferma in attesa della pressione di un tasto AND AL,11011111B ; rende maiuscolo il codice Ascii del tasto CMP AL,"Q" ; "Quit" JZ _OUT ; Se si tratta del tasto "Q" impone il ritorno ; immediato al sistema operativo CMP AL,"U" ; "Up" JZ UpByt CMP AL,"D" ; "Down" JZ DwnByt CMP AL,"I" ; "Inc" JZ IncByt CMP AL,"E" ; "dEc" JZ DecByt CMP AL,"R" ; "Reset" JZ xxx00 CMP AL,"B" ; "Blank" JZ BlkDgt JMP xxx02 ; ogni altro tasto _OUT: PUSH AX CALL RIP_cur ; Torna al DOS con la memoria liberata e con la MOV DH,23 ; chiusura di tutti i file; cede il controllo MOV DL,0 ; al processo padre (generalmente COMMAND.COM); CALL SET_cur ; il valore posto eventualmente in AL prima di POP AX ; uscire pu• essere testato in uscita con la MOV AH,4CH ; funzione 4DH o mediante la lettura della INT 21H ; variabile DOS "ERRORLEVEL" Exad9368 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare