PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2009) SUBTTL** EsE008.ASM - Esercizi PALESTRA ASSEMBLY ESPERTI - by ing. G.OBER ;/---------------------------------------------------------------------------\ ;| NOME : EsE008.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2009 | ;| DESCRIZIONE : Esercizio nø 0008 | ;| Versione con scansione di ALCUNI tasti della Tastiera. | ;\---------------------------------------------------------------------------/ ; ;COSTANTI DEFINITE PER IL PROGRAMMA: ESC_ EQU 1BH ;Codice Ascii tasto F1 EQU 3BH ;Codice Scansione tasto Funzione F10 EQU 44H ;Codice Scansione tasto Funzione FrSn EQU 4BH ;Codice Scansione tasto Funzionale FrDx EQU 4DH ;Codice Scansione tasto Funzionale ; 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 BIOScls:NEAR EXTRN BIOchr1:NEAR EXTRN BIObeep:NEAR EXTRN BIOSmsg:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC EsE008 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP EsE008 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH Frase01 DB "Collaudo della tua Tastiera",00H Frase02 DB " Premi un tasto autorizzato nel Menu Interattivo ",00H Frase03 DB "TUTORIAL ASSEMBLY ~ESPERTI~ --- Copyright" DB " www.Giobe2000.it --- aprile 2009",00H Frase04 DB " ************* Tasto NON autorizzato ************ ",00H Menu DB " [A]lfa [B]eta [1][2][3] About [][] [Q]uit ",00H Msg_ESC_ DB " Premuto il Tasto di Controllo ",00H Msg_F1 DB " Premuto il Tasto Funzione ",00H Msg_F10 DB " Premuto il Tasto Funzione ",00H Msg_FrSn DB " Premuto il Tasto Funzionale ",00H Msg_FrDx DB " Premuto il Tasto Funzionale ",00H Msg_Std1 DB " Premuto il Tasto Standard con simbolo ~",00H Msg_Std_ DB "~ ",00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Desktop | ;| DESCRIZIONE : Stampa tutta l'immagine del piano di presentazione del gioco| ;\---------------------------------------------------------------------------/ Desktop:CALL BIOScls ;Provvede comunque alla cancellazione del video, ;posizionando il cursore alla riga 0, colonna 0 CALL VIA_cur ;Rende il cursore invisibile ; Provvede a stampare una riga intera di spazi, M_COLOR 1FH ; (80 caratteri " "), nel colore predisposto da MOV CX,80 ; M_COLOR nella variabile ATTRIB; poichŠ si MOV AL," " ; desidera marcare la prima riga in alto non Š Desk0: CALL BIOchr1 ; necessario posizionare il cursore con M_CURSOR LOOP Desk0 ; poichŠ siamo reduci da un ClearScreen che ha ; fissato d'ufficio la posizione di stampa sulla ; riga0,colonna0 M_CURSOR 23,0 ; Provvede a colorare completamente la penultima MOV CX,80 ; riga (stampa 80 spazi) poichŠ n‚ il colore n‚ Desk1: CALL BIOchr1 ; il carattere sono cambiati le 2 istruzioni che LOOP Desk1 ; mancano non sono necessarie. E' invece neces- ; sario posizionare il cursore con M_CURSOR M_msgC Frase01, 0,30,1FH; "Collaudo della tua Tastiera" M_msgC Frase02,12,15,1FH; "Premi un tasto autorizzato nel Menu .." M_msgC Menu ,23, 0,1FH ; Stampa il Menu Interattivo M_msgC Frase03,24,1,04H ; Stampa il copyright sulla riga 24, colonna 2 ; in rosso su nero (codice 04H) M_Chr 'A',23, 2,1EH ; Evidenzia Voce del Menu "[A]lfa" M_Chr 'B',23,10,1EH ; Evidenzia Voce del Menu "[B]eta" M_Chr '1',23,21,1EH ; Evidenzia Voce del Menu "[1]" M_Chr '2',23,24,1EH ; Evidenzia Voce del Menu "[2]" M_Chr '3',23,27,1EH ; Evidenzia Voce del Menu "[3]" M_Chr 'F',23,35,1EH ; Evidenzia Voce del Menu "About" M_Chr 'F',23,46,1EH ; Evidenzia Voce del Menu "" M_Chr '',23,58,1EH ; Evidenzia Voce del Menu "[]" M_Chr '',23,61,1EH ; Evidenzia Voce del Menu "[]" M_Chr 'Q',23,74,1EH ; Evidenzia Voce del Menu "[Q]uit" RET ;***************************************************************************** ; ---------------------------------------------- EsE008 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- CALL DeskTop ;Impostazione della pagina interattiva xxx00: CALL KEYwait ;Rimane in attesa di tasti premuti CMP AL,00H ;Codice Ascii=00H >> Tasto FUNZIONALE !!! JNZ xxx01 ;-[Zona del Servizio per i Tasti Funzionali]-------------------------- LEA SI,Msg_F1 CMP AH,F1 ;Codice Scansione tasto Funzione JZ Servizio ;"" LEA SI,Msg_F10 CMP AH,F10 ;Codice Scansione tasto Funzione JZ Servizio ;"" LEA SI,Msg_FrSn CMP AH,FrSn ;Codice Scansione tasto Funzionale JZ Servizio ;"[]" LEA SI,Msg_FrDx CMP AH,FrDx ;Codice Scansione tasto Funzionale JZ Servizio ;"[]" ;-[Zona del Servizio per i Tasti Ascii di Controllo]------------------ xxx01: LEA SI,Msg_ESC_ CMP AL,ESC_ ;Codice Ascii tasto JZ _OUT ;-[Zona del Servizio per i Tasti Ascii Numerici]---------------------- LEA SI,Msg_Std1 ;"Premuto il Tasto Standard con simbolo ~" CMP AL,'1' JZ Servizio1 ;"[1]" CMP AL,'2' JZ Servizio1 ;"[2]" CMP AL,'3' JZ Servizio1 ;"[3]" ;-[Zona del Servizio per i Tasti Ascii Letterali]--------------------- AND AL,0DFH ; CMP AL,'A' JZ Servizio1 ;"[A]lfa" CMP AL,'B' JZ Servizio1 ;"[B]eta" CMP AL,'Q' JZ _OUT ;"[Q]uit" ;-[Zona del Servizio per i Tasti NON AUTORIZZATI]--------------------- M_msgC Frase04,12,15,4FH; "******* Tasto NON autorizzato ****** " CALL BIObeep ;Emette un BEEP per avvisare dell'avvenuta JMP xxx00 ;pressione di un tasto indesiderato e torna in ;attesa _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 ; ;/---------------------------------------------------------------------------\ ;| Rientro01 : Servizio / Servizio1 | ;| DESCRIZIONE : Realizza il servizio dovuto alla pressione del tasto | ;| rilevato; nel nostro esempio si limita a stampare un | ;| messaggio, puntato in ingresso da SI. | ;| /-----------\ ----------------------------------------------------------- | ;| | NB: | Non si tratta di una procedura ma un supplemento d'indagine | ;| | | al termine della quale si deve rientrare nel Main Loop, | ;| \-----------/ a livello "xxx00", con JMP e NON con RET | ;\---------------------------------------------------------------------------/ Servizio: ; M_MsgC CS:[SI],12,15,1FH; La stampa del messaggio corrente JMP xxx00 ; ;--------------------------------------------------------------------- Servizio1: ; M_MsgC CS:[SI],12,15,1FH; La stampa del messaggio corrente CALL BIOchr1 ; M_MsgN Msg_Std_ ; "~ ", chiude la stringa JMP xxx00 EsE008 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare