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 : Blnk9368.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : luglio 2012 | ;| DESCRIZIONE : Gestione di una PORTA PARALLELA a basso livello, al fine di| ;| controllare l'effetto Blanking di due decoder con memoria| ;| 9368 con il bit0 del Registro di controllo 037AH, modulando| ;| la forma d'onda quadra a beneficio di due DIGIT FND500. | ;| /----------\ -------------------------------------------------------------| ;| | | 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_1:NEAR ; DICHIARAZIONI PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB PUBLIC Blnk9368 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP Blnk9368 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;\---------------------------------------------------------------------------/ ATTRIB DB 1FH BlkTIME DB 01H TESTO1 DB "Controllo della luminosit… su due unit… 9368/FND500 via LPT1",00H TESTO2 DB "--[ www.Giobe2000.it ]--",00H TESTO5 DB "Blanking Inc",00H TESTO6 DB "Blanking Dec",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 TESTO5,24,33,30H; "Inc" RAMcol TESTO6,24,52,30H; "Dec" RAMcol TESTO9,24,73,30H; "Quit" M_COLOR 3FH ; RAM_cur 24,42 ; MOV AL,"I" ; "Inc" CALL RAMchr ; RAM_cur 24,61 ; MOV AL,"D" ; "Dec" 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 ; 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 : Servizi per "tasto premuto" | ;|DESCRIZIONE: NB: non sono procedure ma semplice codice in grado di | ;| garantire il servizio richesto 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"). | ;\---------------------------------------------------------------------------/ IncByt: MOV AL,BlkTIME CMP AL,22 ; Massimo 22 ms (pari a 45 Hz) JZ All_0 INC AL JMP All_0 ;--------------------------------------------------------------------- DecByt: MOV AL,BlkTIME CMP AL,1 ; Minimo 1 ms JZ All_0 DEC AL ;--------------------------------------------------------------------- All_0: MOV BlkTIME,AL JMP BlkDgt ;--------------------------------------------------------------------- ;/---------------------------------------------------------------------------\ ;|PROCEDURA : BlkDgt | ;|DESCRIZIONE: Procedura che provvede al controllo dell'effetto Blanking | ;| operato forzando a "0" e a "1" il bit0 del registro di | ;| Controllo per intervalli di tempo complementari che, sommati | ;| tra loro danno un periodo di 22 ms (pari a 45 hz); il segnale | ;| Š disponibile sul connettore della parallela (NB: il valore | ;| del bit č invertito internamente) a beneficio dell'ingresso | ;| BI/RBO dei Decoder con memoria 9368 e del controllo del | ;| controllo dell'accensione immediata di tutti i segmenti dei | ;| Digit ad essi collegati. | ;\---------------------------------------------------------------------------/ BlkDgt: MOV CH,00H ; Predispone a zero la parte alta dei contatori 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 MOV CL,BlkTIME Blk_01: CALL Del_1 ; Genera un ritardo fisso di 1 millisecondo LOOP Blk_01 ; 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 MOV AL,BlkTIME MOV CL,23 SUB CL,AL Blk_02: CALL Del_1 ; Genera un ritardo fisso di 1 millisecondo LOOP Blk_02 MOV AH,01H ; care la eventuale pressione di tasti senza INT 16H ; fermarsi; se ffZ="1" = nessuna pressione tasti JZ BlkDgt ; (Z): Š cosŤ possibile continuare il conteggio ; in avanti del contatore, senza interruzioni. JMP xxx01 ; Non appena viene rilevata la pressione di un ; tasto qualunque (ffZ="0" = tasto premuto , NZ) ; si rientra nella procedura d'attesa ;***************************************************************************** ; ---------------------------------------------- Blnk9368 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- CALL DeskTop ; Organizza il piano di presentazione LEA SI,BlkTIME ; Prepara il deposito per la gestione dei tempi 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" CALL Out08bit ; Memorizza il dato corrente sulle linee di OUT xxx01: 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,"I" ; "Inc" .. aumenta l'effetto Blanking JZ IncByt CMP AL,"D" ; "Dec" .. diminuisce l'effetto Blanking JZ DecByt JMP xxx01 ; 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" Blnk9368 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare