PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo .COM (marzo 1994) SUBTTL** GiobeCOM.ASM - File di intestazione programmi - by ing. G.OBER ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ NOME : FVIEW.ASM ³ ;³ AUTORE : Mirko MANEA (IN000071) ³ ;³ VERSIONE : Maggio 1994 ³ ;³ REVISIONE : Giugno 1994 ³ ;³ DESCRIZIONE : Visualizzatore di files ASCII ³ ;³ ³ ;³ ÚÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ;³ ³ATTENZIONE³ Il programma creato Š di tipo ³ NEAR ³ ³ ;³ ÀÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; COSTANTI DEFINITE PER IL PROGRAMMA: ESC_ EQU 27 ;Esempio per il codice del tasto CR EQU 0DH ;Tasto INVIO LF EQU 0AH ;Line Feed TAB_KEY EQU 09H ;Tabulazione orizzontale FLUNG EQU 1EH ;Lunghezza=13, cio‚: filename.ext + 17 per path BytLETTI EQU 007FH ;Legge 7FH=128 bytes ; MACRO UTILIZZATE DAL PROGRAMMA: if1 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ include C:\MIRKO\ARCH-LAB\GIOBE.MAC ;³ endif ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÚÄÄÄÄ¿ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³PROCEDURE ESTERNE ³NEAR³ UTILIZZATE dal PROGRAMMA (dalla LIBRERIA GIOBE.LIB~)³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÀÄÄÄÄÙÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ EXTRN KEYwait:NEAR EXTRN BEEP:NEAR EXTRN CLEAR:NEAR EXTRN VIA_cur:NEAR EXTRN RIP_cur:NEAR EXTRN SET_cur:NEAR ;(usata dalla MACRO M_CURSOR) EXTRN STAstr:NEAR EXTRN STAchr1:NEAR EXTRN Acapo:NEAR ;(serve quando si legge il file) ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC FVIEW ;***************************************************************************** ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³DEFINIZIONE DEL SEGMENTO DEL CODICE (Vedi ALTERNATIVE in Appendice) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H ;** Origine per files INTRAsegmentali di tipo .COM ** ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ INIZIO: JMP FVIEW ;³Inizio effettivo del programma (vengono saltate le³ ;³variabili del programma e le eventuali procedure³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³AREA DESTINATA AI DATI DEL PROGRAMMA ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ TITOL1 DB "FILE VIEWER di Mirko MANEA (IN000071) per A.d.E. Lab.",00H TITOL2 DB "Universit… degli Studi di VERONA - A.A. 1993/1994",00H TITOL3 DB "Premere un tasto per continuare",00H INSFIL DB "File da visualizzare: ",00H INSFIL2 DB "(INVIO per uscire)",00H PREMI DB "--- Premere INVIO per continuare o Q per uscire ---",00H PREMIQ DB "--- Premere Q per uscire ---",00H FERR02H DB "File non trovato! Riprova",00H FERR03H DB "Percorso non valido ! Riprova",00H FERRXXH DB "Errore non previsto ! Riprova",00H ERRORE DB 00H FNAME DB FLUNG DB 00H DB FLUNG-1 DUP (' ') DB 0DH BUFFER DB BytLETTI DB 00H DB BytLETTI-1 DUP (' ') DB 00H NOME DB FLUNG,00H BytEFF DW BytLETTI FINITO DB 00H FINE_Q DB 00H FINE_EN DB 00H ECC_lf DB 00H TAB DB 8,16,24,32,40,48,56,64,72 ATTRIB DB 00H ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : Aspetta ³ ;³ DESCRIZIONE : Fa aspettare BX ticks. Questa procedura utilizza il timer ³ ;³ di sistema: ottiene i tick attuali, li somma a BX e cicla ³ ;³ finche' il contenuto di 0000:046CH (ora attuale) non e' ³ ;³ uguale alla loro somma (18.2 ticks ogni secondo) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Aspetta: PUSH AX PUSH CX PUSH DX PUSH DI PUSH DS MOV AH,00H ;Servizio System-Timer Time counter INT 1AH ADD DX,BX ;Numero di conteggi da raggiungere MOV AX,0000H ;Segmento del clock timer MOV DS,AX MOV DI,046CH ;Offset del clock timer Tempo: CMP DX,[DI] ;Vede se i ticks effettivi sono arrivati ;a quelli che attendiamo JNZ Tempo ;Ciclo a vuoto di pausa POP DS POP DI POP DX POP CX POP AX RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : FLeggi ³ ;³ DESCRIZIONE : Legge una stringa (che sar… il filename.ext) --> DS:DX ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ FLeggi: LEA DX,FNAME MOV AH,0CH ;Pulisce FNAME e poi MOV AL,0AH ;chiama il servizio di lettura bufferizzata INT 21H ;Legge la stringa LEA DI,FNAME MOV AL,FLUNG ;Lunghezza max in AL MOV AH,[DI+1] ;Numero caratteri inseriti, in AH CMP AH,00H ;Se il numero di caratteri e' zero, ossia JZ FLeg_END ;e' stato premuto INVIO, esce PUSH AX XOR BH,BH ;Azzero BH XOR CH,CH ;Azzero CH MOV BL,AH ;Inizializza indice BX al num dei caratteri letti MOV CL,AL ;Metto nel counter il numero di spazi POP AX SUB AL,AH ;In AL ho il num di spazi da mettere Blank: MOV [DI+2+BX], BYTE PTR ' ' ;Mette lo spazio a partire da BX=num spazi INC BX ;Incrementa l'indice LOOP Blank ;Cicla MOV [DI+2+BX],BYTE PTR 00H ;Mette il terminatore alla stringa JMP SHORT FL_END FLeg_END: MOV FINE_EN,01H FL_END: RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : FError ³ ;³ DESCRIZIONE : Gestione degli errori del file ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ FError: PUSH AX ;Bisogna salvare praticamente tutti i PUSH BX ;registri in quanto questa funzione del DOS PUSH CX ;ne fa perdere il contenuto PUSH DX PUSH SI PUSH DI PUSH ES PUSH DS CALL VIA_cur M_CURSOR 10,10 MOV AH,59H ;Servizio di EXTENDED ERRORS MOV BX,0000H ;Inizializzazione INT 21H CMP AX,02H ;Vede se e' un errore di FILE NOT FOUND JZ Err02H ;Se si, salta alla routine di gestione CMP AX,03H ;Vede se e' un errore di PATH NOT FOUND JZ Err03H ;Se si, salta alla routine di gestione JMP SHORT FErr_END ;Gli altri errori non sono gestiti, ma ;comunque vengono segnalati Err02H: LEA SI,FERR02H ;File non trovato CALL STAstr JMP SHORT FErr_END Err03H: LEA SI,FERR03H ;Percorso non valido CALL STAstr JMP SHORT FErr_END ErrXXH: LEA SI,FERRXXH ;Tutti gli altri errori CALL STAstr FErr_END: CALL BEEP MOV BX,12H ;Circa un secondo CALL Aspetta ;Aspetta BX counts (18.2 / 12H = 1 sec) CALL RIP_cur POP DS POP ES POP DI POP SI POP DX POP CX POP BX POP AX RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : FOpen ³ ;³ DESCRIZIONE : Apre un file puntato da DS:DX e ritorna in BX il fildes ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ FOpen: LEA DX,FNAME+02H MOV AH,3DH MOV AL,00H ;Apre in compatibility mode INT 21H MOV BX,AX ;Mette il fildes in BX RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : FRead ³ ;³ DESCRIZIONE : Legge un file con fildes in BX per CX bytes e mette in DS:DX³ ;³ Si ha lo spostamento automatico del puntatore di BytEFF ³ ;³ bytes ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ FRead: PUSH AX LEA DX,BUFFER MOV AH,3FH MOV CX,BytEFF ;Legge BytEFF(ETTIVI) bytes INT 21H POP AX RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : FClose ³ ;³ DESCRIZIONE : Chiude il file aperto con il fildes in BX ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ FClose: MOV AH,3EH INT 21H RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : GET_cur ³ ;³ DESCRIZIONE : Restituisce in DH=riga e DL=colonna ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ GET_cur: PUSH AX PUSH BX PUSH CX MOV AH,03H ;Servizio per ottenere la posizione del cursore MOV BH,00H ;Pagina zero INT 10H POP CX POP BX POP AX RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : GET_lun ³ ;³ DESCRIZIONE : Restituisce in AX la lunghezza del file ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ GET_lun: MOV AH,42H MOV AL,02H MOV CX,0000H ;Mette il file pointer MOV DX,0000H ;all'ultima posizione INT 21H ;per ottenere la lunghezza PUSH AX MOV AH,42H MOV AL,00H MOV CX,0000H ;Mette il file pointer MOV DX,0000H ;alla prima posizione INT 21H ;per poter iniziare a leggere dall'inizio POP AX RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : CLEAR1 ³ ;³ DESCRIZIONE : Scrive direttamente in memoria video, cancellandola ³ ;³ ponendo degli spazi. E' piu' veloce della CLEAR ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ CLEAR1: PUSH AX PUSH DI PUSH ES PUSH CX MOV AX,0B800H ;Alla loc. 0B800H inizia la ram video a colori MOV ES,AX ;Metto l'inidirizzo in ES perche' serve a STOSW MOV DI,00H ;Indice inizializzato a 0 MOV AL,' ' ;AL=carattere (posizione PARI) MOV AH,[ATTRIB] ;AH=attributo (posizione DISPARI) MOV CX,07D0H ;Contatore (07D0H=>2000=80x25) CLD ;Fa incrementare il contatore (di 2 bytes) REP STOSW ;Memorizza in ES:DI <- AX, per CX volte M_CURSOR 0,0 ;Ripone il cursore a (0,0) POP CX POP ES POP DI POP AX RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : CHG_pag ³ ;³ DESCRIZIONE : Cambia la pagina di testo corrente ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ CHG_pag: PUSH AX PUSH BX PUSH CX PUSH SI CALL GET_cur ;Ottiene la posizione attuale del cursore CMP DH,18H ;Riga 24 JNZ CHG_end1 ;Se siamo arrivati alla riga 24, aspetta ;altrimenti esce dalla procedura CALL VIA_cur ;Fa sparire il cursore Riprova: LEA SI,PREMI M_COLOR 1AH ;Verde su sfondo nero M_CURSOR 24,14 CALL STAstr ;Esorta a premere INVIO per continuare ;oppure Q per finire M_COLOR 0EH ;Giallo su sfondo nero CALL KEYwait ;Fa aspettare AND AL,11011111B ;Converte in maiuscolo CMP AL,'Q' ;Se e' stato premuto Q, esce JZ CHG_end JMP SHORT NOquit ;Altrimenti vede se e' stato premuto ENTER CHG_end: MOV FINE_Q,01H ;Setta la variabile di uscita nel caso in cui ;sia stato premuto il tasto Q JMP SHORT CHG_endQ NOquit: CMP AL,0DH ;Testa il tasto ENTER grigio JZ CHG_endQ ;Se si, cambia pagina JMP SHORT Riprova CHG_endQ: CALL CLEAR1 ;Pulisce lo schermo CHG_end1: POP SI POP CX POP BX POP AX RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : CHK_TAB ³ ;³ DESCRIZIONE : Controlla se il carattere e' un TAB ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ CHK_TAB: PUSH DX PUSH SI MOV SI,0000H ;Inizializza l'indice CALL GET_cur ;Ottiene DH=riga, DL=colonna CLC ;Azzera il carry flag NO_TAB: CMP DL,TAB[SI] ;Vede in che posizione e' il TAB INC SI ;Incrementa l'indice JNC NO_TAB ;Se la posizione non e' minore di una ;di quelle fisse, avanza alla prossima DEC SI ;Decrementa il contatore per avere la ;posizione corretta MOV DL,TAB[SI] CALL SET_cur ;Pone il cursore alla posizione voluta dal TAB POP SI POP DX RET ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ PROCEDURA : StpFILE ³ ;³ DESCRIZIONE : Stampa a video il file ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ StpFILE: PUSH SI PUSH AX CMP BytEFF,01H ;Se il resto della divisione e' 1 JZ FINE ;allora esce CMP ECC_lf,01H ;Vede se si aveva finito prima di un lf JZ SIecc ;Se si, parte con l'indice a 1 MOV ECC_lf,00H ;Ri-azzera la condizione MOV SI,0000H ;Inizializza a zero l'indice di scorrimento JMP SHORT Cicla SIecc: MOV SI,0001H ;Eventualmente pone a 1 l'indice MOV ECC_lf,00H ;Ri-azzera la condizione Cicla: MOV AL,BUFFER[SI] ;Mette in AL il carattere di BUFFER+indice CMP AL,LF ;Controlla se il carattere e' un LF JZ SIcr ;Se si, incremeta SI e poi continua CMP AL,TAB_KEY ;Controlla se il carattere e' un TAB JZ SItab ;Se e' un TAB, posiziona correttamente il cursore CMP AL,CR ;Controlla se il carattere e' un cr JNZ NOcr ;Se non e' cr va a stampare il carattere CALL Acapo ;Va a nuova riga INC SI ;Incrementa l'indice CMP SI,BytEFF ;Guarda se ha finito di leggere JZ ECC ;Se si, esce nel caso che l'ultimo carattere ;sia un line feed JMP SHORT SIcr ;Salta evitando di stampare il carattere, ma ;comunque incrementa l'indice SItab: CALL CHK_TAB ;Invoca la routine di gestione del TAB JMP SHORT SIcr ;e poi continua il ciclo di stampa FineFile: CALL FClose ;Chiude il file MOV FINITO,01H ;Setta FINITO a 1 per indicare che si e' finito JMP FINE NOcr: CALL STAchr1 ;Stampa il carattere appena letto SIcr: INC SI ;Passa al successivo carattere CALL CHG_pag ;Chiama la routine di gestione dell'avanzamento CMP FINE_Q,01H ;Vede se e' stato premuta il tasto per uscire JZ FINE ;Se si, esce definitivamente CMP SI,BytEFF ;Guarda se ha finito di leggere JNZ Cicla ;Se non ha finito re-itera ECC: CMP AL,CR ;Vede se l'ultimo carattere e' un CR JZ Ges_ECC ;Se e' cosi pone la condizione vera JMP SHORT FINE Ges_ECC: MOV ECC_lf,01H ;Eventualmente si pone la condizione ;di ECCezzione per lf al valore vero FINE: POP AX POP SI RET ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿³ FVIEW proc NEAR ;³ AREA DEDICATA AL MAIN PROGRAM ³³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ PUSH CS ;³Dopo l'assunzione "ASSUME DS:_prog" operata ³ POP DS ;³a beneficio dell'assemblatore in fase di ³ ;³definizione dell'area destinata al codice ³ ;³(_prog SEGMENT BYTE PUBLIC 'CODE'), la zona ³ ;³DATI viene "fatta vedere" anche al æproces- ³ ;³sore come "inclusa nel SEGMENT "CS"; l'uso ³ ;³dell'operatore di "segment-override", ":", ³ ;³direttamente nelle istruzioni del programma, ³ ;³consente COMUNQUE di creare con correttezza ³ ;³il puntatore ad una determinata variabile (o ³ ;³etichetta); questa operazione permette di ³ ;³ignorare l'eventuale direttiva ASSUME ³ ;³attualmente corrente. ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;*********************************************** ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³Impostazione della pagina interattiva ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ CALL CLEAR ;Provvede comunque alla cancellazione del video, ;posizionando il cursore alla riga 0, colonna 0 CALL VIA_cur ;Rende il cursore invisibile M_COLOR 0EH ;Giallo su sfondo nero CORN_DOS 5 ;Cornice magenta M_CURSOR 4,10 LEA SI,TITOL1 ;Stampa l'intestazione CALL STAstr M_CURSOR 6,12 LEA SI,TITOL2 CALL STAstr M_CURSOR 15,20 LEA SI,TITOL3 CALL STAstr CALL KEYwait ;*********************************************** ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³Lettura del filename ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Err: CALL CLEAR1 ;Posizionamento del cursore per inizio lettura M_CURSOR 5,5 LEA SI,INSFIL CALL STAstr ;Stampa il msg di inserimento del filename M_CURSOR 6,6 LEA SI,INSFIL2 CALL STAstr ;Stampa il msg di INVIO per uscire M_CURSOR 5,28 CALL RIP_cur ;Visualizza il cursore CLC ;Resetta il carry flag CALL FLeggi ;Legge la stringa --> DS:DX CMP FINE_EN,01H ;Vede se e' stato premuto INVIO JZ fin ;per uscire (salto a fin dato che devo riferirmi ;ad un'altra etichetta poiche' il JZ e' tra ñ128) CALL FOpen ;Ritorna in BX il fildes JC GES_Err ;Se ci sono errori rilegge CALL VIA_cur ;Nascondi il cursore CALL CLEAR1 ;Pulisci lo schermo MOV FINITO,00H ;Inizializza la condizione di uscita CALL GET_lun ;Calcola la lunghezza del file e la pone in AX MOV CX,BytLETTI ;CX e' il divisore PUSH AX ;Salva la lunghezza del file DIV CX ;Divide la lunghezza del file per il BytLETTI ;e mette in AX il quoziente e in DX il resto MOV CX,AX ;Sposta il quoziente da AX in CX POP AX ;Ripristina la lunghezza del file CMP CX,0000H ;Vede se la lunghezza e' minore di BytLETTI JZ FCorto ;Se e' cosi', legge AX bytes ;************************************************ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³Lettura e stampa del file richiesto ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Ripeti: MOV BytEFF,BytLETTI ;Decide il numero di bytes effettivi da usare ;durante la lettura e la visualizzazione PUSH BX ;Salva il fildes PUSH CX ;Salva il numeri di cicli (lunghezza / BytLETTI) PUSH DX ;Salva il resto da leggere (lunghezza MOD BytLETTI) CALL FRead ;Legge il file con fildes CALL StpFILE ;Stampa il file POP DX ;Ripristina il resto POP CX ;Ripristina il numero di cicli POP BX ;Ripristina il fildes CMP FINE_Q,01H ;Vede se e' stato premuto il tasto Q fin: JZ _OUT ;Se si, esce LOOP Ripeti ;Continua a visualizzare finche' non ha mostrato ;tutto il file meno DX bytes (che e' il resto) MOV BytEFF,DX ;Come bytes effettivi, viene messo il resto CALL FRead ;Legge DX bytes CALL StpFILE ;Stampa DX bytes JMP SHORT xxx00 ;Esce FCorto: MOV BytEFF,AX ;I BytEFF sono minori dei BytLETTI CALL FRead ;In questo caso legge la lunghezza del file CALL StpFILE ;e la stampa di conseguenza JMP SHORT xxx00 ;Esce ;************************************************ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³Routine di gestione di un errore di filename ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ GES_Err:CALL FError ;Chiama la procedura di gestione avanzata degli JMP Err ;errori (GET EXTENDED ERRORS INFORMATION) ;*********************************************** ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³Attesa decisioni ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ xxx00: LEA SI,PREMIQ M_COLOR 1AH ;Verde su sfondo nero M_CURSOR 24,24 CALL STAstr ;Esorta a premere Q per uscire (alla fine) CALL FClose ;Chiude il file CALL VIA_cur ;Nasconde il cursore CALL KEYwait ;Rimane in attesa di tasti premuti e, quando AND AL,11011111B ;cio` e` vero, ne controlla il valore CMP AL,'Q' ;Se il tasto premuto e` "Q", viene imposto un JZ _OUT ;ritorno immediato al sistema operativo CALL BEEP ;Emette un BEEP per avvisare dell'avvenuta JMP SHORT xxx00 ;pressione di un tasto indesiderato e torna in ;attesa ;*********************************************** ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ _OUT: CORN_DOS 0 ;³Torna al DOS con la memoria liberata e con la³ PUSH AX ;³chiusura di tutti i file; cede il controllo³ CALL RIP_cur ;³al processo padre (generalmente COMMAND.COM);³ MOV DH,23 ;³il valore posto eventualmente in AL prima di³ MOV DL,0 ;³uscire pu• essere testato in uscita con la³ CALL SET_cur ;³funzione 4DH o mediante la lettura della va-³ POP AX ;³riabile DOS "ERRORLEVEL" ³ MOV AH,4CH ;³ ³ INT 21H ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ FVIEW ENDP ;³Chiusura standard del codice ³ _prog ENDS ;ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ END INIZIO ;³Chiusura del segmento di codice e conclusione³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ