summaryrefslogblamecommitdiffstats
path: root/yotlibc/str_out.s
blob: 202d80876d0e2439cb3e9ea45c478a276780e881 (plain) (tree)

































































































                                                                                   
global _putint
global putcharhex
global _putcharhex
global putstr
global _putstr

_putint:
    push    bp
    mov     bp, sp
    mov     ax, word [bp+4]     ; ax=argument
    sub     sp, 8               ; 5 bytes - printing buffer
    pusha
    mov     di, -1  ; dest index
    mov     si, 10  ; divisor, ax=dividend
putint_divloop:
        mov     dx, 0   ; clear upper bits
        div     si
        add     dx, '0'
        mov     byte [bp+di], dl
        dec     di
        cmp     ax, 0
        ja      putint_divloop

    mov     ah, 0x0e
    mov     bx, 0x0007
putint_print:
        inc     di
        mov     al, byte [bp+di]
        int     0x10
        cmp     di, -1
        jl      putint_print

    popa
    mov     sp, bp
    pop     bp
    ret


_putcharhex:
    push    bp
    mov     bp, sp
    mov     cl, byte [bp+4]
    call    putcharhex
    mov     sp, bp
    pop     bp
    ret

putcharhex:         ; cl=argument
    mov     dx, bx  ; preserve bx
    mov     ah, 0x0e
    mov     bx, 0x0007
    mov     al, cl
    and     al, 0xf0
    shr     al, 4
    call    fourbit2hex
    int     0x10
    mov     al, cl
    and     al, 0x0f
    call    fourbit2hex
    int     0x10
    mov     bx, dx  ; restore bx
    ret

fourbit2hex:        ; al=argument=result
    cmp     al, 10
    jae     fourbit2hex_alpha
    add     al, '0'
    ret
fourbit2hex_alpha:
    add     al, 'A' - 10
    ret 


_putstr:
    push    bp
    mov     bp, sp
    mov     dx, word [bp+4]
    call    putstr
    mov     sp, bp
    pop     bp
    ret

putstr:             ; dx=argument
    mov     cx, bx  ; we must preserve bx
putstr_start:
    mov     bx, dx  ; [dx] is not a effective address
    mov     al, byte [bx]
    test    al, al
    jz      putstr_end
    mov     ah, 0x0e
    mov     bx, 0x0007
    int     0x10
    inc     dx
    jmp     putstr_start
putstr_end:
    mov     bx, cx
    ret