HO STUDIATO UN PAIO DI MANUALI E MI SONO RISPOSTO DA ME GRAZIE UGUALMENTE
PER CHI DOVESSE TROVARSI NELLE MIE STESSE CIRCOSTANZE
ASPETTATE UN Pò NON L'HO NCORA CONSEGNATOO
;definizione costanti
PAGINA EQU 00h
;
BIOS_VIDEO EQU 10H
SET_VIDEO_MODE EQU 00h
MODO_TESTO EQU 03H
;
SET_CURSOR EQU 02h
W_CHR_TTY EQU 0Eh
;
DOS EQU 21H
PRINT_STRING EQU 09H
DSEG SEGMENT PARA PUBLIC 'DATA'
BASE DB 3
R DB 15
C DB 40
SI_NO DB ' VUOI FARE LO ZOOM? (U=ESC) [S/N]: $'
LIMITE DB ' NON POSSO RIDURRE NOTEVOLMENTE $'
DSEG ENDS
STACKM SEGMENT PARA STACK 'STACK'
DB 64 DUP('12345678')
STACKM ENDS
ASSUME CS:CSEG,DS:DSEG,SS:STACKM
CSEG SEGMENT PARA PUBLIC 'CODE'
;------------------------MAIN---------------------------------------;
MAIN PROC FAR
PUSH DS
MOV AX,00h
PUSH AX
MOV AX,DSEG ;INIZIALIZZAZIONE SEGMENTO DATI
MOV DS,AX ;TRAMITE IL REGISTRO AX.
MOV AH,SET_VIDEO_MODE ;SERVIZIO BIOS 'SET VIDEO MODE':
MOV AL,MODO_TESTO ;MODO TESTO 80X25, COLORI
INT BIOS_VIDEO ;
CALL TRIANGOLO
ESCI:
RET
MAIN ENDP
;----------------------PROCEDURE-------------------------------------------;
;--------------------------------------------------------------------------;
; Procedura oper stampare una stringa ;
; ;
;PARAMETRI: l'indirizzo della stringa e' memorizzato in DS:DX ;
;REGISTRI UTILIZZATI:AH,DX ;
;--------------------------------------------------------------------------;
STAMPA_STRINGA PROC NEAR
MOV AH,PRINT_STRING ;servizio dos 'print string';
INT DOS ;la stringa Š puntata da DS:DX
RET
STAMPA_STRINGA ENDP
;--------------------------------------------------------------------------;
; procedura per spostare il cursore ;
;PARAMETRI: le coordinate della posizione del cursore sono memorizzate nel ;
; registro DX: DH riga, DL colonna. ;
;VARIABILI: il numero della pagina Š memorizzato in PAGINA ;
;REGISTRI UTILIZZATI:AH,BH ;
;--------------------------------------------------------------------------;
SPOSTA_CURSORE PROC NEAR
MOV BH, PAGINA ;pagina video attiva.
MOV AH,SET_CURSOR ;servizio BIOS 'set Cursor Position'
INT BIOS_VIDEO
RET ;ritorna alla procedura chiamante
SPOSTA_CURSORE ENDP
;--------------------------------------------------------------------------;
; PROCEDURA PER SCEGLIERE SE FARE LO ZOOM O NO ;
;--------------------------------------------------------------------------;
SCELTA PROC NEAR
MOV DX,1500h ;IMPOSTA RIGA (DH) E LA COLONNA (DL)
CALL SPOSTA_CURSORE ;MUOVE IL CURSORE NELLA POS SCELTA
MOV DX,OFFSET SI_NO ;SCEGLIE LA STRINGA (DS:DX)
CALL STAMPA_STRINGA
MOV ah,01h ;legge un car dalla tastiera
INT 21h
CMP al,'N' ;è = a NO ?
JE CICLA2 ;se si ESCI
CMP al,'n' ;è = a NO ?
JE CICLA2
CMP al,'S' ;è = a SI ?
JE CICLA ;se si CICLA
;CMP al,'s' ;è = a SI ?
;JE CICLA
CMP al,'U' ;è = a SI ?
JE FINALE ;se si ESCI
;CMP al,'u'
;JE FINALE
CALL TRIANGOLO
RET ;ritorna alla procedura chiamante
FINALE: CALL FINE
CICLA: CALL ZOOM
CICLA2: CALL ANZOOM
SCELTA ENDP
;--------------------------------------------------------------------------;
; PROCEDURA DI USCITA ;
;--------------------------------------------------------------------------;
FINE PROC NEAR
CALL PULISCI
MOV DX,0420h ;IMPOSTA RIGA (DH) E LA COLONNA (DL)
CALL SPOSTA_CURSORE ;MUOVE IL CURSORE NELLA POS SCELTA
INT 21h ;ritorna alla procedura chiamante
JMP ESCI
RET
FINE ENDP
;--------------------------------------------------------------------------;
; PROCEDURA PER FARE LO ZOOM ;
;--------------------------------------------------------------------------;
ZOOM PROC NEAR
CALL PULISCI
INC BASE
DEC C
CALL TRIANGOLO
RET ;ritorna alla procedura chiamante
ZOOM ENDP
;--------------------------------------------------------------------------;
; PROCEDURA PER FARE LO ANZOOM ;
;--------------------------------------------------------------------------;
ANZOOM PROC NEAR
CALL PULISCI
DEC BASE
CMP BASE,0
JE OVER
INC C
CALL TRIANGOLO
OVER: CALL FUORI
RET ;ritorna alla procedura chiamante
ANZOOM ENDP
;--------------------------------------------------------------------------;
; PROCEDURA PER PULIRE LO SCHERMO ;
;--------------------------------------------------------------------------;
PULISCI PROC NEAR
MOV ax,0600h
MOV cx,0000h
MOV dx,184Fh
MOV bh,07
INT 10h
MOV ah,02
MOV bh,00
MOV dx,0000h
INT 10h
MOV ax,04C00h
RET ;ritorna alla procedura chiamante
PULISCI ENDP
;--------------------------------------------------------------------------;
; PROCEDURA PER DISEGNARE IL TRIANGOLO ;
;--------------------------------------------------------------------------;
TRIANGOLO PROC NEAR
CALL PULISCI
MOV DH,R ; ( Riga )
MOV DL,C ; ( Colonna )
CALL SPOSTA_CURSORE ; Sposta cursore nella posizione scelta.
MOV BL,BASE ; Pagina video attiva.(Riga)
CCOL: MOV CL,PAGINA ; Pagina video attiva.(Colonna)
CRIG: MOV AL,'*' ; Ciclo per la stampa delle righe di dimensione
MOV AH,W_CHR_TTY ; BL che formano il triangolo.
INT BIOS_VIDEO ;
MOV AL,' '
MOV AH,W_CHR_TTY
INT BIOS_VIDEO
INC CL ;
CMP CL,BL ;
JB CRIG ;
DEC DH
INC DL
DEC BL ; Ciclo che mi sposta il cursore alla riga
CALL SPOSTA_CURSORE ; superiore per stampare le BASE-righe
; che formano il TRIANGOLO.
CMP BL,1 ; Se BL=1 vuol dire che sono state stampate
JAE CCOL ; tutte le righe che formano il TRIANGOLO.
CALL SCELTA
RET ; Ritorno alla procedura chiamante.
TRIANGOLO ENDP
;--------------------------------------------------------------------------;
; PROCEDURA PER USCIRE FORZATAMENTE ;
;--------------------------------------------------------------------------;
FUORI PROC NEAR
CALL PULISCI
MOV DX,0400h ;IMPOSTA RIGA (DH) E LA COLONNA (DL)
CALL SPOSTA_CURSORE ;MUOVE IL CURSORE NELLA POS SCELTA
MOV DX,OFFSET LIMITE ;SCEGLIE LA STRINGA (DS:DX)
CALL STAMPA_STRINGA
;INT 21h
MOV BASE,1
MOV R,15
MOV C,44
CALL TRIANGOLO
FUORI ENDP
CSEG ENDS
END MAIN