;
; Essame del 29.01.2010.
;
; Utilizzando il linguaggio Assembler 8086 e l’insieme di interrupt disponibili
; sui processori compatibili x86, si realizzi il programma che faccia quanto
; segue:
; 1. chiede all'utente di inserire una cifra esadecimale compresa tra 0 e F;
; 2. se l'utente inserisce uno 0 il programma termina;
; 3. se l'utente inserisce un numero compreso tra 1 ed F il programma stampa
; a video la tabella pitagorica esadecimale limitata al numero inserito.
;
;Inserisci una cifra esadecimale compresa tra 0 e F: 5
;    1  2  3  4  5
;1: 01 02 03 04 05
;2: 02 04 06 08 0A
;3: 03 06 09 0C 0F
;4: 04 08 0C 10 14
;5: 05 0A 0F 14 19
; [...]

.MODEL	small
.stack	100h

.data 
	msg		db "Inserisci una cifra esadecimale compresa tra 0 e F: $"
	N		db 0
	intsep  db "    $"
	sep		db ": $"

.code
include ..\include\stdio.inc
include ..\include\utils.inc
include ..\include\ioNumbers.inc

start:
	call init
	; Inizio esercizio
	 
	lea dx, msg	; Stampa 'msg'
	call print
	
	call inHEXASCII_eco  ; Attende l'inserimento di un carattere esadecimale
	call ha1b4	; Conversione da carattere esadecimale a binario di 4 bit
	mov N, al	; Memorizzazione del numero inserito nella variabile N
	jz fine_esercizio
	
	call newline
    lea dx, intsep ; Stampa separatore iniziale
    call print
	mov al, 1
ciclo_intestazione_colonne:
    ;call printBin8toDecASCII
	call printBin8ToHexAscii
	call stampaSpazio
	inc al
	cmp al,N
	jbe ciclo_intestazione_colonne
	
	; Ciclo per stampa righe
	; Registro CX: utilizzato per contare le righe
	; Registro BX: utilizzato per contare le colonne
	
	mov cl, 1	; Inizializzazione CL
ciclo_righe:
    call newline
    mov al, cl  ; Stampa il numero di riga
    call printBin8ToHexAscii
    lea dx, sep ; Stampa separatore iniziale
    call print
    mov bl, 1	; Inizializzazione BX
ciclo_colonne:
	mov al, cl
	mul bl
	call printBin8ToHexAscii
    call stampaSpazio
	inc bl
	cmp bl, N
	jbe ciclo_colonne
	inc cl
	cmp cl, N
	jbe ciclo_righe
	mov cx, 0h 	; Inizializzazione CX
	mov bx, 0h	; Inizializzazione BX
	

fine_esercizio:	
	; Fine esercizio
	call pressKeyAndExit

stampaSpazio proc
    push ax
	mov al,' '
	call output
	pop ax
	Ret
stampaSpazio endp

end start ; set entry point and stop the assembler.
