// Rowley AVR C Compiler, runtime support.
//
// Copyright (c) 2004 Rowley Associates Limited.
//
// This file may be distributed under the terms of the License Agreement
// provided with this software.
//
// THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#ifndef __inavr_H
#define __inavr_H
// Status register
sfrb __sr = 0x5f;
// Swap nibble order within a byte
#pragma intrinsic(__swap_nibbles)
unsigned char __swap_nibbles(unsigned char);
// Swap byte order within a word
#pragma intrinsic(__swap_bytes)
unsigned __swap_bytes(unsigned x);
// Swap byte order within a long
#pragma intrinsic(__swap_bytes_long)
unsigned long __swap_bytes_long(unsigned long x);
// Swap word order within a long
#pragma intrinsic(__swap_words)
unsigned long __swap_words(unsigned long);
// Insert op into the code sequence
#pragma intrinsic(__insert_opcode)
void __insert_opcode(unsigned short op);
// Put processor to sleep
#define __sleep() __insert_opcode(0x9588);
// Reset the watchdog
#define __watchdog_reset() __insert_opcode(0x95a8);
// Programmed breakpoint
#define __breakpoint() __insert_opcode(0x9598);
// Set bits in status register and return original status register
#pragma intrinsic(__bis_SR_register)
unsigned char __bis_SR_register(unsigned char);
// Clear bits in status register and return original status register
#pragma intrinsic(__bic_SR_register)
unsigned char __bic_SR_register(unsigned char);
// Disable interrupts and return original status register
#define __disable_interrupt() __bic_SR_register(0x80)
// Enable interrupts and return original status register
#define __enable_interrupt() __bis_SR_register(0x80)
#define __save_interrupt() (__sr)
#define __restore_interrupt(x) do { if (x & 0x80) __enable_interrupt(); else __disable_interrupt(); } while (0)
// Insert a NOP to code sequence.
#define __no_operation() __insert_opcode(0x0000);
// Delay for a given number of cycles.
#pragma intrinsic(__delay_cycles)
void __delay_cycles(unsigned long);
// Get high 16 bits of 32-bit value
#pragma intrinsic(_H16)
unsigned _H16(unsigned long);
// Get low 16 bits of 64-bit value
#pragma intrinsic(_L16)
unsigned _L16(unsigned long);
// Get high 32 bits of 64-bit value
#pragma intrinsic(_H32)
unsigned long _H32(unsigned long long);
// Get low 32 bits of 64-bit value
#pragma intrinsic(_L32)
unsigned long _L32(unsigned long long);
// Get high 16 bits 64-bit value
#pragma intrinsic(_HH16)
unsigned _HH16(unsigned long long);
// Get low 16 bits 64-bit value
#pragma intrinsic(_LL16)
unsigned _LL16(unsigned long long);
#endif