; Ingresso con eco della codifica ASCII di una cifra decimale

.MODEL	small
.stack

.data
    CIFRA1 DB 0
    CIFRA2 DB 0
    BASE   DB 0
    N      DB 0
    immettiCifre db "Immetti un numero di due cifre seguito dalla base (d o h): $"
    erroreBaseStr db "Errore: le cifre non sono compatibili con la base specificata! $"
    conversioneDecStr db "Conversione a decimale: $"
    conversioneHexStr db "Conversione a esadecimale: $"
    stampaBinStr db "Stampa binario: $"
    pkey db 13,10,13,10,"Premi un tasto per uscire ...$"



.code
include ..\include\stdio.inc
include ..\include\utils.inc
include ..\include\ioNumbers.inc

start:
	call init
	; Inizio esercizio
	
    MOV DX, OFFSET immettiCifre     
    CALL print
    ; Richiedi 2 cifre esadecimali
    CALL inHEXASCII_eco
    MOV CIFRA1, AL
    CALL inHEXASCII_eco
    MOV CIFRA2, AL

inputBASE:
    CALL input
    CMP AL, 'd'
    JE  inserisciBASE
    CMP AL, 'h'
    JE  inserisciBASE
    JMP inputBASE
inserisciBASE:
    MOV BASE, AL
    CALL output ; eco della base inserita.
    
    CMP BASE, 'd'
    JNE saltaControlloCifre
    
    CMP CIFRA1, '9'
    JA  erroreBase
    CMP CIFRA2, '9'
    JA  erroreBase
    JMP saltaControlloCifre
    
erroreBase:
    CALL newline
    MOV DX, OFFSET erroreBaseStr
    CALL print
    

saltaControlloCifre:
    CMP BASE, 'd'
    JE  dec2bin
    
    ; Conversione da 2 cifre esadecimali codificate ASCII a binario
hex2bin:
    MOV AL, CIFRA1 ; prima cifra da convertire
    CALL ha1b4     ; conversione -> in AL abbiamo la cifra in binario
    MOV N, AL      ; N <- AL
    MOV CL, 4
    SHL N,CL       ; sposto a sinistra di 4 le cifre binarie
    MOV AL, CIFRA2 ; seconda cifra da convertire
    CALL ha1b4     ; conversione
    OR  N, AL      ; Somma logica della seconda cifra convertita in binario
    
    JMP fineconversione
    
    ; Conversione da 2 cifre decimali codificate ASCII a binario
dec2bin:
    MOV AH, 0
    MOV AL, CIFRA1 ; In cifra1 ci sono le decine.
    CALL da1b4     ; Ora in AL ho il numero binario
    MOV BL, 10	   ; BL <- 10 (decimale)
    MUL BL         ; AX = AL * BL
    MOV N, AL      ; N <- AL
    MOV AL, CIFRA2 ; In cifra2 ci sono le unita'
    CALL da1b4     ; Ora in AL ho le unita' in binario
    ADD N, AL      ; N = N + AL

fineconversione:
   
bin2dec:
    CALL newline
    MOV DX, OFFSET conversioneDecStr
    CALL print
    MOV AX, 0
    MOV AL, N
    MOV BL, 10
    DIV BL         ; AL = AX / operand
                   ; AH = remainder (modulus) 
    ADD AL, '0'
    CALL output
    MOV AL, AH
    ADD AL, '0'
    CALL output
        
bin2hex:
    CALL newline
    MOV DX, OFFSET conversioneHexStr
    CALL print
    MOV AL, N
    AND AL, 11110000b
    MOV CL, 4
    SHR AL, CL
    CMP AL, 9
    JA  lettera1
    ADD AL, '0'
    CALL output
    JMP secondaCifra
lettera1:
    ADD AL, 37h
    CALL output
    
secondaCifra:
    MOV AL, N
    AND AL, 00001111b
    CMP AL, 9
    JA lettera2
    ADD AL, '0'
    CALL output
    JMP bin2ascii
lettera2:
    ADD AL, '0'
    CALL output  
        
bin2ascii:
    CALL newline
    MOV DX, OFFSET stampaBinStr
    CALL print
    ;
    MOV AL,N
    CALL printBin8toASCII

	; Fine esercizio
	call pressKeyAndExit

end start ; set entry point and stop the assembler.
