SAROO/Firm_Saturn/main.h
tpu 19b2e5c180 1. MCU端开机内存测试功能
2. MCU端固件自动更新
3. 支持启动光盘游戏
2023-10-31 12:59:30 +08:00

396 lines
9.6 KiB
C

#ifndef _MAIN_H_
#define _MAIN_H_
/*****************************************************************************/
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long long u64;
#define REG(x) (*(volatile unsigned int*)(x))
#define REG32(x) (*(volatile unsigned int*)(x))
#define REG16(x) (*(volatile unsigned short*)(x))
#define REG8(x) (*(volatile unsigned char*)(x))
#define NULL ((void*)0)
#define SS_ID REG16(0x25807000)
#define SS_VER REG16(0x25807002)
#define SS_CTRL REG16(0x25897004)
#define SS_STAT REG16(0x25897008)
#define SS_TIMER REG32(0x2589700c)
#define SS_CMD REG16(0x25897010)
#define SS_ARG REG16(0x25897014)
// SS_CTRL
#define SAROO_EN 0x8000
#define CS0_NONE 0x0000
#define CS0_DATA 0x1000
#define CS0_RAM1M 0x2000
#define CS0_RAM4M 0x3000
#define SAROO_LED 0x0100
// SS_CMD
#define SSCMD_PRINTF 0x0001
#define SSCMD_LISTDISC 0x0002
#define SSCMD_LOADDISC 0x0003
#define SSCMD_CHECK 0x0004
#define SSCMD_UPDATE 0x0005
#define SSCMD_FILERD 0x0006
#define SSCMD_FILEWR 0x0007
#define SSCMD_LISTBINS 0x0008
#define SSCMD_SSAVE 0x0009
#define SSCMD_LSAVE 0x000a
#define IMGINFO_ADDR 0x22080000
#define SYSINFO_ADDR 0x220a0000
#define TMPBUFF_ADDR 0x220c0000
/*****************************************************************************/
// cdblock
typedef struct {
u16 cr1;
u16 cr2;
u16 cr3;
u16 cr4;
}CDCMD;
typedef struct {
int fad;
int size;
u8 unit;
u8 gap;
u8 fn;
u8 attr;
}CdcFile;
#define CR1 REG16(0x25890018)
#define CR2 REG16(0x2589001c)
#define CR3 REG16(0x25890020)
#define CR4 REG16(0x25890024)
#define HIRQ REG16(0x25890008)
#define HMSK REG16(0x2589000c)
#define HIRQ_CMOK 0x0001
#define HIRQ_DRDY 0x0002
#define HIRQ_CSCT 0x0004
#define HIRQ_BFUL 0x0008
#define HIRQ_PEND 0x0010
#define HIRQ_DCHG 0x0020
#define HIRQ_ESEL 0x0040
#define HIRQ_EHST 0x0080
#define HIRQ_ECPY 0x0100
#define HIRQ_EFLS 0x0200
#define HIRQ_SCDQ 0x0400
#define STATUS_BUSY 0x00
#define STATUS_PAUSE 0x01
#define STATUS_STANDBY 0x02
#define STATUS_PLAY 0x03
#define STATUS_SEEK 0x04
#define STATUS_SCAN 0x05
#define STATUS_OPEN 0x06
#define STATUS_NODISC 0x07
#define STATUS_RETRY 0x08
#define STATUS_ERROR 0x09
#define STATUS_FATAL 0x0a
#define STATUS_PERIODIC 0x20
#define STATUS_TRANSFER 0x40
#define STATUS_WAIT 0x80
#define STATUS_REJECT 0xff
#define INDIRECT_CALL(addr, return_type, ...) (**(return_type(**)(__VA_ARGS__)) addr)
#define bios_run_cd_player INDIRECT_CALL(0x0600026C, void, void)
#define bios_loadcd_init1 INDIRECT_CALL(0x060002dc, int, int) // 00002650
#define bios_loadcd_init INDIRECT_CALL(0x0600029c, int, int) // 00001904
#define bios_loadcd_read INDIRECT_CALL(0x060002cc, int, void) // 00001912
#define bios_loadcd_boot INDIRECT_CALL(0x06000288, int, void) // 000018A8
//!< mode 0 -> check, 1 -> do auth
#define bios_check_cd_auth INDIRECT_CALL(0x06000270, int, int mode)
void clear_hirq(int mask);
int wait_hirq(int mask);
int wait_status(int wait);
int cdc_cmd(int wait, CDCMD *cmd, CDCMD *resp, char *cmdname);
int cdc_get_status(int *status);
int cdc_get_hwinfo(int *status);
int cdc_cdb_init(int standby);
int cdc_end_trans(int *cdwnum);
int cdc_get_toc(u8 *buf);
int cdc_play_fad(int mode, int start_fad, int range);
int cdc_cddev_connect(int filter);
int cdc_get_cddev(int *selnum);
int cdc_set_filter_range(int selnum, int start_fad, int num_sector);
int cdc_get_filter_range(int selnum, int *fad, int *num_sector);
int cdc_set_filter_mode(int selnum, int mode);
int cdc_get_filter_mode(int selnum, int *mode);
int cdc_set_filter_connect(int selnum, int c_true, int c_false);
int cdc_get_filter_connect(int selnum, int *c_true, int *c_false);
int cdc_reset_selector(int flag, int selnum);
int cdc_get_buffer_size(int *total, int *pnum, int *free);
int cdc_get_numsector(int selnum, int *snum);
int cdc_calc_actsize(int bufno, int spos, int snum);
int cdc_get_actsize(int *actsize);
int cdc_get_sector_info(int bufno, int secno, int *fad);
int cdc_set_size(int size);
int cdc_get_data(int bufnum, int spos, int snum);
int cdc_get_del_data(int bufnum, int spos, int snum);
void cdc_trans_data(u8 *buf, int length);
int cdc_auth_status(int *status);
int cdc_auth_device(void);
int cdc_change_dir(int selnum, int fid);
int cdc_read_dir(int selnum, int fid);
int cdc_get_file_scope(int *fid, int *fnum, int *drend);
int cdc_get_file_info(int fid, CdcFile *buf);
int cdc_read_file(int selnum, int fid, int offset);
int cdc_abort_file(void);
void cdc_dump(int count);
void show_selector(int id);
void cdblock_on(int wait);
void cdblock_off(void);
int cdblock_check(void);
int bios_cd_cmd(int type);
int cdc_read_sector(int fad, int size, u8 *buf);
void my_cdplayer(void);
void bup_init(u8 *lib_addr, u8 *work_addr, void *cfg);
/*****************************************************************************/
extern const int HZ;
void reset_timer(void);
u32 get_timer(void);
void usleep(u32 us);
void msleep(u32 ms);
/*****************************************************************************/
#define PAD_RIGHT (1<<15)
#define PAD_LEFT (1<<14)
#define PAD_DOWN (1<<13)
#define PAD_UP (1<<12)
#define PAD_START (1<<11)
#define PAD_A (1<<10)
#define PAD_C (1<<9)
#define PAD_B (1<<8)
#define PAD_RT (1<<7)
#define PAD_X (1<<6)
#define PAD_Y (1<<5)
#define PAD_Z (1<<4)
#define PAD_LT (1<<3)
u32 pad_read(void);
int smpc_cmd(int cmd);
/*****************************************************************************/
void conio_init(void);
void conio_put_char(int x, int y, int color, int ch);
void conio_putc(int ch);
u32 conio_getc(void);
#define BUTTON_DOWN(stat, bt) ( (stat & ((bt<<16)|bt)) == ((bt<<16)|bt) )
#define BUTTON_UP (stat, bt) ( ((stat^(~bt)) & ((bt<<16)|bt)) == ((bt<<16)|bt) )
extern int fbw, fbh;
void put_pixel(int x, int y, int c);
void put_line (int x1, int y1, int x2, int y2, int c);
void put_hline(int y, int x1, int x2, int c);
void put_vline(int x, int y1, int y2, int c);
void put_rect (int x1, int y1, int x2, int y2, int c);
void put_box(int x1, int y1, int x2, int y2, int c);
/*****************************************************************************/
void sci_init(void);
void sci_putc(int ch);
int sci_getc(int timeout);
/*****************************************************************************/
extern int to_stm32;
extern int gets_from_stm32;
extern void (*printk_putc)(int ch);
int printk(char *fmt, ...);
int snprintf(char *buf, int size, char *fmt, ...);
#define sprintf(buf, fmt, ...) snprintf(buf, 1024, fmt, __VA_ARGS__)
int strlen(char *s);
int strcmp(char *s1, char *s2);
int strncmp(char *s1, char *s2, int n);
char *strcpy(char *dst, char *src);
char *strncpy(char *dst, char *src, int n);
char *strchr(char *s1, int ch);
u32 strtoul(char *str, char **endptr, int requestedbase, int *ret);
void *memset(void *s, int v, int n);
void *memcpy(void *to, void *from, int n);
int memcmp(void *dst, void *src, int n);
int tiny_xmodem_recv(u8 *dest);
/*****************************************************************************/
void sci_shell(void);
int gets(char *buf, int len);
int str2hex(char *str, int *hex);
void dump(int argc, int *args, int width);
void mem_dump(char *str, void *addr, int size);
int read_file (char *name, int offset, int size, void *buf);
int write_file(char *name, int offset, int size, void *buf);
u32 BE32(void *ptr);
u32 LE32(void *ptr);
u32 get_build_date(void);
/*****************************************************************************/
#define ISR_GEN_INST 4
#define ISR_SLOT_INST 6
#define ISR_CPU_ADDR 9
#define ISR_DMA_ADDR 10
#define ISR_NMI 11
#define ISR_UBR 12
#define MASTER_CPU 0x00
#define SLAVE_CPU 0x80
typedef struct {
u32 pr;
u32 gbr;
u32 vbr;
u32 mach;
u32 macl;
u32 r15;
u32 r14;
u32 r13;
u32 r12;
u32 r11;
u32 r10;
u32 r9;
u32 r8;
u32 r7;
u32 r6;
u32 r5;
u32 r4;
u32 r3;
u32 r2;
u32 r1;
u32 r0;
u32 pc;
u32 sr;
}REGS;
u32 crc32(u8 *buf, int len, u32 crc);
u32 get_sr(void);
void set_sr(u32 sr);
void install_isr(int type);
void break_in_game(int break_pc, void *handle);
void break_in_game_next(int break_pc, void *handle);
void install_ubr_isr(void);
void set_break_pc(u32 addr, u32 mask);
void set_break_rw(u32 addr, u32 mask, int rw);
extern int game_break_pc;
#define BRK_READ 0x04
#define BRK_WRITE 0x08
#define BRK_RW 0x0c
/*****************************************************************************/
typedef struct menu_desc_t {
int num;
int current;
char title[64];
char items[11][64];
char *version;
int (*handle)(int index);
}MENU_DESC;
#define MENU_EXIT 99
#define MENU_RESTART 98
void menu_init(void);
void add_menu_item(MENU_DESC *menu, char *item);
int menu_run(MENU_DESC *menu);
void menu_status(MENU_DESC *menu, char *string);
void draw_menu_frame(MENU_DESC *menu);
void menu_update(MENU_DESC *menu);
int menu_default(MENU_DESC *menu, int ctrl);
extern int lang_id;
void lang_init(void);
char *TT(char *str);
/*****************************************************************************/
// game patch
extern int skip_patch;
void patch_game(char *id);
/*****************************************************************************/
extern u32 debug_flag;
/*****************************************************************************/
#endif