PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2009) SUBTTL** EsA015.ASM - Esercizi PALESTRA ASSEMBLY APPRENDISTI - by ing. G.OBER ;/---------------------------------------------------------------------------\ ;| NOME : EsA015.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2009 | ;| DESCRIZIONE : Esercizio nø 0015 | ;| Aspetta la pressione di SOLI tasti Ascii Letterali , con eco| ;| a video (filtra ed elimina altri tasti, con segnalazione di| ;| errore, com messaggio). | ;| *************** Versione ottimizzata **********************| ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: ESC_ EQU 27 ;Codice Ascii del tasto CR EQU 0DH ;(eventuale) LF EQU 0AH ;(eventuale) ; 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 DEL_1000:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC EsA015 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP EsA015 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH Testo01 DB " Premi in sequenza i SOLI tasti LETTERALI - ESC per terminare",00H Testo02 DB " Puoi premere solo tasti letterali ",00H Testo03 DB " Attento!! Il tasto che hai premuto non Š ammesso ",00H Testo04 DB " Premi un tasto qualunque per tornare al DOS... ",00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;---------------------------------------------------------------------------- ;Per ora nessuna ;***************************************************************************** ; ---------------------------------------------- EsA015 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- ; Provvede alla cancellazione del video, CALL BIOScls ; posizionando il cursore alla riga0, colonna0, ; in alto a sinistra CALL VIA_cur ; Rende il cursore invisibile M_msgC Testo01,00,04,0FH; Mette a video il titolo, in posizione r00,c04 ; con colore 0FH (bianco brillante su nero) ; ---------------------------------------------- ; Fissa la posizione di stampa iniziale per i MOV DH,02 ; caratteri ASCII assunti da tastiera, affidando MOV DL,00 ; la coordinata di riga a DH e quella di colonna ; DL, a partire da riga02, colonna00 ; ---------------------------------------------- xxx00:M_msgC Testo02,24,04,0FH; Mette a video il commento (Help) corrente ; ---------------------------------------------- xxx01: CALL KEYwait ; Rimane in attesa della pressione di un tasto ; qualunque (lasciando il suo valore in AL) CMP AL,ESC_ ; Verifica se il tasto premuto Š ESC e in questo JZ xxx03 ; caso impone un ritorno immediato al DOS ; Salva il codice Ascii associato al tasto MOV AH,AL ; premuto, per evitare di perderlo, in virt— del ; della successiva operazione di AND (necessaria ; per trasformare le minuscole in maiuscole...) ; Subito dopo, dovendo assumere SOLO lettere, AND AL,11011111B ; conviene rendere comunque maiuscolo il codice ; assunto da tastiera per facilitare le opera- ; zioni di filtro ; Se il carattere Š maggiore di 'Z' (= 5AH = 90) CMP AL,'Z' ; non ci interessa [NB: maggiore di 'Z' sono i JA xxx02 ; tasti [ / ] ma anche tutte le lettere ; minuscole... ; Se il carattere Š minore di 'A' (= 41H = 65) CMP AL,'A' ; non ci interessa [NB: minore di 'A' sono i JB xxx02 ; tasti @ ? > ma anche (per esempio...) ; tutti i numeri... ; Fissa in modo dinamico la posizione di stampa M_CURSOR DH,DL ; iniziale per i caratteri ASCII assunti da ; tastiera, posti ora su riga=DH, colonna=DL M_COLOR 0EH ; Colore per i caratteri letti (giallo su nero) ; Riporta in AL il codice Ascii associato al MOV AL,AH ; tasto premuto, a beneficio della "BIOchr1", ; chiamata a stamparlo a video ; Se si tratta di un carattere Ascii LETTERALE CALL BIOchr1 ; provvede alla sua stampa nella posizione di ; stampa corrente con il codice di attributo di ; colore predisposto nella variabile ATTRIB INC DL ; Fissa la posizione di stampa sulla colonna ; successiva JMP SHORT xxx01 ; Torna in attesa della pressione di altri tasti ; ---------------------------------------------- xxx02:M_msgC Testo03,24,04,4FH; Segnala la pressione di un tasto NON ammesso CALL Del_1000 ; attiva un piccolo ritardo (di un secondo..) e JMP SHORT xxx00 ; torna in attesa della pressione di altri tasti ; ---------------------------------------------- xxx03:M_msgC Testo04,24,04,0FH; Mette a video la frase di commiato CALL KEYwait ; _OUT: PUSH AX ; Torna al DOS con la memoria liberata e con la CALL RIP_cur ; chiusura di tutti i file; cede il controllo MOV DH,23 ; al processo padre (generalmente COMMAND.COM); MOV DL,0 ; il valore posto eventualmente in AL prima di CALL SET_cur ; uscire pu• essere testato in uscita con la POP AX ; funzione 4DH o mediante la lettura della MOV AH,4CH ; variabile DOS "ERRORLEVEL" INT 21H ; EsA015 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare