PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2009) SUBTTL** EsE010.ASM - Esercizi PALESTRA ASSEMBLY ESPERTI - by ing. G.OBER ;/---------------------------------------------------------------------------\ ;| NOME : EsE010.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2009 | ;| DESCRIZIONE : Esercizio nø 0010 | ;| Progetto di un acquisizione di Numeri Decimali | ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: ESC_ EQU 1BH ;Codice Ascii tasto ; 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 EsE010 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP EsE010 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH Corn01 DB "ÚÄÄÄÂÄÄÄÂÄÄÄ¿",00H ; Corn02 DB "³ ³ ³ ³",00H ; Imposta le stringhe necessarie per Corn03 DB "ÃÄÄÄÅÄÄÄÅÄÄÄ´",00H ; traccare il riquadro predisposto ; "³ ³ ³ ³" ; a ricevere i numeri ; "ÃÄÄÄÅÄÄÄÅÄÄÄ´" ; ; "³ ³ ³ ³" ; Corn04 DB "ÃÄÄÄÁÄÄÄÁÄÄÄ´",00H ; NB: poichŠ gli elementi sono ripetitivi Corn05 DB "³ ³",00H ; basta definire solo quelli necessari Corn06 DB "ÀÄÄÄÄÄÄÄÄÄÄÄÙ",00H ; Titolo DB " PROGRAMMA PER L'ACQUISIZIONE " DB "DI SOLI NUMERI DECIMALI ",00H Menu DB " Premi un numero: " DB " [C]ancella [Q]uit ",00H CopyRgh DB "TUTORIAL ASSEMBLY ~ESPERTI~ --- Copyright" DB " www.Giobe2000.it --- aprile 2009",00H Vuota DB " ",00H Troppi1 DB "Hai completato il campo d'acquisizione",00H Troppi2 DB "Premi ~C~ o esci... ",00H Quante DB 00H ; Variabile locale con il numero corrente di ; cifre acquisite Prima DB '0' ; Variabile locale con il codice Ascii del ; numero premuto in precedenza ; Variabile locale con la coordinata colonna Colonna DB 20 ; del numero stampato in precedenza sulla barra ; interattiva Tab_Num DB '0',12,38 ; DB '1', 6,34 ; DB '2', 6,38 ; DB '3', 6,42 ; DB '4', 8,34 ; Predispone la Tabella con le coorinate di DB '5', 8,38 ; stampa dei numeri dentro la scacchiera DB '6', 8,42 ; DB '7',10,34 ; DB '8',10,38 ; DB '9',10,42 ; ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Ini_Num | ;| DESCRIZIONE : Inizializza i campi d'acquisizione dei numeri | ;\---------------------------------------------------------------------------/ Ini_Num: M_msgC Corn01, 5,32,0EH ; "ÚÄÄÄÂÄÄÄÂÄÄÄ¿" M_msgC Corn02, 6,32,0EH ; "³ ³ ³ ³" M_msgC Corn03, 7,32,0EH ; "ÃÄÄÄÅÄÄÄÅÄÄÄ´" M_msgC Corn02, 8,32,0EH ; "³ ³ ³ ³" M_msgC Corn03, 9,32,0EH ; "ÃÄÄÄÅÄÄÄÅÄÄÄ´" M_msgC Corn02,10,32,0EH ; "³ ³ ³ ³" M_msgC Corn04,11,32,0EH ; "ÃÄÄÄÁÄÄÄÁÄÄÄ´" M_msgC Corn05,12,32,0EH ; "³ ³" M_msgC Corn06,13,32,0EH ; "ÀÄÄÄÄÄÄÄÄÄÄÄÙ" MOV CX,10 ; M_COLOR 08H ; MOV AL,'0' ; Inserisce i numeri "spenti" dentro la Ini_0: CALL Num_Scac ; scacchiera INC AL ; LOOP Ini_0 ; M_msgC Menu,23,0,1FH ; Stampando il Menu sulla riga 23,colonna 0 ; pulisce anche il campo d'acquisizione in basso ; Inizializza la Variabile locale con la MOV CS:[Colonna],20; coordinata iniziale della colonna del ; numero da stampare sulla barra interattiva M_msgC Vuota,16,20,0FH; Cancella l'eventuale messaggio di raggiunto M_msgC Vuota,18,29,0FH; limite di cifre acquisite MOV CS:[Quante],0 ; Inizializza la Variabile locale con la ; il numero corrente di cifre acquisite M_CURSOR 23,CS:[Colonna]; Autorizza la visualizzazione del cursore nel CALL RIP_cur ; punto di stampa esatto sulla barra interattiva RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Desktop | ;| DESCRIZIONE : Stampa tutta l'immagine del piano di presentazione iniziale | ;\---------------------------------------------------------------------------/ Desktop:CALL BIOScls ; Provvede alla cancellazione del video, CALL VIA_cur ; posiziona il cursore alla riga 0, colonna 0 ; e rende il cursore invisibile ; Stampa il titolo contenuto nella cornice, a M_msgC Titolo,0,0,1FH ; partire da 0,0 (riga, colonna) in bianco ; brillante sui blu (codice 1FH) M_msgC CopyRgh,24,1,04H ; Stampa il copyright sulla riga 24, colonna 1 ; in rosso su nero (codice 04H) ; Inizializza i campi d'acquisizione dei numeri CALL Ini_Num ; e stampa il Menu sulla riga 23,colonna 0 ; in bianco brillante sui blu (codice 1FH) RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Num_Scac | ;| DESCRIZIONE : Visualizza la scacchiera il numero passato in ingresso in AL| ;| con il colore prememorizzato nella variabile [ATTRIB]. | ;\---------------------------------------------------------------------------/ Num_Scac: PUSH AX LEA DI,Tab_Num MOV AH, 3 SUB AL,'0' MUL AH ADD DI,AX POP AX MOV DH,CS:[DI+1] ; riga di stampa per il numero corrente MOV DL,CS:[DI+2] ; colonna di stampa per il numero corrente M_CURSOR DH,DL CALL BIOchr1 RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Key_Num | ;| DESCRIZIONE : Visualizza il numero passato in ingresso in AL sia dentro la| ;| tastierina che sulla di acquisizione in basso | ;\---------------------------------------------------------------------------/ Key_Num:CMP CS:[Quante],40 JNZ Key_N1 CALL VIA_cur ; M_msgC Troppi1,16,20,0FH; Avvisa che le cifre introdotte sono troppe! M_msgC Troppi2,18,29,0EH; M_Chr 'C',18,36,8EH ; RET ;-------------------------------------------------------------------- Key_N1: INC CS:[Quante] PUSH AX MOV AL,CS:[Prima] M_COLOR 08H CALL Num_Scac POP AX MOV CS:[Prima],AL M_COLOR 0FH CALL Num_Scac M_CURSOR 23,CS:[Colonna] CALL RIP_cur M_COLOR 1FH CALL BIOchr1 INC CS:[Colonna] RET ;***************************************************************************** ; ---------------------------------------------- EsE010 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- CALL Desktop ; Impostazione della pagina interattiva ; --------------------------------------------- xxx00: CALL KEYwait ; Rimane in attesa di tasti premuti ;--------------------------------------------------------------------- CMP AL,ESC_ ; Codice Ascii tasto JZ _OUT ; viene imposto il ritorno al sistema operativo ;---------------------------------------------------------------------- LEA DI,Tab_Num ; << Fissa il puntatore all'inizio della Tabella CMP AL,'0' ; JB xxx01 ; Codice Ascii tasto numerico, da "0" a "9" CMP AL,'9' ; JBE Serv_Num ; ;---------------------------------------------------------------------- xxx01: AND AL,11011111B ; <