PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2009) SUBTTL** EsE009.ASM - Esercizi PALESTRA ASSEMBLY ESPERTI - by ing. G.OBER ;/---------------------------------------------------------------------------\ ;| NOME : EsE009.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2009 | ;| DESCRIZIONE : Esercizio nø 0009 | ;| Versione con scansione di tutti i tasti della Tastiera. | ;| NB: Š possibile visualizzate anche i Simboli Ascii previsti | ;| per i tasti "inesistenti" cioŠ attivati con combinazione| ;| ALT - | ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: ESC_ EQU 27 ;Codice Ascii tasto CR EQU 0DH ;Codice Ascii tasto , Carriage Return LF EQU 0AH ;Codice Ascii tasto , Line Feed BkSp EQU 08H ;Codice Ascii tasto TAB EQU 09H ;Codice Ascii tasto F1 EQU 3BH ;Codice Scansione tasto Funzione F2 EQU 3CH ;Codice Scansione tasto Funzione F3 EQU 3DH ;Codice Scansione tasto Funzione F4 EQU 3EH ;Codice Scansione tasto Funzione F5 EQU 3FH ;Codice Scansione tasto Funzione F6 EQU 40H ;Codice Scansione tasto Funzione F7 EQU 41H ;Codice Scansione tasto Funzione F8 EQU 42H ;Codice Scansione tasto Funzione F9 EQU 43H ;Codice Scansione tasto Funzione F10 EQU 44H ;Codice Scansione tasto Funzione F11 EQU 85H ;Codice Scansione tasto Funzione F12 EQU 86H ;Codice Scansione tasto Funzione Canc EQU 53H ;Codice Scansione tasto Funzionale Del_ EQU 53H ;Codice Scansione tasto Funzionale Ins_ EQU 52H ;Codice Scansione tasto Funzionale Home EQU 47H ;Codice Scansione tasto Funzionale Fine EQU 4FH ;Codice Scansione tasto Funzionale End_ EQU 4FH ;Codice Scansione tasto Funzionale PgDn EQU 51H ;Codice Scansione tasto Funzionale PgUp EQU 49H ;Codice Scansione tasto Funzionale FrDn EQU 50H ;Codice Scansione tasto Funzionale FrUp EQU 48H ;Codice Scansione tasto Funzionale 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 EsE009 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP EsE009 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH Frase01 DB "Collaudo della tua Tastiera",00H Frase02 DB " Premi un tasto qualunque e controlla l'esito ",00H Frase03 DB "TUTORIAL ASSEMBLY ~ESPERTI~ --- Copyright" DB " www.Giobe2000.it --- aprile 2009",00H Frase04 DB " Per vedere le lettere Maiuscole e/o Minuscole",00H Frase05 DB " prova a premere il tasto di estensione ~Shift~",00H Frase06 DB " I tasti ~Ctrl~, ~Alt~ e ~AltGr~ non sono rilevati",00H Frase07 DB " Questa versione non rileva i tasti ~F11~ e ~F12~",00H Frase08 DB "Hai premuto ~Esc~... " DB "Premi un tasto qualunque per terminare ",00H Frase09 DB " Il tasto ~BlocNum~ (angolo in alto a sinistra del",00H Frase10 DB " tastierino numerico) alterna ~numeri~ e funzioni",00H Frase11 DB " **** Premi ~Esc~ per terminare il programma ****",00H Frase12 DB " ",00H Msg_TAB DB " Premuto il Tasto di Controllo ",00H Msg_BkSp DB " Premuto il Tasto di Controllo ",00H Msg_CR DB "Premuto il Tasto di Controllo , Carriage Return",00H Msg_LF DB " Premuto il Tasto di Controllo , Line Feed ",00H Msg_ESC_ DB " Premuto il Tasto di Controllo ",00H Msg_F1 DB " Premuto il Tasto Funzione ",00H Msg_F2 DB " Premuto il Tasto Funzione ",00H Msg_F3 DB " Premuto il Tasto Funzione ",00H Msg_F4 DB " Premuto il Tasto Funzione ",00H Msg_F5 DB " Premuto il Tasto Funzione ",00H Msg_F6 DB " Premuto il Tasto Funzione ",00H Msg_F7 DB " Premuto il Tasto Funzione ",00H Msg_F8 DB " Premuto il Tasto Funzione ",00H Msg_F9 DB " Premuto il Tasto Funzione ",00H Msg_F10 DB " Premuto il Tasto Funzione ",00H Msg_F11 DB " Premuto il Tasto Funzione ",00H Msg_F12 DB " Premuto il Tasto Funzione ",00H Msg_Canc DB " Premuto il Tasto Funzionale ",00H Msg_Del_ DB " Premuto il Tasto Funzionale ",00H Msg_Ins_ DB " Premuto il Tasto Funzionale ",00H Msg_Home DB " Premuto il Tasto Funzionale ",00H Msg_Fine DB " Premuto il Tasto Funzionale ",00H Msg_End_ DB " Premuto il Tasto Funzionale ",00H Msg_PgDn DB " Premuto il Tasto Funzionale ",00H Msg_PgUp DB " Premuto il Tasto Funzionale ",00H Msg_FrDn DB " Premuto il Tasto Funzionale ",00H Msg_FrUp DB " Premuto il Tasto Funzionale ",00H Msg_FrSn DB " Premuto il Tasto Funzionale ",00H Msg_FrDx DB " Premuto il Tasto Funzionale ",00H Msg_Std1 DB " Premuto il Tasto Standard Lettera Maiuscola ~",00H Msg_Std2 DB " Premuto il Tasto Standard Lettera Minuscola ~",00H Msg_Std3 DB " Premuto il Tasto Standard Numerico ~",00H Msg_Std4 DB " Premuto il Tasto Standard con Simbolo ~",00H Msg_ext DB " Premuta combinazione ALT- con Simbolo ~",00H spazi DB "~ ",00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Uscita | ;| DESCRIZIONE : Per dare un segnale "visibile" cancella i testi delle Info | ;| quando il programma sta per terminare | ;\---------------------------------------------------------------------------/ Uscita: M_msgC Frase12, 6,12,0FH M_msgC Frase12, 7,12,0FH M_msgC Frase12, 9,12,0EH M_msgC Frase12,10,12,0EH M_msgC Frase12,12,12,0FH M_msgC Frase12,13,12,0FH M_msgC Frase12,15,12,0FH M_msgC Frase08,23,8,1FH; "premuto tasto ~Esc~. Un tasto per terminare" CALL KEYwait RET ;/---------------------------------------------------------------------------\ ;| 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,26,1FH; "Collaudo della tua Tastiera" M_msgC Frase03,24,1,04H ; Stampa il copyright sulla riga 24, colonna 2 ; in rosso su nero (codice 04H) M_msgC Frase07, 6,12,0FH; "Questa versione non rileva ~F11~ e ~F12~" M_msgC Frase06, 7,12,0FH; "~Ctrl~ ~Alt~ ~AltGr~ non sono rilevati" M_msgC Frase04, 9,12,0EH; "Per vedere le Maiuscole e/o Minuscole" M_msgC Frase05,10,12,0EH; "prova a premere il tasto ~Shift~" M_msgC Frase09,12,12,0FH; "Il tasto ~BlocNum~ (angolo in alto a sinistra" M_msgC Frase10,13,12,0FH; "tastierino) alterna ~numeri~ e funzioni" M_msgC Frase11,15,12,0EH; "premuto tasto ~Esc~. Un tasto per terminare" LEA SI,Frase02 ; "Premi un tasto per terminare" M_COLOR 1FH ; La stampa del messaggio Š effettuata dentro RET ; il Main Loop, tra poco ;***************************************************************************** ; ---------------------------------------------- EsE009 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- CALL DeskTop ;Impostazione della pagina interattiva Servizio:M_CURSOR 23,15 ; La stampa del messaggio corrente CALL BIOSmsg ; xxx00: CALL KEYwait ;Rimane in attesa di tasti premuti ;---------------------------------------------------------------------- CMP AL,00H ;Codice Ascii=00H >> Tasto FUNZIONALE !!! JNZ xxx01 JMP ServFunz ;---------------------------------------------------------------------- xxx01: LEA SI,Msg_TAB CMP AL,TAB ;Codice Ascii tasto JZ Servizio ;---------------------------------------------------------------------- LEA SI,Msg_BkSp CMP AL,BkSp ;Codice Ascii tasto JZ Servizio ;---------------------------------------------------------------------- LEA SI,Msg_CR CMP AL,CR ;Codice Ascii tasto , Carriage Return JZ Servizio ;---------------------------------------------------------------------- LEA SI,Msg_LF CMP AL,LF ;Codice Ascii tasto , Line Feed JZ Servizio ;---------------------------------------------------------------------- LEA SI,Msg_ESC_ CMP AL,ESC_ ;Codice Ascii tasto JZ _OUT ;---------------------------------------------------------------------- LEA SI,Msg_ext ;"Premuta combinazione ALT- con Simbolo" CMP AL,' ' JB Servizio1 ;---------------------------------------------------------------------- LEA SI,Msg_Std4 ;"Premuto il Tasto Standard con Simbolo" CMP AL,'0' JB Servizio1 ;---------------------------------------------------------------------- LEA SI,Msg_Std3 ;"Premuto il Tasto Standard Numerico" CMP AL,'9' JBE Servizio1 ;---------------------------------------------------------------------- LEA SI,Msg_Std4 ;"Premuto il Tasto Standard con Simbolo" CMP AL,'A' JB Servizio1 ;---------------------------------------------------------------------- LEA SI,Msg_Std1 ;"Premuto il Tasto Standard Lettera Maiuscola" CMP AL,'Z' JBE Servizio1 ;---------------------------------------------------------------------- LEA SI,Msg_Std4 ;"Premuto il Tasto Standard con Simbolo" CMP AL,'a' JB Servizio1 ;---------------------------------------------------------------------- LEA SI,Msg_Std2 ;"Premuto il Tasto Standard Lettera Minuscola" CMP AL,'z' JBE Servizio1 ;---------------------------------------------------------------------- LEA SI,Msg_Std4 ;"Premuto il Tasto Standard con Simbolo" CMP AL,80H ; (primo carattere Ascii esteso) JB Servizio1 ;---------------------------------------------------------------------- LEA SI,Msg_ext ;"Premuta combinazione ALT- con Simbolo" ;(prosegue attraverso "Servizio1"...) ;---------------------------------------------------------------------- Servizio1:PUSH AX M_CURSOR 23,15 ; La stampa del messaggio corrente CALL BIOSmsg ; POP AX CALL BIOchr1 M_msgN spazi JMP xxx00 ;Rientra in attesa di ulteriori tasti premuti ;---------------------------------------------------------------------- _OUT: CALL Uscita ; "premuto ~Esc~ o ~Q~. Un tasto per terminare" 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 : ServFunz | ;| DESCRIZIONE : Verifica la pressione dei possibili tasti FUNZIONALI. | ;| Non si tratta di una procedura ma un supplemento d'indagine | ;| al termine della quale si deve rientrare nel Main Loop, | ;| a livello "Servizio", con JMP e non con RET | ;\---------------------------------------------------------------------------/ ServFunz: LEA SI,Msg_F1 CMP AH,F1 ;Codice Scansione tasto Funzione JNZ Serv00 JMP Servizio ;---------------------------------------------------------------------- Serv00: LEA SI,Msg_F2 CMP AH,F2 ;Codice Scansione tasto Funzione JNZ Serv01 JMP Servizio ;---------------------------------------------------------------------- Serv01: LEA SI,Msg_F3 CMP AH,F3 ;Codice Scansione tasto Funzione JNZ Serv02 JMP Servizio ;---------------------------------------------------------------------- Serv02: LEA SI,Msg_F4 CMP AH,F4 ;Codice Scansione tasto Funzione JNZ Serv03 JMP Servizio ;---------------------------------------------------------------------- Serv03: LEA SI,Msg_F5 CMP AH,F5 ;Codice Scansione tasto Funzione JNZ Serv04 JMP Servizio ;---------------------------------------------------------------------- Serv04: LEA SI,Msg_F6 CMP AH,F6 ;Codice Scansione tasto Funzione JNZ Serv05 JMP Servizio ;---------------------------------------------------------------------- Serv05: LEA SI,Msg_F7 CMP AH,F7 ;Codice Scansione tasto Funzione JNZ Serv06 JMP Servizio ;---------------------------------------------------------------------- Serv06: LEA SI,Msg_F8 CMP AH,F8 ;Codice Scansione tasto Funzione JNZ Serv07 JMP Servizio ;---------------------------------------------------------------------- Serv07: LEA SI,Msg_F9 CMP AH,F9 ;Codice Scansione tasto Funzione JNZ Serv08 JMP Servizio ;---------------------------------------------------------------------- Serv08: LEA SI,Msg_F10 CMP AH,F10 ;Codice Scansione tasto Funzione JNZ Serv09 JMP Servizio ;---------------------------------------------------------------------- Serv09: LEA SI,Msg_F11 CMP AH,F11 ;Codice Scansione tasto Funzione JNZ Serv10 JMP Servizio ;---------------------------------------------------------------------- Serv10: LEA SI,Msg_F12 CMP AH,F12 ;Codice Scansione tasto Funzione JZ Servizio ;---------------------------------------------------------------------- Serv11: LEA SI,Msg_Canc CMP AH,Canc ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv12: LEA SI,Msg_Del_ CMP AH,Del_ ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv13: LEA SI,Msg_Ins_ CMP AH,Ins_ ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv14: LEA SI,Msg_Home CMP AH,Home ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv15: LEA SI,Msg_Fine CMP AH,Fine ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv16: LEA SI,Msg_End_ CMP AH,End_ ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv17: LEA SI,Msg_PgDn CMP AH,PgDn ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv18: LEA SI,Msg_PgUp CMP AH,PgUp ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv19: LEA SI,Msg_FrDn CMP AH,FrDn ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv20: LEA SI,Msg_FrUp CMP AH,FrUp ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv21: LEA SI,Msg_FrSn CMP AH,FrSn ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- Serv22: LEA SI,Msg_FrDx CMP AH,FrDx ;Codice Scansione tasto Funzionale JZ Servizio ;---------------------------------------------------------------------- JMP xxx00 ;Codice Scansione non previsto: Rientra in ;attesa di ulteriori tasti premuti EsE009 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare