/*
* user_io.h
*
*/

#ifndef USER_IO_H
#define USER_IO_H

#include <inttypes.h>
#include "file_io.h"

#define UIO_STATUS      0x00
#define UIO_BUT_SW      0x01

// codes as used by minimig (amiga)
#define UIO_JOYSTICK0   0x02  // also used by 8 bit
#define UIO_JOYSTICK1   0x03  // -"-
#define UIO_MOUSE       0x04  // -"-
#define UIO_KEYBOARD    0x05  // -"-
#define UIO_KBD_OSD     0x06  // keycodes used by OSD only

// 0x08 - 0x0F - core specific
#define ST_WRITE_MEMORY 0x08
#define ST_READ_MEMORY  0x09
#define ST_ACK_DMA      0x0a
#define ST_NAK_DMA      0x0b
#define ST_GET_DMASTATE 0x0c

#define UIO_JOYSTICK2   0x10  // also used by minimig and 8 bit
#define UIO_JOYSTICK3   0x11  // -"-
#define UIO_JOYSTICK4   0x12  // -"-
#define UIO_JOYSTICK5   0x13  // -"-

// codes as currently used by 8bit only
#define UIO_GET_STRING  0x14
#define UIO_SET_STATUS  0x15
#define UIO_GET_SDSTAT  0x16  // read status of sd card emulation
#define UIO_SECTOR_RD   0x17  // SD card sector read
#define UIO_SECTOR_WR   0x18  // SD card sector write
#define UIO_SET_SDCONF  0x19  // send SD card configuration (CSD, CID)
#define UIO_ASTICK      0x1a
#define UIO_SIO_IN      0x1b  // serial in
#define UIO_SET_SDSTAT  0x1c  // set sd card status
#define UIO_SET_SDINFO  0x1d  // send info about mounted image
#define UIO_SET_STATUS2 0x1e  // 32bit status
#define UIO_GET_KBD_LED 0x1f  // keyboard LEDs control
#define UIO_SET_VIDEO   0x20
#define UIO_PS2_CTL     0x21  // get PS2 control from supported cores
#define UIO_RTC         0x22  // transmit RTC data to core
#define UIO_GET_VRES    0x23  // get video resolution
#define UIO_TIMESTAMP   0x24  // transmit seconds since Unix epoch
#define UIO_LEDS        0x25  // control on-board LEDs
#define UIO_AUDVOL      0x26  // Digital volume as a number of bits to shift to the right
#define UIO_SETHEIGHT   0x27  // Set max scaled vertical resolution
#define UIO_GETUARTFLG  0x28  // Get UART_FLG_*
#define UIO_GET_STATUS  0x29  // Update status from the core
#define UIO_SET_FLTCOEF 0x2A  // Set Scaler polyphase coefficients
#define UIO_SET_FLTNUM  0x2B  // Set Scaler predefined filter
#define UIO_GET_VMODE   0x2C  // Get video mode parameters
#define UIO_SET_VPOS    0x2D  // Set video positions
#define UIO_GET_OSDMASK 0x2E  // Get mask
#define UIO_SET_FBUF    0x2F  // Set frame buffer for HPS output
#define UIO_WAIT_VSYNC  0x30  // Wait for VSync
#define UIO_SET_MEMSZ   0x31  // Send memory size to the core
#define UIO_SET_GAMMA   0x32  // Enable/disable Gamma correction
#define UIO_SET_GAMCURV 0x33  // Set Gamma curve
#define UIO_CD_GET      0x34
#define UIO_CD_SET      0x35
#define UIO_INFO_GET    0x36
#define UIO_SETWIDTH    0x37  // Set max scaled horizontal resolution
#define UIO_SETSYNC     0x38

// codes as used by 8bit for file loading from OSD
#define UIO_FILE_TX     0x53
#define UIO_FILE_TX_DAT 0x54
#define UIO_FILE_INDEX  0x55
#define UIO_FILE_INFO   0x56

// ao486 direct memory access
#define UIO_DMA_WRITE   0x61
#define UIO_DMA_READ    0x62
#define UIO_DMA_SDIO    0x63

// ---- Minimig v2 constants -------
#define UIO_MM2_WR      0xF0 //0x1c
#define UIO_MM2_RST     0xF1 //0x08
#define UIO_MM2_AUD     0xF2 //0x74
#define UIO_MM2_CHIP    0xF3 //0x04
#define UIO_MM2_CPU     0xF4 //0x14
#define UIO_MM2_MEM     0xF5 //0x24
#define UIO_MM2_VID     0xF6 //0x34
#define UIO_MM2_FLP     0xF7 //0x44
#define UIO_MM2_HDD     0xF8 //0x54
#define UIO_MM2_JOY     0xF9 //0x64

#define JOY_RIGHT       0x01
#define JOY_LEFT        0x02
#define JOY_DOWN        0x04
#define JOY_UP          0x08
#define JOY_BTN_SHIFT   4
#define JOY_BTN1        0x10
#define JOY_BTN2        0x20
#define JOY_BTN3        0x40
#define JOY_BTN4        0x80
#define JOY_MOVE        (JOY_RIGHT|JOY_LEFT|JOY_UP|JOY_DOWN)

// virtual gamepad buttons
#define JOY_A      JOY_BTN1
#define JOY_B      JOY_BTN2
#define JOY_SELECT JOY_BTN3
#define JOY_START  JOY_BTN4
#define JOY_X      0x100
#define JOY_Y      0x200
#define JOY_L      0x400
#define JOY_R      0x800
#define JOY_L2     0x1000
#define JOY_R2     0x2000
#define JOY_L3     0x4000
#define JOY_R3     0x8000

// keyboard LEDs control
#define KBD_LED_CAPS_CONTROL  0x01
#define KBD_LED_CAPS_STATUS   0x02
#define KBD_LED_CAPS_MASK     (KBD_LED_CAPS_CONTROL | KBD_LED_CAPS_STATUS)
#define KBD_LED_NUM_CONTROL   0x04
#define KBD_LED_NUM_STATUS    0x08
#define KBD_LED_NUM_MASK      (KBD_LED_NUM_CONTROL | KBD_LED_NUM_STATUS)
#define KBD_LED_SCRL_CONTROL  0x10
#define KBD_LED_SCRL_STATUS   0x20
#define KBD_LED_SCRL_MASK     (KBD_LED_SCRL_CONTROL | KBD_LED_SCRL_STATUS)
#define KBD_LED_FLAG_MASK     0xC0
#define KBD_LED_FLAG_STATUS   0x40

#define BUTTON1                 0b0000000000000001
#define BUTTON2                 0b0000000000000010
#define CONF_VGA_SCALER         0b0000000000000100
#define CONF_CSYNC              0b0000000000001000
#define CONF_FORCED_SCANDOUBLER 0b0000000000010000
#define CONF_YPBPR              0b0000000000100000
#define CONF_AUDIO_96K          0b0000000001000000
#define CONF_DVI                0b0000000010000000
#define CONF_HDMI_LIMITED1      0b0000000100000000
#define CONF_VGA_SOG            0b0000001000000000
#define CONF_DIRECT_VIDEO       0b0000010000000000
#define CONF_HDMI_LIMITED2      0b0000100000000000
#define CONF_VGA_FB             0b0001000000000000

// core type value should be unlikely to be returned by broken cores
#define CORE_TYPE_UNKNOWN   0x55
#define CORE_TYPE_8BIT      0xa4   // generic core
#define CORE_TYPE_ARCHIE    0xa6   // Acorn Archimedes
#define CORE_TYPE_SHARPMZ   0xa7   // Sharp MZ Series
#define CORE_TYPE_8BIT2     0xa8   // generic core using dual SDRAM

#define UART_FLG_PPP        0x0001
#define UART_FLG_TERM       0x0002
#define UART_FLG_RTSCTS     0x0004
#define UART_FLG_DTRDSR     0x0008
#define UART_FLG_DSRDCD     0x0010
#define UART_FLG_9600       0x0100
#define UART_FLG_19200      0x0200
#define UART_FLG_38400      0x0400
#define UART_FLG_57600      0x0800
#define UART_FLG_115200     0x1000

// user io status bits (currently only used by 8bit)
#define UIO_STATUS_RESET   0x01

#define UIO_STOP_BIT_1   0
#define UIO_STOP_BIT_1_5 1
#define UIO_STOP_BIT_2   2

#define UIO_PARITY_NONE  0
#define UIO_PARITY_ODD   1
#define UIO_PARITY_EVEN  2
#define UIO_PARITY_MARK  3
#define UIO_PARITY_SPACE 4

#define UIO_PRIORITY_KEYBOARD 0
#define UIO_PRIORITY_GAMEPAD  1

#define EMU_NONE  0
#define EMU_MOUSE 1
#define EMU_JOY0  2
#define EMU_JOY1  3

void user_io_init(const char *path, const char *xml);
unsigned char user_io_core_type();
void user_io_poll();
char user_io_menu_button();
char user_io_user_button();
void user_io_osd_key_enable(char);
void user_io_read_confstr();
char *user_io_get_confstr(int index);
uint32_t user_io_8bit_set_status(uint32_t, uint32_t, int ex = 0);
int user_io_file_tx(const char* name, unsigned char index = 0, char opensave = 0, char mute = 0, char composite = 0);
void user_io_file_tx_write(const uint8_t *addr, uint16_t len);
int user_io_get_width();

uint32_t user_io_get_file_crc();
int  user_io_file_mount(const char *name, unsigned char index = 0, char pre = 0);
char *user_io_make_filepath(const char *path, const char *filename);
char *user_io_get_core_name();
char *user_io_get_core_path();
const char *user_io_get_core_name_ex();
void user_io_name_override(const char* name);
char has_menu();

const char *get_image_name(int i);

int user_io_get_kbdemu();
uint32_t user_io_get_uart_mode();

void user_io_mouse(unsigned char b, int16_t x, int16_t y, int16_t w);
void user_io_kbd(uint16_t key, int press);
char* user_io_create_config_name();
int user_io_get_joy_transl();
void user_io_digital_joystick(unsigned char, uint32_t, int);
void user_io_analog_joystick(unsigned char, char, char);
void user_io_set_joyswap(int swap);
int user_io_get_joyswap();
char user_io_osd_is_visible();
void set_vga_fb(int enable);
int get_vga_fb();
void user_io_set_ini(int ini_num);
void user_io_send_buttons(char);
uint16_t user_io_get_sdram_cfg();

void user_io_set_index(unsigned char index);
void user_io_set_download(unsigned char enable);
unsigned char user_io_ext_idx(char *, char*);

void user_io_check_reset(unsigned short modifiers, char useKeys);

void user_io_rtc_reset();

const char* get_rbf_dir();
const char* get_rbf_name();
const char* get_rbf_path();

uint16_t sdram_sz(int sz = -1);
int user_io_is_dualsdr();
uint16_t altcfg(int alt = -1);

int GetUARTMode();
void SetUARTMode(int mode);
int GetMidiLinkMode();
void SetMidiLinkMode(int mode);

void set_volume(int cmd);
int  get_volume();

void user_io_store_filename(char *filename);
int user_io_use_cheats();

void diskled_on();
#define DISKLED_ON  diskled_on()
#define DISKLED_OFF void()

char is_minimig();
char is_sharpmz();
char is_menu();
char is_x86();
char is_snes();
char is_neogeo();
char is_megacd();
char is_pce();
char is_archie();
char is_gba();
char is_c64();
char is_st();

#define HomeDir (is_menu() ? "Scripts" : user_io_get_core_path())
#define CoreName (is_menu() ? "Scripts" : user_io_get_core_name())

#endif // USER_IO_H
