Lots of changes! Takes us to rom S
[uccvend-snackrom.git] / ROM2 / helpers.c
1 #include "display_basic.h"
2 #include "vend.h"
3
4 void delay(u16 ms) {
5         /* delay routine written in assembly so we know what we're really getting.
6          * each inner loop should take ~1 ms to execute.
7          * 15 cycles * (1/4.9152Mhz) * 327 = 0.997 ms + a little bit on the fringes.
8          *
9          * XXX - how do we know gcc isn't optimising this? it seems to optimise after
10          * parsing C -> asm, but before asm -> machine code.
11          */
12         //asm volatile ("pshx\npsha\npshb\n"); /* save registers */
13         asm volatile ("ldx %0\n" :: "m" (ms) : "x");
14         asm volatile (
15                 "delay_loop:\n"
16                 "       dex\n"                        /* 3 */
17                 "       beq delay_out\n"              /* 3 */
18                 //"     ldd #327\n"                   /* 3 */
19                 "       ldd #150\n"                   /* 3 */
20                 "delay_inner_loop:\n" /* 15 cycles each */
21                 "       cpd #0x0000\n"                /* 5 */
22                 "       beq delay_inner_loop_end\n"   /* 3 */
23                 "       subd #0x0001\n"               /* 4 */
24                 "       bra delay_inner_loop\n"       /* 3 */
25                 "delay_inner_loop_end:\n"
26                 "       bra delay_loop\n"             /* 3 */
27                 "delay_out:\n" ::: "x", "d");
28                 /*"     pulb\n"
29                 "       pula\n"
30                 "       pulx\n");*/
31 }
32
33 void my_strncpy(char* dst, char* src, u8 max_size) {
34         u8 i;
35         for (i = 0; src[i] && i < max_size; i++) dst[i] = src[i];
36         if (src[i] == 0 && i < max_size) dst[i] = 0; /* null terminator */
37 }
38
39 bool my_strncmp(char* a, char* b, u8 len) {
40         u8 i;
41         for (i = 0; i < len; i++) {
42                 if (*a != *b) return 0;
43                 a++;
44                 b++;
45         }
46         return 1;
47 }
48
49 void my_memcpy(char* dst, char* src, u8 size) {
50         u8 i = 0;
51         for (i = 0; i < size; i++) dst[i] = src[i];
52 }

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