void timer_cycle(void) { /* The amount of ticks since we last ran */ unsigned int delta = cpu_get_cycles() - prev_time; prev_time = cpu_get_cycles(); elapsed += delta * 4; /* 4 cycles to a timer tick */ if(elapsed >= 16) { timer_tick(); elapsed -= 16; /* keep track of the time overflow */ } }
//Recup donnée immédiate de 16 bits unsigned short mem_get_word(unsigned short i){ unsigned long elapsed; if(DMA_pending && i < 0xFF80) { elapsed = cpu_get_cycles() - DMA_pending; if(elapsed >= 160) DMA_pending = 0; else { return mem[0xFE00+elapsed]; } } return mem[i] | (mem[i+1]<<8); }
//Recup donnée immédiate de 8 bits unsigned char mem_get_byte(unsigned short i) { unsigned long elapsed; unsigned char mask = 0; if(DMA_pending && i < 0xFF80) { elapsed = cpu_get_cycles() - DMA_pending; if(elapsed >= 160) DMA_pending = 0; else { return mem[0xFE00+elapsed]; } } return mem[i]; }
int sys_clock(uint64_t *val) { error_t err; uint64_t cycles; if((val == NULL) || NOT_IN_USPACE((uint_t)val)) { err = EINVAL; goto fail_inval; } cycles = cpu_get_cycles(current_cpu); err = cpu_copy_to_uspace(val, &cycles, sizeof(cycles)); fail_inval: current_thread->info.errno = err; return err; }