; 
; Es. 9
; Scrivere un programma che riconosca il numero di coppie 01 conenute nella
; doppia locazione (16 bit) di nome ALPHA.
; Il numero di coppie di bit trovate e' lasciato nella locazione di nome RISU.
; Versione con output a video della sequenza considerata
;
.MODEL	small
.stack	100h

.data 
    ; Variabili ALPHA e RISU. 
    ALPHA dw 0100110010111001B ; Valore di esempio
    RISU  db 1 dup (0)
    msg	  db 13,10,10, "Numero di coppie 01 riconosciute = $"

.code

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

start:
	call init
    
    ; inizio codice esercizio
    ; conteggio coppie
    mov ax, ALPHA   ; copia del valore di ALPHA in ax
    mov bl, 0      ; inizializzazione del contatore
                    ; delle coppie trovate
    clc
ciclo:              ; ciclo di analisi della parola
	call printBin16toASCII ; stampa la codifica ASCII della parola corrente

    mov dx, ax      ; 0100110010111001B (ax al primo passo)
    and dx, 1100000000000000B ;(maschera)
    cmp dx, 0100000000000000B ;(coppia da cercare)
    jne scorrimento ; se non c'e' la coppia si scorre la parola
    inc bl          ; altrimenti si incrementa il numero
                    ; delle coppie trovate contenuto in bl
    push ax
    mov al, '*'		; Stampa il carattere * ogni volta che trova una coppia
    call output
    pop ax 

scorrimento:
	call newline
    shl ax,1       ; scorrimento di una posizione a sinistra di ax
    jnz ciclo     ; salta a ciclo fino a che ax non vale 0
    mov RISU, bl  ; copia il valore contenuto in bl in RISU

 	mov	dx,offset msg	; Stampa messaggio msg
	call print
    
    mov al, RISU  ; Copia al in bl
    add al, '0'   ; Converti AL in un carattere ASCII (AL e` minore o uguale a 8)
    call output	  ; Output a video

    ; fine dell'esercizio
	call pressKeyAndExit
end start