/* * Standard library * Contains basic functions, including timer and memory functions * Modified version for BCC */ // uses math.c #define UART_TX_ADDR 0xC02723 // Timer I/O Addresses #define TIMER1_VAL 0xC02739 #define TIMER1_CTRL 0xC0273A #define TIMER2_VAL 0xC0273B #define TIMER2_CTRL 0xC0273C #define TIMER3_VAL 0xC0273D #define TIMER3_CTRL 0xC0273E word timer1Value = 0; word timer2Value = 0; word timer3Value = 0; /* * TODO: * - Convert most of these functions to assembly */ // isalpha word isalpha(word argument) { if (argument >= 'A' && argument <= 'Z') return 2; if (argument >= 'a' && argument <= 'z') return 1; return 0; } // isdigit word isdigit(word argument) { if (argument >= '0' && argument <= '9') return 1; return 0; } // isalnum word isalnum(word argument) { if (isdigit(argument) || isalpha(argument)) return 1; return 0; } void* memcpy(void *dest, const void *src, size_t len) { // Typecast src and dest addresses to (char *) char *csrc = (char *)src; char *cdest = (char *)dest; // Copy contents of src[] to dest[] word i; for (i=0; i from && to-from < (word)n) { /* to overlaps with from */ /* */ /* */ /* copy in reverse, to avoid overwriting from */ word i; for(i=n-1; i>=0; i--) to[i] = from[i]; return dest; } if (from > to && from-to < (word)n) { /* to overlaps with from */ /* */ /* */ /* copy forwards, to avoid overwriting from */ size_t i; for(i=0; i 0) i += itoar(n, s); s[i++] = digit + '0'; return i; } /* Converts integer n to characters. The characters are placed in the buffer s. The buffer is terminated with a 0 value. Uses recursion, division and mod to compute. */ void itoa(word n, char *s) { // compute and fill the buffer word i = itoar(n, s); // end with terminator s[i] = 0; } /* Prints a single char c by writing it to UART_TX_ADDR */ void uprintc(char c) { word *p = (word *)UART_TX_ADDR; // address of UART TX *p = (word)c; // write char over UART } /* Sends each character from str over UART by writing them to UART_TX_ADDR until a 0 value is found. Does not send a newline afterwards. */ void uprint(char* str) { word *p = (word *)UART_TX_ADDR; // address of UART TX char chr = *str; // first character of str while (chr != 0) // continue until null value { *p = (word)chr; // write char over UART str++; // go to next character address chr = *str; // get character from address } } /* Same as uprint(char* str), except it sends a newline afterwards. */ void uprintln(char* str) { uprint(str); uprintc('\n'); } // Converts char c to uppercase if possible char toUpper(char c) { if (c>96 && c<123) c = c ^ 0x20; return c; } // Converts string str to uppercase if possible void strToUpper(char* str) { char chr = *str; // first character of str while (chr != 0) // continue until null value { *str = toUpper(chr); // uppercase char str++; // go to next character address chr = *str; // get character from address } }