#ifndef __LM8_H__ #define __LM8_H__ #include // These are universal for all memory models ('int' is always 16-bit) typedef unsigned char uint8_t; typedef signed char int8_t; typedef unsigned short uint16_t; typedef signed short int16_t; typedef unsigned long uint32_t; typedef signed long int32_t; /* * Function arguments are always passed directly in * r0-r7 for the first 8 bytes - stack there after. * * Return code are always passed in r0-r3. * * Small register reservations: * r14 - universal stack pointer * r15 - current frame pointer * * Medium register reservations: * r8-r9 - universal stack pointer * r10-r11 - current frame pointer * r13 - page pointer * * Large register reservations: * r24-r27 - universal stack pointer * r28-r31 - current frame pointer * r13-r15 - page pointer * * Both the stack and frame pointers grow downward */ static inline uint8_t get_ip(void) { uint8_t value; __asm__ volatile ("rcsr %0, ip" : "=r" (value)); return value; } static inline void set_ip (uint8_t value) { __asm__ volatile ("wcsr ip, %0" : : "r" (value)); return; } static inline uint8_t get_im (void) { uint8_t value; __asm__ volatile ("rcsr %0, im" : "=r" (value)); return value; } static inline void set_im (uint8_t value) { __asm__ volatile ("wcsr im, %0" : : "r" (value)); return; } #define lm8_interrupt_global_disable() __asm__ volatile ("clri") #define lm8_interrupt_global_enable() __asm__ volatile ("seti") void lm8_interrupt_disable (uint8_t level); void lm8_interrupt_enable (uint8_t level); void usleep (uint16_t us); void msleep (uint16_t ms); extern void lm8_uart_init (uint8_t idx, size_t base, uint8_t irq); extern char lm8_uart_getc (uint8_t idx); extern void lm8_uart_putc (uint8_t idx, char ch); extern void lm8_uart_isr (uint8_t idx); extern void simple_putc (char ch); #endif