TITLE 8086 Code Template (for EXE file)
; AUTHOR Salvatore Ciotola
; DATE 3/02/2009
; VERSION 1.00
; FILE Accensione_luci_sensore
; Directive to make EXE output:
#MAKE_EXE#
ACQ MACRO ; DICHIARAZIONE MACRO 'ACQ'
;************************************
LEA DX, MSG ;
MOV AH, 9 ;codice per far tornar a capo ad ogni inserimento
INT 21H ;
MOV AH, 01h ;
INT 21h ;ACQUISIZIONE 'A'
AND AL, 0Fh ;AGGIUSTO IL NIBBLE DI ZONA ASCII
SHL AL, 1 ;SHIFTO A SINITRA
MOV BL, AL ;SALVO IL VALORE IN BL
INT 21h ;ACQUISIZIONE 'B'
AND AL, 0Fh ;AGGIUSTO IL NIBBLE DI ZONA ASCII
ADD BL, AL ;LA SEQUENZA DATA IN IN-PUT STA IN --> BL
;************************************
ENDM ; FINE MACRO
DSEG SEGMENT 'DATA'
MSG DB ,0AH, 0DH,'$'
MSG1 DB ,0AH, 0DH,'LUCE SPENTA $',0AH, 0DH,
MSG2 DB ,0AH, 0DH,'LUCE ACCESA $',0AH, 0DH,
DSEG ENDS
SSEG SEGMENT STACK 'STACK'
DW 100h DUP(?)
SSEG ENDS
CSEG SEGMENT 'CODE'
;*******************************************
START PROC FAR
; Store return address to OS:
PUSH DS
MOV AX, 0
PUSH AX
; set segment registers:
MOV AX, DSEG
MOV DS, AX
MOV ES, AX
;MY CODE *************************************
MOV CL, 0
LEA DX, MSG1 ;* CARICA IN DX 'MSG1'
MOV AH, 9 ; *
INT 21H ;* STAMPA 'LUCE SPENTA' (MSG1)
INIZIO: ACQ ; ACQ = CHIAMATA A MACRO
CMP BL, 0 ; IF BL = 00
JE LABEL
JMP INIZIO
LABEL: ACQ ; IN LABEL: E' STATO INSERITO PRECEDENTEMENTE '00'
CMP BL, 1 ; IF BL = 01
JE LABEL1 ; SALTA SE BL = 01
CMP BL, 00 ; IF BL = 00
JE LABEL
CMP BL, 2 ; IF BL = 10
JE APP_S_US ; SALTO APPOGGIO
JMP INIZIO
LABEL1: ACQ ; IN LABEL1 GIA E' STATO INSERITO PRECEDENTEMENTE '01'
CMP BL, 3 ; IF BL = 11
JE LABEL2
CMP BL, 1 ; IF BL = 01
JE LABEL1
CMP BL, 0 ; IF BL = 00
JE LABEL
JMP INIZIO
APP_SALTO:
JMP LABEL ;SALTO DI APPOGGIO DATO CHE IL SALTO DIRETTO E' TROPPO LUNGO
LABEL2: ACQ ; IN LABEL2: E' STATO INSERITO PRECEDENTEMENTE '11'
CMP BL, 2 ; IF BL = 10
JE LABEL3
CMP BL, 3 ; IF BL = 11
JE LABEL2
CMP BL, 1 ; IF BL = 01
JE LABEL1
CMP BL, 00 ; IF BL = 00
JE APP_SALTO
JMP INIZIO
APP_S_US:
JMP LABEL5 ; SALTO DI APPOGGIO
LABEL3: ACQ ; IN LABEL3: E' STATO INSERITO PRECEDENTEMENTE '10'
CMP BL, 0 ; IF BL = 00
JE CONTA_RET
CMP BL, 2 ; IF BL = 10
JE LABEL3
CMP BL, 3 ; IF BL = 11
JE LABEL2
JMP INIZIO
CONTA_RET:
INC CL ; INCREMENTA DI '1' SE E' AVVENUTA LA SEQUENZA DI ENTRATA
CMP CL, 0 ; CONFRONTA CL CON '0' ZERO
JG STAM_L_A ; SE CL>0 SALTA A STAM_L_A
STAM_L_S:LEA DX, MSG1 ; CARICA LA SCRITTA DI 'MSG1'
MOV AH, 9 ;
INT 21H ; STAMPA LA SCRITTA DI 'MSG1'
JMP LABEL
LABEL5: ACQ ; IN LABEL5: E' STATO INSERITO PRECEDENTEMENTE '10'
CMP BL, 3 ; IF BL = 11
JE LABEL6
CMP BL, 2 ; IF BL = 10
JE LABEL5
CMP BL, 0 ; IF BL = 00
JE APP_LABEL ; SALTO DI APPOGGIO
JMP INIZIO
STAM_L_A:
LEA DX, MSG2 ; CARICA IL MESSAGGIO 'MSG2'
MOV AH, 9 ;
INT 21H ; STAMPA LA SCRITTA DI 'MSG2'
JMP LABEL ; SALTO ALLA CONDIZIONE 00
APP_LABEL:
JMP LABEL ; SALTO DI APPOGGIO
LABEL6: ACQ ; IN LABEL6: E' STATO INSERITO PRECEDENTEMENTE '11'
CMP BL, 1 ; IF BL = 01
JE LABEL7
CMP BL, 3 ; IF BL = 11
JE LABEL6
CMP BL, 2 ; IF BL = 10
JE LABEL5
CMP BL, 0 ; IF BL = 00
JE APP_LABEL
JMP INIZIO
LABEL7: ACQ ; IN LABEL7: E' STATO INSERITO PRECEDENTEMENTE '01'
CMP BL, 0 ; IF BL = 00
JE DECR_RET
CMP BL, 1 ; IF BL = 01
JE LABEL7
CMP BL, 3 ; IF BL = 00
JE LABEL6
JMP INIZIO
DECR_RET:
DEC CL ; DECREMENTA DI '1' CL SE E' AVVENUTA LA SEQUENZA DI USCITA
CMP CL, 0 ; CONFRONTA CL CON '0'
JG STAM_L_A ; SE CL>0 SALTA A STAM_L_A
JMP STAM_L_S ; ALTRIMENTI SALTA A STAM_L_S
; return to operating system: ;DA LABEL1 A LABEL 3: SEQUENZA DI ENTRATA
RET ;DA LABEL5 A LABEL 7: SEQUENZA DI USCITA
START ENDP ;
; JE & JG = SALTI CONDIZIONATI RELATIVI
;******************************************* ; JMP = SALTO INCONDIZIONATO
CSEG ENDS
END START ; set entry point.