#define CTRLC 3 /* ascii2hexa: transforma o caractere ASCII c em hexadecimal sem sinal. */ unsigned char ascii2hexa(unsigned char c) { unsigned char ret = 0; if (c > 0x2F && c < 0x3A) ret = c - 0x30; else if (c > 0x40 && c < 0x47) ret = c - 0x37; else if (c > 0x60 && c < 0x67) ret = c - 0x57; else ret = 0xFF; return ret; } /* ascii2hexachar: converte dois caracteres ASCII em um unico hexadecimal sem sinal. */ unsigned char ascii2hexachar(unsigned char h, unsigned char l) { return (ascii2hexachar(h) * 16 + ascii2hexachar(l)); } /* ascii2hexaint: converte quatro caracteres ASCII para um inteiro de 16 bits sem sinal em hexadecimal. Nao trata caracteres ascii incorretos. Cuidado ao usar. */ unsigned int ascii2hexaint(unsigned char hh, unsigned char hl, unsigned char lh, unsigned char ll) { unsigned int h, l; h = (unsigned int)ascii2hexachar(hh, hl); l = (unsigned int)ascii2hexachar(lh, ll); return(h * 0x100 + l); } /* getAddress: espera quatro caracteres serem digitados e usa as subrotinas acima para converte-los para inteiro de 16 bits sem sinal em hexadecimal. Retorna 0 se for cancelada sua execuca. Esta subrotina depende da subrotina getchar() do sci.c e do printf do printf.c */ unsigned int getAddress() { unsigned int address = 0; int i, c, ok = 0, cancel = 0; unsigned char buff[4]; while (!ok && !cancel) { ok = 1; printf("\nEndereco: "); for (i = 0; i < 4; i++) { c = getchar(); if (CTRLC == c) { ok = 0; cancel = 1; address = 0; break; } else { if (ascii2hexachar(c) > 0x0F) { printf("\nCaractere invalido!"); ok = 0; break; } else { buff[i] = c; } } } } if (ok) { address = ascii2hexaint(buff[0], buff[1], buff[2], buff[3]); } return(address); }