codice:
;DEFINIZIONE COSTANTI
PAGINA EQU 00h
HT EQU 09h
LF EQU 0AH
CR EQU 0DH
;
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
R_KEY_CHR EQU 01H
PRINT_STRING EQU 09H
R_KEY_CHR_NE EQU 07H
DSEG SEGMENT PARA PUBLIC 'DATA'
TITOLO DB 'CORSO DI CALCOLATORI ELETTRONICI$'
ISTRUZIONI DB CR,HT,HT,HT,HT,HT,CR,'premere il tasto A e in seguito il tasto B: $'
BIN_MESS DB CR,LF,HT,HT,'rappresentazione binaria: $'
DEC_MESS DB CR,LF,HT,HT,'rappresentazione decimale: $'
TERMINE DB CR,LF,LF,HT,'un altra iterazione? [S/N]$'
CODICE_TASTO1 DB ?
CODICE_TASTO2 DB ?
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'
;CORPO PRINCIPALE DEL PROGRAMMA
MAIN PROC FAR
PUSH DS
MOV AX,00H
PUSH AX
CALL INIZIALIZZAZIONE
CICLO_PRINCIPALE: CALL PROMPT
CALL LETTURA_DATI1
CALL LETTURA_DATI2
MOV DX,OFFSET BIN_MESS
CALL STAMPA_STRINGA
MOV DL,[CODICE_TASTO1]
CALL STAMPA_BIN
MOV DX,OFFSET BIN_MESS
CALL STAMPA_STRINGA
MOV DL,[CODICE_TASTO2]
CALL STAMPA_BIN
MOV AL,[CODICE_TASTO1]
CALL STAMPA_DEC
MOV AL,[CODICE_TASTO2]
CALL STAMPA_DEC
CALL TEST_FINALE
JNZ CICLO_PRINCIPALE
RET
MAIN ENDP
;PROCEDURA DI INIZIALIZZAZIONE
INIZIALIZZAZIONE PROC NEAR
MOV AX,DSEG
MOV DS,AX
MOV AH,SET_VIDEO_MODE
MOV AL,MODO_TESTO
INT BIOS_VIDEO
MOV DX,0315H
CALL SPOSTA_CURSORE
MOV DX,OFFSET TITOLO
CALL STAMPA_STRINGA
MOV DX,0400H
CALL SPOSTA_CURSORE
RET
INIZIALIZZAZIONE ENDP
;PROCEDURA PER STAMPARE IL MESSAGGIO INIZIALE
PROMPT PROC NEAR
MOV DX,OFFSET ISTRUZIONI
CALL STAMPA_STRINGA
RET
PROMPT ENDP
;PROCEDURA PER STAMPARE UN NUMERO IN FORMATO BINARIO
STAMPA_BIN PROC NEAR
CMP DL,'0'
JB SOTTOB
CMP DL,'9'
JA SOTTOB
SUB DL,'0'
SOTTOB: MOV DH,08H
CICLO_BINARIO : XOR AL,AL
SHL DL,01H
ADC AL,AL
CALL STAMPA_NUMERO
DEC DH
JNZ CICLO_BINARIO
RET
STAMPA_BIN ENDP
;PROCEDURA PER STAMPARE UN NUMERO IN FORMATO DECIMALE
STAMPA_DEC PROC NEAR
MOV DX,OFFSET DEC_MESS
CALL STAMPA_STRINGA
MOV CH,10
XOR CL,CL
MEMODEC: XOR AH,AH
IDIV CH
PUSH AX
INC CL
CMP AL,0
JNZ MEMODEC
XOR CH,CH
STAMPADEC: POP AX
MOV AL,AH
CALL STAMPA_NUMERO
LOOP STAMPADEC
RET
STAMPA_DEC ENDP
;PROCEDURA PER DETERMINARE SE OCCORRE UN'ALTRA ITERAZIONE
TEST_FINALE PROC NEAR
MOV DX,OFFSET TERMINE
CALL STAMPA_STRINGA
CALL LETTURA_SN
CMP AL,'n'
RET
TEST_FINALE ENDP
;PROCEDURE DI BASSO LIVELLO DI INTERFACCIA
;PROCEDUREA PER STAMPARE UN NUMERO DA 0 A 9
STAMPA_NUMERO PROC NEAR
ADD AL,'0'
MOV AH,W_CHR_TTY
INT BIOS_VIDEO
RET
STAMPA_NUMERO ENDP
;PROCEDURA PER LEGGERE DA TASTIERA S O N
LETTURA_SN PROC NEAR
NUOVA_LETTURA: MOV AH,R_KEY_CHR_NE
INT DOS
OR AL,00100000B
CMP AL,'n'
JZ FINE_LETTURA
CMP AL,'s'
JNZ NUOVA_LETTURA
FINE_LETTURA: RET
LETTURA_SN ENDP
;PROCEDURA PER SPOSTARE IL CURSORE
SPOSTA_CURSORE PROC NEAR
MOV BH,PAGINA
MOV AH,SET_CURSOR
INT BIOS_VIDEO
RET
SPOSTA_CURSORE ENDP
;PROCEDURA PER LEGGERE UN TASTO E MEMORIZZARLO IN CODICE_TASTO1
LETTURA_DATI1 PROC NEAR
MOV AH,R_KEY_CHR
INT DOS
MOV [CODICE_TASTO1],AL
RET
LETTURA_DATI1 ENDP
;PROCEDURA PER LEGGERE UN TASTO E MEMORIZZARLO IN CODICE_TASTO2
LETTURA_DATI2 PROC NEAR
MOV AH,R_KEY_CHR
INT DOS
MOV [CODICE_TASTO2],AL
RET
LETTURA_DATI2 ENDP
;PROCEDURA PER STAMPARE UNA STRINGA
STAMPA_STRINGA PROC NEAR
MOV AH,PRINT_STRING
INT DOS
RET
STAMPA_STRINGA ENDP
CSEG ENDS
END MAIN