A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 131 lines 2.5 kB view raw
1 2 3 4#include "rockmacros.h" 5#include <stdio.h> 6 7#include "defs.h" 8#include "mem.h" 9#include "rtc-gb.h" 10 11struct rtc rtc; 12 13void rtc_latch(byte b) 14{ 15 if ((rtc.latch ^ b) & b & 1) 16 { 17 rtc.regs[0] = rtc.s; 18 rtc.regs[1] = rtc.m; 19 rtc.regs[2] = rtc.h; 20 rtc.regs[3] = rtc.d; 21 rtc.regs[4] = (rtc.d>>9) | (rtc.stop<<6) | (rtc.carry<<7); 22 rtc.regs[5] = 0xff; 23 rtc.regs[6] = 0xff; 24 rtc.regs[7] = 0xff; 25 } 26 rtc.latch = b; 27} 28 29void rtc_write(byte b) 30{ 31 /* printf("write %02X: %02X (%d)\n", rtc.sel, b, b); */ 32 if (!(rtc.sel & 8)) return; 33 switch (rtc.sel & 7) 34 { 35 case 0: 36 rtc.s = rtc.regs[0] = b; 37 while (rtc.s >= 60) rtc.s -= 60; 38 break; 39 case 1: 40 rtc.m = rtc.regs[1] = b; 41 while (rtc.m >= 60) rtc.m -= 60; 42 break; 43 case 2: 44 rtc.h = rtc.regs[2] = b; 45 while (rtc.h >= 24) rtc.h -= 24; 46 break; 47 case 3: 48 rtc.regs[3] = b; 49 rtc.d = (rtc.d & 0x100) | b; 50 break; 51 case 4: 52 rtc.regs[4] = b; 53 rtc.d = (rtc.d & 0xff) | ((b&1)<<9); 54 rtc.stop = (b>>6)&1; 55 rtc.carry = (b>>7)&1; 56 break; 57 } 58} 59 60void rtc_tick(void) 61{ 62 if (rtc.stop) return; 63 if (++rtc.t == 60) 64 { 65 if (++rtc.s == 60) 66 { 67 if (++rtc.m == 60) 68 { 69 if (++rtc.h == 24) 70 { 71 if (++rtc.d == 365) 72 { 73 rtc.d = 0; 74 rtc.carry = 1; 75 } 76 rtc.h = 0; 77 } 78 rtc.m = 0; 79 } 80 rtc.s = 0; 81 } 82 rtc.t = 0; 83 } 84} 85 86void rtc_save_internal(int fd) 87{ 88 int rt = 0; 89 90#if CONFIG_RTC 91 rt = rb->mktime(rb->get_time()); 92#endif 93 fdprintf(fd, "%d %d %d %d %d %d %d %d\n", rtc.carry, rtc.stop, rtc.d, rtc.h, 94 rtc.m, rtc.s, rtc.t, rt); 95} 96 97void rtc_load_internal(int fd) 98{ 99 int rt = 0; 100 char buf[32]; 101 102 rb->read_line(fd, buf, sizeof(buf)); 103 sscanf(buf, "%d %d %d %d %d %d %d %d\n", &rtc.carry, &rtc.stop, &rtc.d, 104 &rtc.h, &rtc.m, &rtc.s, &rtc.t, &rt); 105 106 while (rtc.t >= 60) rtc.t -= 60; 107 while (rtc.s >= 60) rtc.s -= 60; 108 while (rtc.m >= 60) rtc.m -= 60; 109 while (rtc.h >= 24) rtc.h -= 24; 110 while (rtc.d >= 365) rtc.d -= 365; 111 rtc.stop &= 1; 112 rtc.carry &= 1; 113 114#if CONFIG_RTC 115 if (rt) rt = (rb->mktime(rb->get_time()) - rt) * 60; 116#endif 117 while (rt-- > 0) rtc_tick(); 118 119} 120 121 122 123 124 125 126 127 128 129 130 131