5f0da09c9770b2706e9f61bec11213d25cd47900
[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));
14         asm volatile (
15                 "delay_loop:\n"
16                 "       dex\n"                        /* 3 */
17                 "       beq delay_out\n"              /* 3 */
18                 "       ldd #327\n"                   /* 3 */
19                 "delay_inner_loop:\n" /* 15 cycles each */
20                 "       cpd #0x0000\n"                /* 5 */
21                 "       beq delay_inner_loop_end\n"   /* 3 */
22                 "       subd #0x0001\n"               /* 4 */
23                 "       bra delay_inner_loop\n"       /* 3 */
24                 "delay_inner_loop_end:\n"
25                 "       bra delay_loop\n"             /* 3 */
26                 "delay_out:\n");
27                 /*"     pulb\n"
28                 "       pula\n"
29                 "       pulx\n");*/
30 }
31
32 void my_strncpy(char* dst, char* src, u8 max_size) {
33         u8 i;
34         for (i = 0; src[i] && i < max_size; i++) dst[i] = src[i];
35         if (src[i] == 0 && i < max_size) dst[i] = 0; /* null terminator */
36 }
37
38 void my_memcpy(char* dst, char* src, u8 size) {
39         u8 i = 0;
40         for (i = 0; i < size; i++) dst[i] = src[i];
41 }

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