View Source Document

digit.s

;--- CONSTANTS -----------------------------------------------;

;--- DATA ----------------------------------------------------;

SEGMENT .data

;--- CODE ----------------------------------------------------;

SEGMENT .text

        ;;--------------------------------------------;
        ;; Convert a nybble to an ASCII hex digit.
        ;; al: nybble -> ASCII hex digit
NybbleToHex:    and al, 0fh
        cmp al, 10
        jae .Hex
        add al, '0'
        ret
.Hex:       add al, 'a'-10
        ret


        ;;--------------------------------------------;
        ;; Convert an ASCII hex digit to a nybble.
        ;; al: ASCII hex digit -> nybble
HexToNybble:    cmp al, 'a'
        jae .LowerHex
        cmp al, 'A'
        jae .UpperHex
        cmp al, '9'
        ja  .Invalid
        sub al, '0'
        ret
.LowerHex:  cmp al, 'f'
        ja  .Invalid
        sub al, 'a'-10
        ret
.UpperHex:  cmp al, 'F'
        ja  .Invalid
        sub al, 'A'-10
        ret
.Invalid:   mov al, 010h
        ret


        ;;--------------------------------------------;
        ;; Convert a set of four ASCII hex digits to
        ;; a short.
        ;; ax: * -> resultant short
        ;; bx: pointer to first digit -> INCREMENTED
        ;; cx: * -> GARBAGE
        ;; dx: * -> GARBAGE
ParseHexShort:  xor ax, ax
        mov cx, 4
.Loop:      push    ax
        mov al, [bx]
        call    HexToNybble
        and al, 0fh     ; TODO - do SOMETHING on error!
        mov dl, al
        pop ax

        shl ax, 1
        shl ax, 1
        shl ax, 1
        shl ax, 1
        or  al, dl

        inc bx
        dec cx
        cmp cx, 0
        jne .Loop
        ret

;--- END -----------------------------------------------------;