;**********************************************************
;NASM Assembler Project File
BITS 32			                    ;Set code generation to 32 bit mode

SEGMENT .text		;Main code segment
                 
;**********************************************************
;     Purpose: utility procedure to output to video
global ax_vid_32
ax_vid_32:
        push  ax
        push  ds
        push  bp
        
        push  ax
        mov   ax, 18h           ; video segment identifyer
        mov   ds, ax            ; Move a valid video segment into the ds segment register
                                ;   writing to video RAM w/o interupts
        pop   ax
        
        push  ax
        mov   al,ah
        call  al_nibs_2_ax
        call  c_ax_2_ascii_hex 
        mov   word bp,[es:vid_placement]                   
        mov   byte [ds:bp],ah
        mov   byte [ds:bp+01h],0fh
        mov   byte [ds:bp+02h],al
        mov   byte [ds:bp+03h],0fh
        pop   ax
        
        call  al_nibs_2_ax
        call  c_ax_2_ascii_hex                    
        mov   byte [ds:bp+04h],ah
        mov   byte [ds:bp+05h],0fh
        mov   byte [ds:bp+06h],al
        mov   byte [ds:bp+07h],0fh        
        add   word [es:vid_placement],00010h
        
        pop   bp
        pop   ds
        pop   ax
        ret

al_nibs_2_ax:
        mov   ah,al
        and   al,0Fh
        shr   ah,04h
        and   ah,0Fh
        ret
        
c_ax_2_ascii_hex:
        cmp   ah,09h
        jg   ca2ah_bigah
        add   ah,30h
        jmp   ca2ah_al
ca2ah_bigah:
        add   ah,37h
ca2ah_al:
        cmp   al,09h
        jg   ca2ah_bigal
        add   al,30h
        jmp   ca2ah_exit
ca2ah_bigal:
        add   al,37h
ca2ah_exit:              
        ret
        
SEGMENT .data		;Initialised data segment
vid_placement:  dw  0000h

SEGMENT .bss	  ;Uninitialised data segment
