D'oh. Wrong silence code.
[uccvend-snackrom.git] / ROM2 / helpers.c
1 #include "display_basic.h"
2 #include "vend.h"
3
4 void delay(u16 ms) {
5         asm volatile ("ldx %0\n" :: "m" (ms) : "x");
6         asm volatile (
7                 "delay_loop:\n"
8                 "       ldd #150\n"                   /* 3 */
9                 "delay_inner_loop:\n" /* 15 cycles each */
10                 "       cpd #0x0000\n"                /* 5 */
11                 "       beq delay_inner_loop_end\n"   /* 3 */
12                 "       subd #0x0001\n"               /* 4 */
13                 "       bra delay_inner_loop\n"       /* 3 */
14                 "delay_inner_loop_end:\n"
15                 "       dex\n"                        /* 3 */
16                 "       beq delay_out\n"              /* 3 */
17                 "       bra delay_loop\n"             /* 3 */
18                 "delay_out:\n" ::: "x", "d");
19 }
20
21 u8 my_strlen(char* s) {
22         char *p = s;
23         while (*p) p++;
24         return p-s;
25 }
26
27 void my_strncpy(char* dst, char* src, u8 max_size) {
28         u8 i;
29         for (i = 0; src[i] && i < max_size; i++) dst[i] = src[i];
30         if (src[i] == 0 && i < max_size) dst[i] = 0; /* null terminator */
31 }
32
33 bool my_strncmp(char* a, char* b, u8 len) {
34         u8 i;
35         for (i = 0; i < len; i++) {
36                 if (*a != *b) return 0;
37                 a++;
38                 b++;
39         }
40         return 1;
41 }
42
43 void my_memcpy(char* dst, char* src, u8 size) {
44         u8 i = 0;
45         for (i = 0; i < size; i++) dst[i] = src[i];
46 }
47
48 void my_memset(char* dst, u8 val, u16 count) {
49         char* c;
50         for (c = dst; c < dst+count; c++) *c = val;
51 }
52
53 u8 hexchar2u8(char b) {
54         if (b >= '0' && b <= '9') return b-'0';
55         if (b >= 'a' && b <= 'f') return b-'a'+0x0a;
56         if (b >= 'A' && b <= 'F') return b-'A'+0x0a;
57         return 0;
58 }
59
60 char nibble2hexchar(u8 b) {
61         if (b <= 9) return b+'0';
62         if (b >= 10 && b <= 15) return b+'A'-10;
63         return 'X';
64 }
65
66 u8 hex2u8(char msb, char lsb) {
67         return (hexchar2u8(msb) << 4) + hexchar2u8(lsb);
68 }
69
70 static char hexconv_buf[3];
71 char* u82hex(u8 a) {
72         hexconv_buf[0] = nibble2hexchar((a&0xf0) >> 4);
73         hexconv_buf[1] = nibble2hexchar(a&0x0f);
74         hexconv_buf[2] = '\0';
75         return hexconv_buf;
76 }
77
78 bool ishex(char b) {
79         if (b >= '0' && b <= '9') return 1;
80         if (b >= 'a' && b <= 'f') return 1;
81         if (b >= 'A' && b <= 'F') return 1;
82         return 0;
83 }
84

UCC git Repository :: git.ucc.asn.au