#ifndef MIPSY_H
#define MIPSY_H

/*
 *      constants
 *      (copied from 'breakcode.h')
 */
/* program termination */
#define BREAK_PROGRAM_EXIT      0x1
/* read data */
#define BREAK_READ_INT          0x11
#define BREAK_READ_CHAR         0x12
#define BREAK_READ_STRING       0x13
/* print data */
#define BREAK_PRINT_INT         0x21
#define BREAK_PRINT_CHAR        0x22
#define BREAK_PRINT_STRING      0x23


/*
 *      macros
 */
/* program termination */
#define EXIT(v)                                                 \
        asm volatile ("li $2,%0; move $4,%1; break"             \
                       : : "i" (BREAK_PROGRAM_EXIT), "r" (v): "2", "4")

/*
  read data
*/
#define READ_INT(v)                                            \
        asm volatile ("li $2,%1; break; move %0,$2"             \
                       : "=r" (v) : "i" (BREAK_READ_INT) : "2")

#define READ_CHAR(v)                                           \
        asm volatile ("li $2,%1; break; move %0,$2"             \
                       : "=r" (v) : "i" (BREAK_READ_CHAR) : "2")

#define READ_STRING(v)                                         \
        asm volatile ("li $2,%0; move $4,%1; break"             \
                       : : "i" (BREAK_READ_STRING), "r" (v) : "2", "4")

/*
  print data
*/
#define PRINT_INT(v)                                            \
        asm volatile ("li $2,%0; move $4,%1; break"             \
                       : : "i" (BREAK_PRINT_INT), "r" (v) : "2", "4")

#define PRINT_CHAR(v)                                           \
        asm volatile ("li $2,%0; move $4,%1; break"             \
                       : : "i" (BREAK_PRINT_CHAR), "r" (v) : "2", "4")

#define PRINT_STRING(v)                                         \
        asm volatile ("li $2,%0; move $4,%1; break"             \
                       : : "i" (BREAK_PRINT_STRING), "r" (v) : "2", "4")

#endif  /* MIPSY_H */