;
; get1DigitNumber
;  Attende la pressione di tasto numerico.
;  Restituisce il corrispondente codice ASCII nel registo AL.
get1DigitNumber proc
inKey:
	call input
	cmp al, '0'
	jb	inKey
	cmp al, '9'
	ja	inKey
	ret
get1DigitNumber endp

; Restituisce in AL il carattere decimale ASCII letto da tastiera
inDECASCII_eco proc
inASCII:
    CALL input  ; AL <- carattere letto da tastiera
    CMP AL, '0'
    JB  inASCII
    CMP AL, '9'
    JA  inASCII
    CALL output
    ret
inDECASCII_eco endp

inHEXASCII_eco proc
inASCII2:
    CALL input  ; AL <- carattere letto da tastiera
    CMP AL, '0'
    JB  inASCII2
    CMP AL, 'F'
    JA  inASCII2
    CMP AL, '9'
    JBE eco
    CMP AL, 'A'
    JB  inASCII2
eco:    
    CALL output
    ret
inHEXASCII_eco endp

; Procedura che converte un numero esadecimale codificato in ASCII
; a numero binario a 4 bit
; Parametro in ingresso AL (cifra ASCII da convertire)
; Valore ritornato in AL (numero binario del tipo 0000xxxx).
ha1b4 proc
    and AL, 7fh
    cmp al, '9'
    ja sub_37h
sub_30h:
    sub al, '0'
    ret
sub_37h:
    sub al, 37h
    ret
ha1b4 endp

; Procedura che converte un numero decimale codificato in ASCII
; a numero binario a 4 bit
; Parametro in ingresso AL (cifra ASCII da convertire)
; Valore ritornato in AL (numero binario del tipo 0000xxxx).
da1b4 proc
    and AL, 7fh
    sub al, '0'
    ret
da1b4 endp

; printBin8toASCII
;  Stampa il numero binario a 8 bit a video
;  come una stringa di caratteri ASCII '0' e '1'.
;  Parametro in ingresso: il numero binario viene passato in AL
;  Nessun parametro in uscita.
printBin8toASCII proc
	push ax
	push bx
	push cx
	mov  cl, 8
	mov  bl, al
ciclo_print8Bit:
	shl  bl,1
	jc   printBin8toASCII_1
	mov  al, '0'
	call output
	jmp  end_ciclo_print8Bit
printBin8toASCII_1:
	mov  al, '1'
	call output
end_ciclo_print8Bit:
	dec cx
	jnz ciclo_print8Bit
	pop cx
	pop bx
	pop ax
	Ret
printBin8toASCII endp

; print16Bit
;  Stampa il numero binario a 16 bit a video
;  come una stringa di caratteri ASCII '0' e '1'.
;  Parametro in ingresso: il numero binario viene passato in AX
;  Nessun parametro in uscita.
printBin16toASCII proc
	push ax
	push bx
	push cx
	mov  cl, 16
	mov  bx, ax
ciclo_print16Bit:
	shl  bx,1
	jc   printBin16toASCII_1
	mov al, '0'
	call output
	jmp end_ciclo_print16Bit
printBin16toASCII_1:
	mov  al, '1'
	call output
end_ciclo_print16Bit:
	dec cl
	jnz ciclo_print16Bit
	pop cx
	pop bx
	pop ax
	Ret
printBin16toASCII endp

; print16Bit
;  converte un numero binario naturale in decimale e lo stampa codificato ASCII.
;  Parametro in ingresso: il numero binario viene passato in AL
;  Nessun parametro in uscita.
printBin8toDecASCII proc
    PUSH AX		; Salvataggio registri utilizzati
    PUSH BX
    PUSH DX
    MOV AH, 0   ; AH <- 0  => AX = 0 - 255
centinaia:
    MOV BL, 100 ; BL <- 100
    DIV BL      ; AL = AX / operando (byte) = 0 - 2 (centinaia)
                ; AH = resto                = 0 - 99
    ADD AL, '0'	; codifica ASCII del quoziente
    CALL output	; stampa carattere ASCII del decimale
decine:
	MOV	AL, AH
	MOV AH, 0
    MOV BL, 10  ; BL <- 10
    DIV BL      ; AL = AX / operando (byte) = 0 - 9 (decine)
                ; AH = resto                = 0 - 9 (unita)
    ADD AL, '0'	; codifica ASCII del quoziente
    CALL output	; stampa carattere ASCII del decimale
unita:
    MOV AL, AH  ; AL <- AH = resto
    ADD AL, '0' ; codifica ASCII del resto
    CALL output	; stampa carattere ASCII del decimale
    POP DX
    POP BX
    POP AX
	Ret
printBin8toDecASCII endp

; printBin16toDecASCII
;   Conversione da 16 bit binario ad ASCII decimale - I valori ASCII sono stampati a video
;   Parametro in ingresso: AX
printBin16toDecASCII proc
		PUSH    AX      ; Salva i Registri usati  dalla Procedura,
        PUSH    BX      ; compreso il valore da convertire,
        PUSH    DX      ; passato in ingresso in AX
        CMP     AX,10000; Se il numero esadecimale in ingresso e` minore
        JC      Wor2_0  ; di 10000 la successiva divisione viene evitata
		; Output delle decine di migliaia
        MOV     DX,0000H; (DX,AX=0000XXXX)/(BX=10000)=AX, resto DX
        MOV     BX,10000; Prepara il divisore a 10000
        DIV     BX      ; Esegue la divisione
        CALL    outbin  ; Stampa il valore delle Decine di Migliaia
        MOV     AX,DX   ; Sposta in AX il  Resto  RRRR  della  divisione 
        JMP     Wor2_1  ; precedente da dividere  nella  fase successiva
        ; Output delle migliaia
Wor2_0: CMP     AX,1000 ; Se il numero esadecimale in ingresso e` minore
        JC      Byt2_0  ; di 1000  la successiva divisione viene evitata
Wor2_1: MOV     DX,0000H; (DX,AX=0000XXXX)/(BX=1000)=AX, resto DX
        MOV     BX,1000 ; Prepara il divisore a 1000
        DIV     BX      ; Esegue la divisione
        CALL    outbin  ; Stampa il valore delle Migliaia
        MOV     AX,DX   ; Sposta in AX il  Resto  RRRR  della  divisione
        JMP     Byt2_1	; precedente da dividere nella  fase  successiva
        ; Output delle centinaia`
Byt2_0: CMP     AX,100  ; Se il numero esadecimale in ingresso e` minore
        JC      Byt2_2  ; Ùdi  100 la  successiva divisione viene evitata
Byt2_1: MOV     BL,100  ; Prepara il divisore a 100
        DIV     BL      ; Divide AX=00XX per BL=100 (AX:BL=AL, resto AH)
        CALL    outbin  ; Stampa il valore delle Centinaia
        MOV     AL,AH   ; Sposta in AL il Resto RR della divisione
        MOV     AH,00H  ; precedente da  dividere  nella  fase  successiva,
        JMP     Byt2_3  ; formattando il dividendo al valore AX=00RR
        ; Output delle decine
Byt2_2: CMP     AX,10   ; Se il numero esadecimale in ingresso  Š minore
        JC      Byt2_4  ; di 10 la successiva  divisione  viene  evitata
Byt2_3: MOV     BL,10   ; Prepara il divisore a 10
        DIV     BL      ; Divide AX=00XX per BL=10  (AX:BL=AL, resto AH)
        CALL    outbin  ; Stampa il valore delle Decine
        MOV     AL,AH   ; Prepara in AL la cifra delle Unit…
Byt2_4: CALL    outbin  ; Stampa il valore delle Unit…
        POP     DX
        POP     BX
        POP     AX
		Ret
printBin16toDecASCII endp 

