PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (maggio 2003) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : CambiaCu.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : maggio 2003 | ;| DESCRIZIONE : Programma per la modifica delle dimensioni del cursore. | ;| PoichŠ la dimensione del cursore dipende dall'adattatore e| ;| dal Modo Video corrente, il programma suppone di disporre di| ;| adattatore VGA, con 16 linee di scansione disponibili nella| ;| matrice di punti destinata ad ospitare ciascun carattere;| ;| la Griglia di selezione sar… dunque tarata con 16 numeri sia| ;| sulle ordinate y che sulle ascisse x, in modo da consentire| ;| la predisposizione e la scelta della dimensione desiderata| ;| per il cursore. | ;| | ;| La dimensione desiderata pu• essere selezionata con facilit…| ;| muovendosi sulla Griglia con frecce di direzione: | ;| 1) in senso orizzontale le linee di scansione aumentano da| ;| sinistra verso destra, e viceversa | ;| 2) in senso verticale le linee di scansione aumentano dal| ;| basso verso l'alto, e viceversa | ;| | ;| La massima dimensione ("Ű", 16 linee di scansione) si ha nel| ;| punto 1-1 (angolo in alto a sinistra della Griglia) e la| ;| minima nei punti 1-16 (in alto a destra, solo trattino in| ;| alto) e 16-1 (in basso a sinistra, solo trattino in basso). | ;| | ;| Con si torna al DOS con il nuovo cursore. | ;| La Barra Spaziatrice mostra l'effetto delle nuove dimensioni| ;| del Cursore su di un testo predisposto appositamente. | ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: 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 LF EQU 10 CR EQU 13 ; 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 STAsp:NEAR EXTRN RamCur:NEAR EXTRN BIOSmsg:NEAR EXTRN BIOchr1:NEAR EXTRN Byt2Dec:NEAR PUBLIC CambiaCu PUBLIC ATTRIB ;Attributo di colore ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP CambiaCu ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH Rig DB 20 Col DB 18 Testo0 DB 'Controllo della Dimensione del Cursore',00H Testo1 DB "TUTORIAL ASSEMBLY --- www.Giobe2000.it --- Copyright 2003",00H Griglia0 DB ' Cambia la Dimensione spostandoti con le Frecce ',00H Griglia1 DB ' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ',00H Griglia2 DB ' ',00H Griglia3 DB ' Per terminare il programma conferma con Invio ',00H Testo3 DB 'Linea di partenza (in alto): ',00H Testo4 DB 'Linea di arrivo (in basso): ',00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;|PROCEDURA: BARRA | ;|DESCRIZIONE: Stampa un'intera riga di 80 spazi colorati. | ;\---------------------------------------------------------------------------/ BARRA: PUSH AX PUSH CX MOV CX,80 MOV AL,' ' Barra0: CALL BIOchr1 LOOP Barra0 POP CX POP AX RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : DeskTop | ;|DESCRIZIONE: Procedura che inizializza completamente il piano di lavoro.| ;\---------------------------------------------------------------------------/ DeskTop:CALL BIOScls ;Pulisce lo schermo M_COLOR 1FH ; M_CURSOR 0,0 ; CALL BARRA ; M_CURSOR 24,0 ; Predispone le barre del Titolo (in alto) e del CALL BARRA ; Menu (in basso) M_msgC Testo0, 0,20,1FH; M_msgC Testo1,24,11,1FH; M_msgC Griglia0, 3,13,31H; Prime tre righe della Griglia, con la taratura M_msgC Griglia1, 4,13,1EH; orizzontale MOV CX,16 ; MOV DH,5 ; 16 Righe centrali della Griglia, Desk_1: M_msgC Griglia2,DH,13,1FH; attualmente vuote INC DH ; LOOP Desk_1 ; M_msgC Griglia3,DH,13,31H;Riga finale della Griglia MOV CX,16 ; MOV DH,5 ; MOV DL,15 ; Desk_2: M_CURSOR DH,DL ; MOV AL,17 ; SUB AL,CL ; CMP AL,9 ; JNE Desk_3 ; Provvede alla taratura della colonna sinistra DEC DL ; della Griglia Desk_3: M_COLOR 1EH ; CALL Byt2Dec ; INC DH ; LOOP Desk_2 ; MOV BP,16 ; Predispone la Griglia di messa a punto della MOV DL,17 ; dimensione del Cursore; la dimensione pu• M_COLOR 0FH ; essere selezionata muovendosi con frecce di MOV CX,16 ; direzione: Desk_4: PUSH CX ; #) in senso orizzontale le linee di scansione MOV DH,5 ; aumentano da sinistra verso destra e viceversa MOV CX,BP ; #) in senso verticale le linee di scansione Desk_5: M_CURSOR DH,DL ; aumentano dal basso verso l'alto, e viceversa CALL STAsp ; MOV AL,"ú" ; La massima dimensione (16 linee di scansione) CALL BIOchr1 ; si ha nel punto 1-1 (angolo in alto a sinistra CALL STAsp ; della Griglia) e la minima nei punti 1-16 (in INC DH ; alto a destra, solo trattino in alto) e 16-1 LOOP Desk_5 ; (in basso a sinistra, solo trattino in basso) POP CX ; DEC BP ; Marca in nero le possibili posizioni per il ADD DL,3 ; Cursore, nella fase di messa a punto LOOP Desk_4 ; M_msgC Testo3,18,32,1FH; Linea di partenza (in alto): ' M_msgC Testo4,19,32,1FH; Linea di arrivo (in basso): ' RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : ChkPos | ;|DESCRIZIONE: Verifica se nella posizione puntata c'Š il carattere "ú" | ;\---------------------------------------------------------------------------/ ChkPos: CALL RamCur MOV AL,ES:[DI] CMP AL,"ú" RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Forma | ;|DESCRIZIONE: Formatta il Cursore HardWare con le NUOVE dimensioni generando| ;| i numeri di linea Iniziale e Finale a partire dalla posizione| ;| attualmente occupata (come al solito da DH=riga, DL=colonna). | ;| Usa poi la Funzione 01H (INT 10H) per fissare la dimensione, e| ;| la Funzione 02H (INT 10H) = M_CURSOR per fissare la posizione.| ;\---------------------------------------------------------------------------/ Forma: PUSH DX MOV CS:[Rig],DH ; Formatta la dimensione del cursore in funzione MOV CS:[Col],DL ; della sua posizione attuale, DH=riga, DL=colon ; I parametri per la Dimensione sono lasciati in MOV CH,DH ; CH=linea partenza da 0 in alto a 15 in basso SUB CH,5 ; CL=linea d'arrivo da 0 in alto a 15 in basso MOV AH,00H ; /-------*-----------------*--------*---------\ MOV AL,DL ; |Griglia| Aspetto |partenza|arrivo | MOV CL,3 ; *-------*-----------------*--[alto]*-[basso]-* DIV CL ; | 1- 1 |CARATTERE PIENO| CH = 0 | CL =15 | SUB AL,6 ; | 1-16 |TRATTINO IN ALTO| CH = 0 | CL = 0 | MOV CL,15 ; | 16- 1 |TRATTINO IN BASSO| CH =15 | CL =15 | SUB CL,AL ; \-------*-----------------*--------*---------/ MOV AH,01H ; Funzione BIOS che fissa la dimensione del cur- INT 10H ; sore linea partenza in CH, linea finale in CL M_COLOR 1EH M_CURSOR 18,62 ; MOV AL,CH ; CMP AL,9 ; Stampa, in Giallo su blu, il valore del numero JG Form_1 ; di linea di partenza del cursore, da AL=CH CALL STAsp ; Form_1: CALL Byt2Dec ; M_CURSOR 19,62 ; MOV AL,CL ; CMP AL,9 ; Stampa, in Giallo su blu, il valore del numero JG Form_2 ; di linea di arrivo del cursore, da AL=CL CALL STAsp ; Form_2: CALL Byt2Dec ; POP DX M_CURSOR DH,DL ; Mostra il cursore nel punto giusto RET ;***************************************************************************** ; ---------------------------------------------- CambiaCu proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- MOV AX,0B800H ;Sovrappone il segmento ES:0000 sull'area della MOV ES,AX ;RAMvideo (da B800:0000 in poi......) CALL DeskTop ;Predispone i messaggi e la Griglia ; Funzione BIOS che verifica la possibilit… da ; parte della ROM BIOS di impostare adeguatamen- MOV AH,12H ; te le sue linee di partenza e di arrivo con MOV AL,01H ; cui Š costruito il Cursore, in accordo con MOV BL,34H ; l'altezza del carattere usato nel modo testo INT 10H ; corrente; con AL=01H l'emulazione CGA del Cur- ; sore Š disabilitata ed Š possibile gestire ; ogni linea tra quelle del carattere corrente; ; con AL=00H invece (emulazione CGA abilitata) ; non tutte le scelte possibili sono assicurate! MOV DH,20 ; Fissa la Posizione Iniziale del Cursore HW ai MOV DL,18 ; valori 20 (DH = riga), 18 (DL = colonna) MOV CH,15 ; Fissa la Dimensione Iniziale del Cursore HW ai MOV CL,15 ; valori 15 (CH = linea di partenza in alto) ; 15 (CL = linea d'arrivo in basso) ; Fissa la nuova Dimensione del Cursore hardware xxx00: CALL Forma ; nel range CH (=linea di partenza) e CL (=linea ; finale) e mostra il cursore nel punto giusto xxx01: CALL KEYwait ; Rimane in attesa di tasti premuti ;---------------------------------------------------------------------- CMP AL,00H ; Si tratta di tasto funzionale JE Serv_Fr ;---------------------------------------------------------------------- CMP AL,CR ; Premuto : viene imposto un ritorno JE _OUT ; immediato al sistema operativo JMP SHORT xxx01 ; Se il tasto Š indesiderato si torna in attesa ;---------------------------------------------------------------------- Serv_Fr:MOV DH,CS:[Rig] ; Recupera la Posizione corente del Cursore HW MOV DL,CS:[Col] ; in DH (riga), DL (colonna) CMP AH,FrDn ;Codice Scansione tasto Funzionale JNE Serv_F1 INC DH CALL ChkPos JE xxx00 DEC DH JMP SHORT xxx00 ;---------------------------------------------------------------------- Serv_F1:CMP AH,FrUp ;Codice Scansione tasto Funzionale JNE Serv_F2 DEC DH CALL ChkPos JE xxx00 INC DH JMP SHORT xxx00 ;---------------------------------------------------------------------- Serv_F2:CMP AH,FrSn ;Codice Scansione tasto Funzionale JNE Serv_F3 SUB DL,3 CALL ChkPos JE xxx00 ADD DL,3 JMP SHORT xxx00 ;---------------------------------------------------------------------- Serv_F3:CMP AH,FrDx ;Codice Scansione tasto Funzionale JNE xxx01 ;Se il tasto Š indesiderato si torna in attesa ADD DL,3 CALL ChkPos JE xxx00 SUB DL,3 JMP xxx00 ;---------------------------------------------------------------------- _OUT: MOV AH,12H ; MOV AL,00H ; Ripristina le dimensioni normali del Cursore MOV BL,34H ; INT 10H ; 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 ; CambiaCu ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare