;--- 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 -----------------------------------------------------;