/* module.h
   --------
   8/3/23
*/

#ifndef module_h
#define module_h

#ifndef FALSE
#define FALSE 0
#define TRUE !FALSE
#endif

#ifndef NULL
#define NULL 0
#endif

// MIDISupport SWI numbers
#define MIDISupport_InstallDriver   0x4EE80
#define MIDISupport_RemoveDriver    0x4EE81
#define MIDISupport_DriverInfo      0x4EE82
#define MIDISupport_CreateDriver    0x4EE83
#define MIDISupport_Send            0x4EE84
#define MIDISupport_Receive         0x4EE85
#define MIDISupport_Connect         0x4EE86
#define MIDISupport_ConnectName     0x4EE87
#define MIDISupport_GetAddress      0x4EE88
#define MIDISupport_Insert          0x4EE89

#define MTimer_Register             0xd25c0
#define MTimer_Remove               0xd25c1

// DeviceFS_CallDevice reason codes
#define DEVFS_WAKEUP_TX   2
#define DEVFS_WAKEUP_RX   3
#define DEVFS_USB_CTRL    0x80000000
#define DEVFS_CHECK_BUFF  0x80000002
#define DEVFS_HANDLES     0x80000003
#define DEVFS_LOCATION    0x80000004
#define DEVFS_CLEAR_STALL 0x80000005
#define DEVFS_TRANS_INFO  0x80000006
#define DEVFS_HANDLES2    0x80000007
#define DEVFS_OPTIONS     0x80000008

// Buffer service routine reason codes
#define BUF_INSERT_BYTE     0
#define BUF_INSERT_BLOCK    1
#define BUF_REMOVE_BYTE     2
#define BUF_REMOVE_BLOCK    3
#define BUF_EXAMINE_BYTE    4
#define BUF_EXAMINE_BLOCK   5
#define BUF_USED_SPACE      6
#define BUF_FREE_SPACE      7
#define BUF_PURGE           8
#define BUF_NEXT_FILLED_BLK 9

#define MAX_PORTS 4

typedef struct mod_s
{
  int registered[MAX_PORTS];
  int driver_number[MAX_PORTS]; // 1..MAX_PORTS
  int ports; // number of ports in use

  struct support_s
  {
    int receive;
    int give;
    int pw;       // r12 value
  } support;

  struct buffer_s
  {
    int service;  // call address
    int pw;       // r12 value
  } buffer;

  FILE *log;
  unsigned int debug;
  int callbacks;
  int service_num;
  int service_data;
  unsigned int options;
  unsigned int ticks;
} mod_t;

// debug bits
#define DBG_MSG 0
#define DBG_MOD 1
#define DBG_BUF 2
// options bits
#define OPT_LIMIT_TX 0

extern mod_t mod;
void module_call(int fn, _kernel_swi_regs *regs, int pw); // veneer.s


#endif
