; hex2bin.as - Convert from/to ASCII hex string to/from binary value ; Also, lowercase and uppercase functions for char and string ; Copyright (C) 2001 ag0ny@ag0ny.com ; v1.0/20010523 BDOS equ 00005h ; BDOS entry point _STROUT equ 009h system macro func ld c,func call BDOS endm ; *********** ; ** Start ** ; *********** start: ld de,text call hex2bin or a jr nz,s.1 ld de,printbuf call bin2hex ld de,printbuf system _STROUT ld de,error0 system _STROUT ret s.1: cp 1 jr nz,s.2 ld de,error1 system _STROUT ret s.2: cp 2 jr nz,s.3 ld de,error2 system _STROUT ret s.3: ld de,erroru system _STROUT ret ; hex2bin - convert ASCII hex string pointed by DE to 16 bit binary into HL ; input: DE ASCII hex string pointer ; output: HL binary value ; A = 0 no error ; A = 1 Error: no digits found ; A = 2 Error: malformed input string ; hex2bin: ld h,d ld l,e ; first, turn all ASCII numbers into their binary value h2b.1: ld a,(hl) cp ' ' jr nz,h2b.2 ld a,1 ; no characters found, return error 1 ret h2b.2: call char2bin jr nc,h2b.3 ld a,2 ; invalid character found ret h2b.3: ld (hl),a inc hl ld a,(hl) cp ' ' jr z,h2b.4 jr h2b.2 ; and second, sum them up to the 16 bit binary value h2b.4: ld hl,0 ld b,0 h2b.5: ld a,(de) and 000001111b ld c,a jr nz,h2b.6 ; return if finished with the number xor a ; return with no error ret h2b.6: push de call sl4hl pop de add hl,bc inc de jr h2b.5 ; sl4hl - shift HL register 4 bits to the left (= multiply HL by 16) ; sl4hl: ld d,h sla d sla d sla d sla d ld a,l and 011110000b rlca rlca rlca rlca or d ld h,a ld a,l and 000001111b rlca rlca rlca rlca ld l,a ret ; bin2hex - binary -> ASCII conversion ; input: HL binary value to convert ; DE pointer to the output buffer ; bin2hex: push hl ld b,0 ; first digit ld a,h and 011110000b rlca rlca rlca rlca ld c,a ld hl,HEXDIGITS add hl,bc ld a,(hl) ld (de),a inc de ; second digit pop hl push hl ld a,h and 000001111b ld c,a ld hl,HEXDIGITS add hl,bc ld a,(hl) ld (de),a inc de ; third digit pop hl push hl ld a,l and 011110000b rlca rlca rlca rlca ld c,a ld hl,HEXDIGITS add hl,bc ld a,(hl) ld (de),a inc de ; fourth digit pop hl ld a,l and 000001111b ld c,a ld hl,HEXDIGITS add hl,bc ld a,(hl) ld (de),a ret ; char2bin - convert ASCII hex digit in A to binary ; input: A input character ('0-9a-fA-F') ; output: CY = 1 error ; CY = 0 ok ; A if CY = 0, binary value, else unmodified ; char2bin: cp '0' ret c ; lower than '0', can't convert! cp '9'+1 jr nc,c2b.1 and 000001111b ret c2b.1: cp 'A' ret c cp 'F'+1 jr nc,c2b.2 sub 'A'-10 ret c2b.2: cp 'a' ret c cp 'f'+1 jr nc,c2b.3 sub 'a'-10 ret c2b.3: scf ; set CY to indicate error ret ; toupper - convert all alpha characters in the string pointed by HL to ; uppercase (the string must end with the '$' character) ; input: HL pointer to the beginning of the string. ; toupper: ld a,(hl) cp '$' ret z call upper ld (hl),a inc hl jr toupper ; tolower - convert all alpha characters in the string pointed by HL to ; lowercase (the string must end with the '$' character) ; input: HL pointer to the beginning of the string. ; tolower: ld a,(hl) cp '$' ret z call lower ld (hl),a inc hl jr tolower ; upper - convert character in A to uppercase, if character is a..z ; input: A character ; oputput: A character uppercased (or left as it was if not a..z) ; upper: cp 'a' ret c ; ASCII code < 'a', so nothing to do cp 'z'+1 ret nc ; ASCII code > 'z', nothing to do either sub 32 ; (because 'A' = 'a' - 32) ret ; lower - convert character in A to lowercase, if character is A..Z ; input: A character ; oputput: A character lowercased ; lower: cp 'A' ret c cp 'Z'+1 ret nc add a,32 ret HEXDIGITS: defb '0123456789ABCDEF' text: defb '4000' printbuf: defb '0000$' error0: defb 'No errors.$' error1: defb 'Empty string.$' error2: defb 'Invalid string.$' erroru: defb 'Unknown error.$'