diff --git a/Firm_MCU/Main/main.c b/Firm_MCU/Main/main.c index 7b9ff25..f22623e 100644 --- a/Firm_MCU/Main/main.c +++ b/Firm_MCU/Main/main.c @@ -225,10 +225,10 @@ int flash_update(int check) return -1; } fsize = f_size(&fp); - printk("Found firm file.\n"); - printk(" Size %08x\n", fsize); if(check){ + printk("Found firm file.\n"); + printk(" Size %08x\n", fsize); f_close(&fp); return 0; } @@ -236,16 +236,16 @@ int flash_update(int check) u32 rv; f_read(&fp, fbuf, fsize, &rv); + f_close(&fp); - - disable_irq(); + int key = disable_irq(); int firm_addr = 0x08000000; _puts("erase ...\n"); retv = flash_erase(firm_addr); if(retv){ + restore_irq(key); _puts(" faile!\n"); - f_close(&fp); return -2; } @@ -253,14 +253,16 @@ int flash_update(int check) for(i=0; iMASK = 0; SDIO->ICR = 0x1fe00fff; SDIO->CLKCR = 0; + SDIO->CLKCR = 1<<16; sd_rca = 0; cmd_sem = osSemaphoreNew(1, 0, NULL); diff --git a/Firm_MCU/Main/shell.c b/Firm_MCU/Main/shell.c index 631452e..a2370bf 100644 --- a/Firm_MCU/Main/shell.c +++ b/Firm_MCU/Main/shell.c @@ -199,40 +199,45 @@ static u16 mksum(u32 addr) } -int mem_test(void) +int mem_test(u32 addr, int size) { - u32 addr0 = 0x61400000; u16 rd, sum; - int i, size=0x00100000; + int i, ecnt=0; + printk("Memory test at %08x ...", addr); + + size /= 2; for(i=0; i=3){ memset((void*)arg[0], arg[1], arg[2]); diff --git a/Firm_MCU/Main/spi1_fpga.c b/Firm_MCU/Main/spi1_fpga.c index 320f9a3..9fbf762 100644 --- a/Firm_MCU/Main/spi1_fpga.c +++ b/Firm_MCU/Main/spi1_fpga.c @@ -244,12 +244,11 @@ int fpga_update(int check) printk("No FPGA config file.\n"); return -1; } - fsize = f_size(&fp); - printk("Found FPGA config file.\n"); - printk(" Size %08x\n", fsize); if(check){ + printk("Found FPGA config file.\n"); + printk(" Size %08x\n", fsize); f_close(&fp); return 0; } @@ -272,6 +271,7 @@ int fpga_update(int check) f_close(&fp); printk("FPGA update OK!\n"); + f_unlink("/SAROO/update/SSMaster.rbf"); return 0; } diff --git a/Firm_MCU/Saturn/cdc.h b/Firm_MCU/Saturn/cdc.h index 3f2278e..2a1b429 100644 --- a/Firm_MCU/Saturn/cdc.h +++ b/Firm_MCU/Saturn/cdc.h @@ -108,6 +108,7 @@ #define SSCMD_FILEWR 0x0007 #define SSCMD_LISTBIN 0x0008 #define SSCMD_SSAVE 0x0009 +#define SSCMD_LSAVE 0x000a #define MSF_TO_FAD(m,s,f) ((m * 4500) + (s * 75) + f) @@ -280,6 +281,7 @@ extern int in_isr; extern int lang_id; extern int debug_flags; +extern int auto_update; extern int sector_delay; extern int sector_delay_force; extern int play_delay; diff --git a/Firm_MCU/Saturn/saturn_main.c b/Firm_MCU/Saturn/saturn_main.c index 1e0c840..af87dd5 100644 --- a/Firm_MCU/Saturn/saturn_main.c +++ b/Firm_MCU/Saturn/saturn_main.c @@ -15,6 +15,7 @@ int sector_delay = 0; int sector_delay_force = -1; int play_delay = 0; int play_delay_force = -1; +int auto_update = 0; int log_mask = LOG_MASK_DEFAULT; @@ -525,6 +526,12 @@ void ss_cmd_handle(void) SS_ARG = retv; SS_CMD = 0; break; + case SSCMD_LSAVE: + // 加载指定SAVE + retv = load_savefile((char*)(TMPBUFF_ADDR+0x10)); + SS_ARG = retv; + SS_CMD = 0; + break; default: SSLOG(_INFO, "[SS] unkonw cmd: %04x\n", cmd); break; @@ -691,11 +698,48 @@ void saturn_config(void) u32 rv; parse_config("/saroocfg.txt", NULL); + + if(auto_update){ + int fp, fl; + + fp = fpga_update(1); + fl = flash_update(1); + if(fp==-1 && fl==-1){ + // 没有升级文件 + led_event(LEDEV_NONE); + }else{ + led_event(LEDEV_BUSY); + if(fp==0){ + fpga_update(0); + } + if(fl==0){ + fl = flash_update(0); + if(fl<-1){ + led_event(LEDEV_FILE_ERROR); + return; + } + } + led_event(LEDEV_OK); + return; + } + } - - - - + if(debug_flags&0xc0000000){ + led_event(LEDEV_BUSY); + int cnt = 0; + while(1){ + retv = mem_test(0x61000000, 0x00800000); + if(retv){ + led_event(LEDEV_SDRAM_ERROR); + //return; + } + if((debug_flags&0x40000000)==0) + break; + cnt += 1; + printk(" times: %d\n", cnt); + } + led_event(LEDEV_NONE); + } // 检查是否有bootrom. 如果有,就加载到FPGA中 diff --git a/Firm_MCU/Saturn/saturn_utils.c b/Firm_MCU/Saturn/saturn_utils.c index 39238ff..f80c9e4 100644 --- a/Firm_MCU/Saturn/saturn_utils.c +++ b/Firm_MCU/Saturn/saturn_utils.c @@ -137,6 +137,7 @@ typedef struct { CFGARG arg_list [] = { {"sector_delay", ARG_DEC, §or_delay}, {"play_delay", ARG_DEC, &play_delay}, + {"auto_update", ARG_DEC, &auto_update}, {"exmem_", ARG_NON, config_exmem}, {"M_", ARG_NON, config_wrmem}, {"lang_id", ARG_DEC, &lang_id}, diff --git a/Firm_MCU/inc/main.h b/Firm_MCU/inc/main.h index fbff61b..1024c9c 100644 --- a/Firm_MCU/inc/main.h +++ b/Firm_MCU/inc/main.h @@ -30,6 +30,8 @@ u32 get_build_date(void); void *malloc(uint32_t size); void free(void *p); void memcpy32(void *dst, void *src, int len); +int mem_test(u32 addr, int size); + void uart4_init(void); u8 _getc(void); @@ -66,6 +68,7 @@ int fpga_update(int check); #define MAKE_LEDEVENT(freq, times, flag) (((flag)<<16) | ((times)<<8) | (freq)) +#define LEDEV_NONE 0 #define LEDEV_SD_ERROR MAKE_LEDEVENT(10, 10, 2) #define LEDEV_FPGA_ERROR MAKE_LEDEVENT(10, 20, 2) #define LEDEV_SDRAM_ERROR MAKE_LEDEVENT(15, 8, 2) @@ -73,6 +76,8 @@ int fpga_update(int check); #define LEDEV_FILE_ERROR MAKE_LEDEVENT(15, 5, 1) #define LEDEV_SCFG_ERROR MAKE_LEDEVENT(15, 4, 1) #define LEDEV_CSCT MAKE_LEDEVENT(7, 1, 0) +#define LEDEV_BUSY MAKE_LEDEVENT(50, 1, 1) +#define LEDEV_OK MAKE_LEDEVENT(13, 2, 1) void led_event(int ev); diff --git a/Firm_MCU/ssmaster.uvoptx b/Firm_MCU/ssmaster.uvoptx index be6bc03..8ec0575 100644 --- a/Firm_MCU/ssmaster.uvoptx +++ b/Firm_MCU/ssmaster.uvoptx @@ -157,6 +157,11 @@ 1 + + d:\Keil_v5\ARM\PACK\ARM\CMSIS\5.7.0\CMSIS\RTOS2\RTX\RTX5.scvd + ARM.CMSIS.5.7.0 + 1 + 0 @@ -335,7 +340,7 @@ 0 2 - 8 + 9 2 0 0 @@ -347,7 +352,7 @@ 2 - 9 + 10 1 0 0 @@ -367,7 +372,7 @@ 0 3 - 10 + 11 5 0 0 @@ -379,7 +384,7 @@ 3 - 11 + 12 5 0 0 @@ -391,7 +396,7 @@ 3 - 12 + 13 5 0 0 @@ -403,7 +408,7 @@ 3 - 13 + 14 5 0 0 @@ -415,7 +420,7 @@ 3 - 14 + 15 5 0 0 @@ -427,7 +432,7 @@ 3 - 15 + 16 5 0 0 @@ -439,7 +444,7 @@ 3 - 16 + 17 5 0 0 @@ -451,7 +456,7 @@ 3 - 17 + 18 5 0 0 @@ -463,7 +468,7 @@ 3 - 18 + 19 5 0 0 @@ -475,7 +480,7 @@ 3 - 19 + 20 5 0 0 @@ -487,7 +492,7 @@ 3 - 20 + 21 5 0 0 @@ -499,7 +504,7 @@ 3 - 21 + 22 5 0 0 @@ -511,7 +516,7 @@ 3 - 22 + 23 5 0 0 @@ -523,7 +528,7 @@ 3 - 23 + 24 5 0 0 @@ -535,7 +540,7 @@ 3 - 24 + 25 5 0 0 @@ -547,7 +552,7 @@ 3 - 25 + 26 5 0 0 @@ -567,7 +572,7 @@ 0 4 - 26 + 27 1 0 0 @@ -579,7 +584,7 @@ 4 - 27 + 28 5 0 0 @@ -591,7 +596,7 @@ 4 - 28 + 29 1 0 0 @@ -603,7 +608,7 @@ 4 - 29 + 30 5 0 0 @@ -615,7 +620,7 @@ 4 - 30 + 31 1 0 0 @@ -627,7 +632,7 @@ 4 - 31 + 32 1 0 0 @@ -647,7 +652,7 @@ 0 5 - 32 + 33 1 0 0 @@ -659,7 +664,7 @@ 5 - 33 + 34 1 0 0 @@ -671,7 +676,7 @@ 5 - 34 + 35 1 0 0 @@ -683,7 +688,7 @@ 5 - 35 + 36 1 0 0 diff --git a/Firm_Saturn/Makefile b/Firm_Saturn/Makefile index 602fd26..b7fc263 100644 --- a/Firm_Saturn/Makefile +++ b/Firm_Saturn/Makefile @@ -22,6 +22,7 @@ OBJ = obj/crt0.o \ obj/sci_shell.o \ obj/ubr_debug.o \ obj/cdblock.o \ + obj/game_load.o \ obj/game_patch.o \ obj/game_save.o \ obj/language.o \ diff --git a/Firm_Saturn/cdblock.c b/Firm_Saturn/cdblock.c index a5423d5..2a9ebb8 100644 --- a/Firm_Saturn/cdblock.c +++ b/Firm_Saturn/cdblock.c @@ -5,65 +5,13 @@ /**********************************************************/ -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 - - void clear_hirq(int mask) { HIRQ = ~mask; } + int wait_hirq(int mask) { int i; @@ -77,25 +25,39 @@ int wait_hirq(int mask) return -3; } -int wait_peri(void) + +int wait_busy(void) { - CDCMD resp; - int status; + int i; - while(1){ - int i; - resp.cr1 = CR1; - resp.cr2 = CR2; - resp.cr3 = CR3; - resp.cr4 = CR4; - printk("STATUS=%04x\n", resp.cr1); - status = resp.cr1>>8; - if(status&STATUS_PERIODIC) - break; - for(i=0; i<100000; i++); + for(i=0; i<0x240000; i++){ + int cds = (CR1>>8)&0x0f; + if(cds) + return 0; } - return 0; + return -3; +} + + +void cdc_dump(int count) +{ + int hirq_old=-1, cr1_old=-1; + int hirq, cr1, cr2, cr3, cr4; + + while(count){ + hirq = HIRQ; + cr1 = CR1; + cr2 = CR2; + cr3 = CR3; + cr4 = CR4; + if( (hirq_old != hirq) || (cr1_old != cr1) ){ + printk("HIRQ: %04x CR1:%04x CR2:%04x CR3:%04x CR4:%04x\n", hirq, cr1, cr2, cr3, cr4); + hirq_old = hirq; + cr1_old = cr1; + } + count -= 1; + } } @@ -145,20 +107,6 @@ int cdc_cmd(int wait, CDCMD *cmd, CDCMD *resp, char *cmdname) /**********************************************************/ -u32 *toc_buf = (u32*)0x06090000; - -void show_toc(void) -{ - int i; - - for(i=0; i<102; i++){ - if(toc_buf[i]!=0xffffffff) - printk("TOC %3d: %08x\n", i+1, toc_buf[i]); - } -} - - - int cdc_get_status(int *status) { CDCMD cmd, resp; @@ -568,46 +516,30 @@ int cdc_auth_status(int *status) } - -void cdc_wait_auth(void) -{ - int i, status; - - while(1){ - for(i=0; i<100000; i++); - cdc_get_status(&status); - if(status!=0xff) - break; - printk("STATUS: %02x HIRQ: %04x\n", status, HIRQ); - } -} - int cdc_auth_device(void) { CDCMD cmd, resp; - int i, status; + int status; - printk("\n\nCD_AUTH ...\n"); + printk("\n\nCD_AUTH ... HIRQ=%04x\n", HIRQ); cmd.cr1 = 0xe000; cmd.cr2 = 0x0000; cmd.cr3 = 0x0000; cmd.cr4 = 0x0000; - cdc_cmd(HIRQ_EFLS, &cmd, &resp, "cdc_auth_device"); - + clear_hirq(HIRQ_EFLS); + cdc_cmd(0, &cmd, &resp, "cdc_auth_device"); while(1){ - for(i=0; i<100000; i++); - cdc_get_status(&status); - if(status!=0xff) + int retv = wait_hirq(HIRQ_EFLS); + if(retv==0) break; - //printk("STATUS: %02x HIRQ: %04x\n", status, HIRQ); } - int retv = cdc_auth_status(&status); + cdc_auth_status(&status); printk("AUTH: %02x\n\n", status); - return retv; + return status; } /**********************************************************/ @@ -701,26 +633,131 @@ int cdc_abort_file(void) return cdc_cmd(0, &cmd, &resp, "cdc_abort_file"); } -void cdc_init(void); -int wait_status(int wait) +/**********************************************************/ + + +void cdc_init(void) { - int status; + cdc_abort_file(); + cdc_cdb_init(0); + cdc_end_trans(NULL); + cdc_reset_selector(0xfc, 0); + + cdc_auth_device(); +} + + +int cdc_read_sector(int fad, int size, u8 *buf) +{ + int nsec, retv, status, num; + num = (size+3)&0xfffffffc; + + cdc_set_size(0); + cdc_reset_selector(0, 0); + cdc_cddev_connect(0); + + cdc_play_fad(0, fad, (size+0x7ff)>>11); + while(num>0){ + retv = cdc_get_numsector(0, &nsec); + if(retv<0) + return retv; + if(nsec==0) + continue; + + if(num>=2048) + nsec=2048; + else + nsec=num; + cdc_get_del_data(0, 0, 1); + cdc_trans_data(buf, nsec); + + cdc_end_trans(&status); + + buf += nsec; + num -= nsec; + } + + return size; +} + + +void cdblock_on(int wait) +{ + int cdstat; + int cr1, cr2, cr3, cr4; + + SS_CTRL = CS0_RAM4M; + smpc_cmd(CDON); + + if(wait){ + do{ + cr1 = CR1; + cr2 = CR2; + cr3 = CR3; + cr4 = CR4; + cdstat = (cr1>>8)&0x0f; + }while(cdstat==0); + } +} + + +void cdblock_off(void) +{ + smpc_cmd(CDOFF); + SS_CTRL = SAROO_EN | CS0_RAM4M; +} + + +int cdblock_check(void) +{ + int retv, cdstat; + + cdc_abort_file(); + cdc_cdb_init(0); + cdc_end_trans(NULL); + cdc_reset_selector(0xfc, 0); while(1){ - cdc_get_status(&status); - printk("STATUS: %02x HIRQ=%04x\n", status, HIRQ); - if(status&0x80){ + cdc_get_status(&cdstat); + cdstat &= 0x0f; + // cdc_reset_selector会有比较长的BUSY状态。 + if(cdstat==STATUS_BUSY) + continue; + if(cdstat==STATUS_OPEN || cdstat==STATUS_NODISC){ return -1; } - status &= 0x0f; - if(status==wait) - return 0; + if(cdstat==STATUS_PAUSE) + break; } - return -1; + // 0: no Disc + // 1: Audio Disc + // 2: Data Disc + // 3: Pirated Saturn Disc + // 4: Saturn Disc + retv = cdc_auth_device(); + + return retv; } + +/**********************************************************/ + + +u32 *toc_buf = (u32*)0x06090000; + +void show_toc(void) +{ + int i; + + for(i=0; i<102; i++){ + if(toc_buf[i]!=0xffffffff) + printk("TOC %3d: %08x\n", i+1, toc_buf[i]); + } +} + + void cdc_file_test(void) { int i; @@ -773,325 +810,12 @@ void cdc_file_test(void) cdc_get_numsector(1, &free); printk("cdc_get_numsector 1: %d HIRQ=%04x\n", free, HIRQ); cdc_get_buffer_size(&total, &npart, &free); - - - -} - -/**********************************************************/ - - - -#define INDIRECT_CALL(addr, return_type, ...) (**(return_type(**)(__VA_ARGS__)) addr) - -#define bios_run_cd_player INDIRECT_CALL(0x0600026C, void, void) - -//!< mode 0 -> check, 1 -> do auth -#define bios_check_cd_auth INDIRECT_CALL(0x06000270, int, int mode) - -#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 - - -void bup_init(u8 *lib_addr, u8 *work_addr, void *cfg); - -void _call_04c8(void) -{ - void (*go)(void) = (void*)(0x04c8); - go(); - *(u32*)(0x25fe00b0) = 0x38803880; -} - -void my_cdplayer(void) -{ - void (*go)(int); - - if(debug_flag&1) sci_init(); - printk("\nLoad my multiPlayer ...\n"); - - go = (void*)0x1d7c; - go(0); - - *(u32*)(0x06000348) = 0xffffffff; - - memcpy((u8*)0x00280000, _call_04c8, 64); - go = (void*)0x00280000; - go(0); - - if(debug_flag&1) sci_init(); - *(u32*)(0xffffffb0) = 0; - *(u8 *)(0x2010001f) = 0x1a; - - memset((u8*)0x0600a000, 0, 0xf6000); - memset((u8*)0x06000c00, 0, 0x09400); - memset((u8*)0x06000b00, 0, 0x00100); - memcpy((u8*)0x06000000, (u8*)0x20000600, 0x0210); - memcpy((u8*)0x06000220, (u8*)0x20000820, 0x08e0); - memcpy((u8*)0x06001100, (u8*)0x20001100, 0x0700); - memcpy((u8*)0x060002c0, (u8*)0x20001100, 0x0020); - - *(u32*)(0x06000358) = (u32)bup_init; - - *(u32*)(0x06000234) = 0x02ac; - *(u32*)(0x06000238) = 0x02bc; - *(u32*)(0x0600023c) = 0x0350; - *(u32*)(0x06000328) = 0x04c8; - *(u32*)(0x0600024c) = 0x4843444d; - - go = (void*)0x06000680; - go(0); -} - - -int my_bios_loadcd_init(void) -{ - printk("\nmy_bios_loadcd_init!\n"); - - *(u32*)(0x06000278) = 0; - *(u32*)(0x0600027c) = 0; - - cdc_abort_file(); - cdc_end_trans(NULL); - cdc_reset_selector(0xfc, 0); - cdc_set_size(0); - - // This is needed for Yabause: Clear the diskChange flag. - int status; - cdc_get_hwinfo(&status); - - cdc_auth_device(); - - return 0; -} - - -int my_bios_loadcd_read(void) -{ - int status, tm; - u8 *sbuf = (u8*)0x06002000; - char ipstr[64]; - - printk("\nmy_bios_loadcd_read!\n"); - - cdc_reset_selector(0, 0); - cdc_cddev_connect(0); - cdc_play_fad(0, 150, 16); - - HIRQ = 0; - tm = 10000000; - while(tm){ - if(HIRQ&HIRQ_PEND) - break; - tm -= 1; - } - if(tm==0){ - printk(" PLAY timeout!\n"); - return -1; - } - - cdc_get_data(0, 0, 16); - cdc_trans_data(sbuf, 2048*16); - cdc_end_trans(&status); - - *(u16*)(0x060003a0) = 1; - - memcpy(ipstr, (u8*)0x06002020, 16); - ipstr[16] = 0; - printk("\nLoad game: %s\n", ipstr); - memcpy(ipstr, (u8*)0x06002060, 32); - ipstr[32] = 0; - printk(" %s\n\n", ipstr); - - return 0; -} - - -static u16 code_06b8[10] = { - 0xd102, // mov.l #0x25fe00b0, r1 - 0xd203, // mov.l #0x38803880, r2 - 0x2122, // mov.l r2, @r1 - 0xd103, // mov.l next_call, r1 - 0x412b, // jmp @r1 - 0x4f26, // lds.l @r15+, pr - 0x25fe,0x00b0, - 0x3880,0x3880, - // 060006cc: .long next_call -}; - - -static void my_06b0(void) -{ - if(debug_flag&1) sci_init(); - printk("\nbios_set_clock_speed(%d)!\n", *(u32*)(0x06000324)); - - void (*go)(void) = (void*)0x1800; - go(); - - *(u32*)(0x25fe00b0) = 0x38803880; - - SF = 1; - COMREG = 0x19; - while(SF&1); -} - - -extern int to_stm32; -extern int gets_from_stm32; - -void bup_init(u8 *lib_addr, u8 *work_addr, void *cfg); - -void read_1st(void) -{ - printk("Read main ...\n"); - int retv; - retv = *(u32*)(0x06000284); - void (*go)(void) = (void(*)(void))retv; - go(); - - patch_game((char*)0x06002020); - *(u32*)(0x06000358) = (u32)bup_init; - *(u32*)(0x0600026c) = (u32)my_cdplayer; - - // 0x06000320: 0x060006b0 bios_set_clock_speed - memcpy((u8*)0x060006b8, code_06b8, sizeof(code_06b8)); - *(u32*)(0x060006cc) = (u32)my_06b0; - - - if(game_break_pc){ - set_break_pc(game_break_pc, 0); - install_ubr_isr(); -// install_isr(ISR_NMI); -// void reloc_vbr(void); -// reloc_vbr(); - to_stm32 = 1; - gets_from_stm32 = 1; - *(u32*)(0x22820000) = 0; - } -} - - -int my_bios_loadcd_boot(int r4, int r5) -{ - __asm volatile ( "sts.l pr, @-r15" :: ); - __asm volatile ( "jmp @%0":: "r" (r5) ); - __asm volatile ( "mov r4, r0" :: ); - __asm volatile ( "nop" :: ); - return 0; -} - - -int bios_cd_cmd(void) -{ - int retv, ip_size; - - my_bios_loadcd_init(); - - retv = my_bios_loadcd_read(); - if(retv) - return retv; - - - // emulate bios_loadcd_boot - *(u32*)(0x06000290) = 3; - ip_size = bios_loadcd_read();//1912ȡipļ - *(u32*)(0x06002270) = (u32)read_1st; - *(u32*)(0x02000f04) = (u32)cdc_read_sector; - *(u16*)(0x0600220c) = 9; - - retv = my_bios_loadcd_boot(ip_size, 0x18be);//18be - if((retv==-8)||(retv==-4)){ - *(u32*)(0x06000254) = 0x6002100; - retv = my_bios_loadcd_boot(0, 0x18c6); - } - printk("bios_loadcd_boot retv=%d\n", retv); - - return retv; } /**********************************************************/ - - -#define CDROM_syscdinit1(i) \ - ((**(void(**)(int))0x60002dc)(i)) -#define CDROM_syscdinit2() \ - ((**(void(**)(void))0x600029c)()) - -void cdc_read_test(void); - -void cdc_init1(void) -{ - cdc_abort_file(); - cdc_cdb_init(0); - cdc_end_trans(NULL); - cdc_reset_selector(0xfc, 0); -} - -void cdc_init(void) -{ - cdc_abort_file(); - cdc_cdb_init(0); - cdc_end_trans(NULL); - cdc_reset_selector(0xfc, 0); - - cdc_auth_device(); - -#if 0 - CDROM_syscdinit1(3); - CDROM_syscdinit2(); - - int status; - while(1){ - cdc_get_status(&status); - if(status!=0xff) - break; - } - printk("cdc_init done!\n"); - cdc_read_test(); -#endif -} - - -int cdc_read_sector(int fad, int size, u8 *buf) -{ - int nsec, retv, status, num; - num = (size+3)&0xfffffffc; - - cdc_set_size(0); - cdc_reset_selector(0, 0); - cdc_cddev_connect(0); - - cdc_play_fad(0, fad, (size+0x7ff)>>11); - while(num>0){ - retv = cdc_get_numsector(0, &nsec); - if(retv<0) - return retv; - if(nsec==0) - continue; - - if(num>=2048) - nsec=2048; - else - nsec=num; - cdc_get_del_data(0, 0, 1); - cdc_trans_data(buf, nsec); - - cdc_end_trans(&status); - - buf += nsec; - num -= nsec; - } - - return size; -} - void cdc_read_test(void) { int status; diff --git a/Firm_Saturn/conio.c b/Firm_Saturn/conio.c index 64095f5..6e8db54 100644 --- a/Firm_Saturn/conio.c +++ b/Firm_Saturn/conio.c @@ -1,4 +1,4 @@ -/* +/* * Sega Saturn cartridge flash tool * by Anders Montonen, 2012 * @@ -272,6 +272,10 @@ void conio_putc(int ch) /******************************************************************************/ +int abs(int v) +{ + return (v<0)? -v : v; +} void put_pixel(int x, int y, int c) { diff --git a/Firm_Saturn/game_load.c b/Firm_Saturn/game_load.c index 263cca1..df72b69 100644 --- a/Firm_Saturn/game_load.c +++ b/Firm_Saturn/game_load.c @@ -1,197 +1,249 @@ -/* - * Sega Saturn cartridge flash tool - * by Anders Montonen, 2012 - * - * Original software by ExCyber - * Graphics routines by Charles MacDonald - * - * Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) - */ - -#include "vdp2.h" + +#include "main.h" #include "smpc.h" -#include "vdp.h" -#include "conio.h" +/**********************************************************/ + + +// 调用04c8的代码必须在内部RAM中运行。 +static void _call_04c8(void) +{ + void (*go)(void) = (void*)(0x04c8); + go(); + *(u32*)(0x25fe00b0) = 0x38803880; +} + +void my_cdplayer(void) +{ + void (*go)(int); -#define bios_loadcd_init INDIRECT_CALL(0x0600029c, int, int) + if(debug_flag&1) sci_init(); + printk("\nLoad my multiPlayer ...\n"); -#define bios_loadcd_read INDIRECT_CALL(0x060002cc, int, void) + go = (void*)0x1d7c; + go(0); -#define bios_loadcd_boot INDIRECT_CALL(0x06000288, int, int) + *(u32*)(0x06000348) = 0xffffffff; + memcpy((u8*)0x00280000, _call_04c8, 64); + go = (void*)0x00280000; + go(0); + if(debug_flag&1) sci_init(); + *(u32*)(0xffffffb0) = 0; + *(u8 *)(0x2010001f) = 0x1a; + memset((u8*)0x0600a000, 0, 0xf6000); + memset((u8*)0x06000c00, 0, 0x09400); + memset((u8*)0x06000b00, 0, 0x00100); + memcpy((u8*)0x06000000, (u8*)0x20000600, 0x0210); + memcpy((u8*)0x06000220, (u8*)0x20000820, 0x08e0); + memcpy((u8*)0x06001100, (u8*)0x20001100, 0x0700); + memcpy((u8*)0x060002c0, (u8*)0x20001100, 0x0020); -#if 0 + *(u32*)(0x06000358) = (u32)bup_init; -u32 set_sp(u32 addr) -{ - asm(" - mov r15, r0 - mov r4, r15 - "); + *(u32*)(0x06000234) = 0x02ac; + *(u32*)(0x06000238) = 0x02bc; + *(u32*)(0x0600023c) = 0x0350; + *(u32*)(0x06000328) = 0x04c8; + *(u32*)(0x0600024c) = 0x4843444d; + + go = (void*)0x06000680; + go(0); } -int load_game(void) + +int my_bios_loadcd_init(void) { - int retv, save_sp; + printk("\nmy_bios_loadcd_init!\n"); + + *(u32*)(0x06000278) = 0; + *(u32*)(0x0600027c) = 0; - cdc_cdb_init(0); - cdc_change_dir(23, 0xffffff); cdc_abort_file(); + cdc_end_trans(NULL); + cdc_reset_selector(0xfc, 0); + cdc_set_size(0); + + // This is needed for Yabause: Clear the diskChange flag. + int status; + cdc_get_hwinfo(&status); + + return 0; +} - retv = bios_loadcd_init(0); - printk("bios_loadcd_init: %d\n", retv); - save_sp = set_sp(0x06002000); +int my_bios_loadcd_read(void) +{ + int status, tm; + u8 *sbuf = (u8*)0x06002000; + char ipstr[64]; - while(1){ - retv = bios_loadcd_boot(0); - printk("bios_loadcd_boot: %d\n", retv); - if(retv<0) + printk("\nmy_bios_loadcd_read!\n"); + + cdc_reset_selector(0, 0); + cdc_cddev_connect(0); + cdc_play_fad(0, 150, 16); + + HIRQ = 0; + tm = 10000000; + while(tm){ + if(HIRQ&HIRQ_PEND) break; + tm -= 1; + } + if(tm==0){ + printk(" PLAY timeout!\n"); + return -1; } - set_sp(save_sp); - return retv; -} + cdc_get_data(0, 0, 16); + cdc_trans_data(sbuf, 2048*16); + cdc_end_trans(&status); -#else + *(u16*)(0x060003a0) = 1; -static inline void set_sr2( unsigned int sr ){ - asm volatile ( "ldc\t%0,sr":: "r" (sr) ); + memcpy(ipstr, (u8*)0x06002020, 16); + ipstr[16] = 0; + printk("\nLoad game: %s\n", ipstr); + memcpy(ipstr, (u8*)0x06002060, 32); + ipstr[32] = 0; + printk(" %s\n\n", ipstr); + + return 0; } -static inline unsigned int get_sr( void ){ - unsigned int sr; - asm volatile ( "stc\tsr,%0": "=r" (sr) ); - return sr; -} +static u16 code_06b8[10] = { + 0xd102, // mov.l #0x25fe00b0, r1 + 0xd203, // mov.l #0x38803880, r2 + 0x2122, // mov.l r2, @r1 + 0xd103, // mov.l next_call, r1 + 0x412b, // jmp @r1 + 0x4f26, // lds.l @r15+, pr + 0x25fe,0x00b0, + 0x3880,0x3880, + // 060006cc: .long next_call +}; -static inline void set_imask( unsigned int imask ){ - unsigned int sr = get_sr(); - sr &= ~0x000000f0; - sr |= ( imask << 4 ); - set_sr( sr ); -} +static void my_06b0(void) +{ + if(debug_flag&1) sci_init(); + printk("\nbios_set_clock_speed(%d)!\n", *(u32*)(0x06000324)); -static inline void set_vbr2( void *vbr ){ - asm volatile ( "ldc\t%0,vbr":: "r" (vbr) ); -} + void (*go)(void) = (void*)0x1800; + go(); + + *(u32*)(0x25fe00b0) = 0x38803880; -static inline void set_gbr2( void *gbr ){ - asm volatile ( "ldc\t%0,gbr":: "r" (gbr) ); + SF = 1; + COMREG = 0x19; + while(SF&1); } -int load_game(void) +static void read_1st(void) { + printk("Read main ...\n"); int retv; - u8 *ip_addr = (u8*)0x06002000; - u32 main_addr; - u32 main_size; - - retv = cdc_read_sector(ip_addr, 150, 16); - if(retv<0){ - printk("load_game: read ip.bin failed!\n"); - return retv; + retv = *(u32*)(0x06000284); + void (*go)(void) = (void(*)(void))retv; + go(); + + patch_game((char*)0x06002020); + *(u32*)(0x06000358) = (u32)bup_init; + *(u32*)(0x0600026c) = (u32)my_cdplayer; + + // 0x06000320: 0x060006b0 bios_set_clock_speed + memcpy((u8*)0x060006b8, code_06b8, sizeof(code_06b8)); + *(u32*)(0x060006cc) = (u32)my_06b0; + + + if(game_break_pc){ + set_break_pc(game_break_pc, 0); + install_ubr_isr(); +// install_isr(ISR_NMI); +// void reloc_vbr(void); +// reloc_vbr(); + to_stm32 = 1; + gets_from_stm32 = 1; + *(u32*)(0x22820000) = 0; } +} - retv = cdc_read_sector((u8*)0x0600a000, 150+20, 1); - if(retv<0){ - printk("load_game: read root dir failed!\n"); - return retv; - } - memcpy((u8*)0x06000c00, (u8*)0x06002000, 0x0100); - memcpy((u8*)0x060002a0, (u8*)0x060020e0, 0x0020); +static int my_bios_loadcd_boot(int r4, int r5) +{ + __asm volatile ( "sts.l pr, @-r15" :: ); + __asm volatile ( "jmp @%0":: "r" (r5) ); + __asm volatile ( "mov r4, r0" :: ); + __asm volatile ( "nop" :: ); + return 0; +} - *(u32*)(0x060002b0) = 0x06010000; - *(u32*)(0x06000290) = 3; - - *(u32*)(0x06002270) = 0x06000284; - *(u32*)(0x06000278) = 0; - *(u32*)(0x0600027c) = 0; +int bios_cd_cmd(int type) +{ + int retv, ip_size; - main_addr = *(u32*)(0x060020f0); - main_size = *(u32*)(0x0600a052); - main_offs = *(u32*)(0x0600a04a); - printk("main_offset=%08x main_size=%08x main_addr=%08x\n", main_offs, main_size, main_addr); + my_bios_loadcd_init(); - // Setup the vector table area, etc.(all bioses have it at 0x00000600-0x00000810) - for(i=0; i<0x210; i+=4){ - *(u32*)(0x06000000+i) = *(u32*)(0x00000600+i); - } +#if 1 + my_bios_loadcd_boot(0, 0x1904); - // Setup the bios function pointers, etc.(all bioses have it at 0x00000820-0x00001100) - for(i=0; i<0x8e0; i+=4){ - *(u32*)(0x06000220+i) = *(u32*)(0x00000820+i); + while(1){ + ip_size = bios_loadcd_read(); + if(ip_size==0x8000) + break; } - // I'm not sure this is really needed - for(i=0; i<0x700; i+=4){ - *(u32*)(0x06001100+i) = *(u32*)(0x00001100+i); - } + char ipstr[64]; - // Fix some spots in 0x06000210-0x0600032C area - *(u32*)0x06000234 = 0x000002ac; - *(u32*)0x06000238 = 0x000002bc; - *(u32*)0x0600023c = 0x00000350; - *(u32*)0x06000240 = 0x32524459; - *(u32*)0x0600024c = 0x00000000; - *(u32*)0x06000268 = *(u32*)0x00001344; - *(u32*)0x0600026c = *(u32*)0x00001348; - *(u32*)0x0600029c = *(u32*)0x00001354; - *(u32*)0x060002c4 = *(u32*)0x00001104; - *(u32*)0x060002c8 = *(u32*)0x00001108; - *(u32*)0x060002cc = *(u32*)0x0000110c; - *(u32*)0x060002d0 = *(u32*)0x00001110; - *(u32*)0x060002d4 = *(u32*)0x00001114; - *(u32*)0x060002d8 = *(u32*)0x00001118; - *(u32*)0x060002dc = *(u32*)0x0000111c; - *(u32*)0x06000328 = 0x000004c8; - *(u32*)0x0600032c = 0x00001800; - - // Fix SCU interrupts - for(i=0; i<0x80; i+=4){ - *(u32*)(0x06000a00+i) = 0x0600083c; - } + memcpy(ipstr, (u8*)0x06002020, 16); + ipstr[16] = 0; + printk("\nLoad game: %s\n", ipstr); + memcpy(ipstr, (u8*)0x06002060, 32); + ipstr[32] = 0; + printk(" %s\n\n", ipstr); - set_sr2(0); - set_vbr2(0x06000000); +#else + retv = my_bios_loadcd_read(); + if(retv) + return retv; - __asm__ volatile ("mov #0, r0"); - __asm__ volatile ("mov #0, r1"); - __asm__ volatile ("mov #0, r2"); - __asm__ volatile ("mov #0, r3"); - __asm__ volatile ("mov #0, r4"); - __asm__ volatile ("mov #0, r5"); - __asm__ volatile ("mov #0, r6"); - __asm__ volatile ("mov #0, r7"); - __asm__ volatile ("mov #0, r8"); - __asm__ volatile ("mov #0, r9"); - __asm__ volatile ("mov #0, r10"); - __asm__ volatile ("mov #0, r11"); - __asm__ volatile ("mov #0, r12"); - __asm__ volatile ("mov #0, r13"); - __asm__ volatile ("mov #0, r14"); - __asm__ volatile ("lds r14, pr"); + // emulate bios_loadcd_boot + *(u32*)(0x06000290) = 3; + ip_size = bios_loadcd_read();//1912读取ip文件 +#endif - __asm__ volatile ("ldc r14, gbr"); - __asm__ volatile ("lds r14, mach"); - __asm__ volatile ("lds r14, macl"); + if(type>0){ + // 光盘游戏。需要通知MCU加载SAVE。 + memcpy((void*)(TMPBUFF_ADDR+0x10), (u8*)0x06002020, 16); + *(u8*)(TMPBUFF_ADDR+0x20) = 0; + SS_ARG = 0; + SS_CMD = SSCMD_LSAVE; + while(SS_CMD); + } - setStackptr(0x6002000, 0x6002e00); + *(u32*)(0x06002270) = (u32)read_1st; + *(u32*)(0x02000f04) = (u32)cdc_read_sector; + *(u16*)(0x0600220c) = 9; - return 0; + retv = my_bios_loadcd_boot(ip_size, 0x18be);//跳到18be + if((retv==-8)||(retv==-4)){ + *(u32*)(0x06000254) = 0x6002100; + retv = my_bios_loadcd_boot(0, 0x18c6); + } + printk("bios_loadcd_boot retv=%d\n", retv); + + return retv; } -#endif + +/**********************************************************/ diff --git a/Firm_Saturn/game_save.c b/Firm_Saturn/game_save.c index 6e92e55..3705125 100644 --- a/Firm_Saturn/game_save.c +++ b/Firm_Saturn/game_save.c @@ -545,8 +545,10 @@ u32 bup_set_date(BUPDATE *bdt) /******************************************************************************/ -void bup_init(u8 *lib_addr, u8 *work_addr, BUPCFG *cfg) +void bup_init(u8 *lib_addr, u8 *work_addr, void *cfg_ptr) { + BUPCFG *cfg = (BUPCFG*)cfg_ptr; + if(debug_flag&1) sci_init(); diff --git a/Firm_Saturn/language.c b/Firm_Saturn/language.c index 97b5120..a27a1b6 100644 --- a/Firm_Saturn/language.c +++ b/Firm_Saturn/language.c @@ -6,7 +6,7 @@ int lang_id = 0; -#define LANG_STR_NR 16 +#define LANG_STR_NR 19 #define LANG_NR 8 typedef struct _str_entry @@ -41,6 +41,9 @@ char *lang_zhcn[LANG_STR_NR] = { "升级失败!", "升级完成,请重新开机!", "SAROO Boot Menu", + "检查光盘中......", + "未发现光盘!", + "不是游戏光盘!", }; @@ -61,6 +64,9 @@ char *lang_en[LANG_STR_NR] = { "Update Failed!", "Update Finish! Please PowerOn again!", "SAROO Boot Menu", + "Checking Disc ......", + "No Disc Found!", + "Not a Game Disc!", }; @@ -81,6 +87,9 @@ char *lang_ptbr[LANG_STR_NR] = { "Erro ao atualizar!", "Finalizado, reinicie o sistema!", "SAROO Menu de Inicialização", + "Verificando o disco ......", + "Sem CD!", + "Não é um disco de jogo!", }; @@ -101,6 +110,9 @@ char *lang_ja[LANG_STR_NR] = { "アップデート失敗!", "アップデート完了、再起動してください!", "SAROO ブートメニュー", + "ディスクを確認してください...", + "ディスクなし!", + "ゲームディスクじゃないよ!", }; diff --git a/Firm_Saturn/main.c b/Firm_Saturn/main.c index 3ff84ee..bb33128 100644 --- a/Firm_Saturn/main.c +++ b/Firm_Saturn/main.c @@ -463,7 +463,7 @@ static int sel_handle(int ctrl) SS_CMD = SSCMD_LOADDISC; while(SS_CMD); - retv = bios_cd_cmd(); + retv = bios_cd_cmd(0); if(retv){ char buf[40]; sprintf(buf, TT("游戏启动失败! %d"), retv); @@ -556,18 +556,23 @@ int main_handle(int ctrl) select_game(); return MENU_RESTART; }else if(index==1){ - // SAROOO Off, CDBlock On - SS_CTRL = CS0_RAM4M; - smpc_cmd(CDON); + cdblock_on(0); bios_run_cd_player(); return MENU_RESTART; }else if(index==2){ - // SAROOO Off, CDBlock On - SS_CTRL = CS0_RAM4M; - smpc_cmd(CDON); + menu_status(&main_menu, TT("检查光盘中......")); + cdblock_on(1); + int retv = cdblock_check(); + if(retv<0){ + menu_status(&main_menu, TT("未发现光盘!")); + return 0; + }else if(retv!=4){ + menu_status(&main_menu, TT("不是游戏光盘!")); + return 0; + } menu_status(&main_menu, TT("游戏启动中......")); - int retv = bios_cd_cmd(); + retv = bios_cd_cmd(4); if(retv){ char buf[40]; sprintf(buf, TT("游戏启动失败! %d"), retv); @@ -670,11 +675,7 @@ int _main(void) printk_putc = NULL; } - - // CDBlock Off, SAROOO On - smpc_cmd(CDOFF); - SS_CTRL = (SAROO_EN | CS0_RAM4M); - + cdblock_off(); if((debug_flag&0x0003)==0x0003){ sci_shell(); diff --git a/Firm_Saturn/main.h b/Firm_Saturn/main.h index d521524..e1146a9 100644 --- a/Firm_Saturn/main.h +++ b/Firm_Saturn/main.h @@ -44,6 +44,7 @@ typedef unsigned long long u64; #define SSCMD_FILEWR 0x0007 #define SSCMD_LISTBINS 0x0008 #define SSCMD_SSAVE 0x0009 +#define SSCMD_LSAVE 0x000a #define IMGINFO_ADDR 0x22080000 @@ -52,15 +53,139 @@ typedef unsigned long long u64; /*****************************************************************************/ +// 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 bios_cd_cmd(void); +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); + + /*****************************************************************************/ @@ -125,6 +250,8 @@ int sci_getc(int timeout); /*****************************************************************************/ extern int to_stm32; +extern int gets_from_stm32; + extern void (*printk_putc)(int ch); int printk(char *fmt, ...); @@ -144,6 +271,7 @@ 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); /*****************************************************************************/ diff --git a/Firm_Saturn/sci_shell.c b/Firm_Saturn/sci_shell.c index a4c4f88..2936603 100644 --- a/Firm_Saturn/sci_shell.c +++ b/Firm_Saturn/sci_shell.c @@ -272,10 +272,24 @@ void sci_shell(void) CMD(d) { dump(argc, arg, 0); } CMD(go){ void (*go)(void) = (void(*)(void))arg[0]; go(); } - CMD(t) { cd_cmd(); } - CMD(f) { cdc_file_test(); } + CMD(t) { + void cd_cmd(void); + cd_cmd(); + } + CMD(f) { + void cdc_file_test(void); + cdc_file_test(); + } CMD(m) { bios_run_cd_player(); } /* 运行系统CD播放器 */ - CMD(n) { bios_cd_cmd(); } /* 启动游戏 */ + CMD(n) { bios_cd_cmd(0); } /* 启动游戏 */ + CMD(cds) { + void cdc_dump(int count); + int count = 1; + if(argc>0) + count = arg[0]; + cdc_dump(count); + } + CMD(menu) { menu_init(); } CMD(nmi) { @@ -345,20 +359,13 @@ void sci_shell(void) CMD(c) { /* 打开系统光驱 */ - smpc_cmd(CDOFF); - printk("CDOFF ...\n"); - printk("CDOFF ...\n"); - smpc_cmd(CDON); - printk("CDON ...\n"); - printk("CDON ...\n"); - REG16(0x25897004) = 0x0000; + cdblock_on(1); + int retv = cdblock_check(); + printk("cdblock_check: %d\n", retv); } CMD(s) { /* 关闭系统光驱, 打开sarooo */ - smpc_cmd(CDOFF); - printk("CDOFF ...\n"); - printk("CDOFF ...\n"); - REG16(0x25897004) = 0x8000; + cdblock_off(); } CMD(listb){ @@ -378,7 +385,7 @@ void sci_shell(void) /* 下载到ram并运行. 如果指定了地址, 则只下载. */ int xm_len, xm_addr; xm_addr = (argc>0)? arg[0] : 0x06004000; - xm_len = tiny_xmodem_recv(xm_addr); + xm_len = tiny_xmodem_recv((u8*)xm_addr); printk(" \n"); printk(" \n"); printk("Download to %08x, size %08x\n", xm_addr, xm_len); diff --git a/Firm_Saturn/tiny_xm.c b/Firm_Saturn/tiny_xm.c index 19c6e27..66de08a 100644 --- a/Firm_Saturn/tiny_xm.c +++ b/Firm_Saturn/tiny_xm.c @@ -17,7 +17,7 @@ #define DLY_1S 1000 -int tiny_xmodem_recv(unsigned char *dest) +int tiny_xmodem_recv(u8 *dest) { int pk_size, pk_num, pk_chk, check_sum, pk_sum, next_pk; int i, c, len; diff --git a/Firm_Saturn/ubr_debug.c b/Firm_Saturn/ubr_debug.c index f18a22e..e106102 100644 --- a/Firm_Saturn/ubr_debug.c +++ b/Firm_Saturn/ubr_debug.c @@ -16,27 +16,27 @@ void (*game_break_handle)(REGS *reg); /**********************************************************/ -static inline u32 get_vbr(void) +inline u32 get_vbr(void) { u32 vbr; __asm volatile ( "stc\tvbr,%0": "=r" (vbr) ); return vbr; } -static inline void set_vbr(u32 vbr) +inline void set_vbr(u32 vbr) { __asm volatile ( "ldc\t%0,vbr":: "r" (vbr) ); } -static inline u32 get_sr(void) +inline u32 get_sr(void) { u32 sr; __asm volatile ( "stc\tsr,%0": "=r" (sr) ); return sr; } -static inline void set_sr(u32 sr) +inline void set_sr(u32 sr) { __asm volatile ( "ldc\t%0,sr":: "r" (sr) ); } @@ -118,7 +118,7 @@ void reloc_vbr(void) { u32 old_vbr = get_vbr(); memcpy((void*)new_vtable, (void*)old_vbr, 1024); - set_vbr(new_vtable); + set_vbr((u32)new_vtable); printk("New VBR at %08x\n", new_vtable); } diff --git "a/doc/SAROO\346\212\200\346\234\257\347\202\271\346\273\264.txt" "b/doc/SAROO\346\212\200\346\234\257\347\202\271\346\273\264.txt" index 1745eba..068b8f4 100644 --- "a/doc/SAROO\346\212\200\346\234\257\347\202\271\346\273\264.txt" +++ "b/doc/SAROO\346\212\200\346\234\257\347\202\271\346\273\264.txt" @@ -433,6 +433,77 @@ play_cd: start=0080874a end=00800001 mode=00 ========================================================================= +Saturnʱ: + ++------+---------+------+-----------+-----------+ +| | XTAL | DIV | 1708(320) | 1820(352) | ++------+---------+------+-----------+-----------+ +| PAL | 14.318 | 910 | 26.873875 | 28.636000 | ++------+---------+------+-----------+-----------+ +| NTSC | 17.7344 | 1135 | 26.687538 | 28.437540 | ++------+---------+------+-----------+-----------+ + +========================================================================= + +Saturn浵ʽ(BackUPram) + +BUPλ0x00180000С64KΪ˴ַռ16λģõSRAMоƬ8λģż +ַ(ΪFF)ַЧݡBUPʵʴС32K + +BUPе64ֽΪһ֯һ512顣ǰϵͳ0DZ־ +"BackUpRam Format"ظ4Ρ1ȫ0 + +Ŀ飬ͷ4ֽDZ־0x80000000ʾһsaveĿʼ0x00000000ʾͨ顣Ŀ +Ҫÿsaveжϡ + +saveʼṹ: + 00: 80000000 + 04: 浵11ֽڡ + 0f: Ա־ + 10: 浵עͣ10ֽڡ + 1a: 浵ڱ룬4ֽڡ + 1e: 浵ֽڴС4ֽڡ + 22: 浵ռб0000ʼһ顣Ҫǰ4ֽڡ + ע⣬20ָʾĴ浵СԷڿʼ֮ڣҪռÿбˡ + + бʵʴ浵ˡбʼ顣 + + +========================================================================= + +Զ浵ʽ(SaroSave) + +ǰ64ֽļͷ64ֽǿռλͼ +32KĴ浵С64ֽڣ512飬64ֽڵλͼʾ +浵СӱСҲӱλͼС䡣 + +浵ʼռһ顣浵ռõĿҲ64ֽλͼλͼʼλͼ顣 +32K浵λͼռÿʼĿ顣Ǵ32KĴ浵λͼλڿʼڲ + + +ļͷ + 00: "SaroSave" + 08: 浵ֽڴС + 0c: С + 0e: п + 20: ϷID + 3eһsaveĿ + + +saveʼṹ: + 00: 浵11ֽڡ + 0c: 浵ֽڴС4ֽڡ + 10: 浵עͣ10ֽڡ + 1a: 00 + 1b: Ա־ + 1c: 浵ڱ룬4ֽڡ + 3e: һsaveĿš + + +========================================================================= + + + diff --git a/doc/saroocfg.txt b/doc/saroocfg.txt index 7bd7d74..6cdc75c 100644 --- a/doc/saroocfg.txt +++ b/doc/saroocfg.txt @@ -1,5 +1,13 @@ # SAROO config file # 可用配置: +# lang_id=x +# 选择菜单语言: 0:中文 1:EN 2:PTBR 3:JA +# debug=xxxxxxxx +# 各种调试选项 +# auto_update: +# MCU自动升级固件 +# play_delay=xxxx +# PLAY开始前的延时。十进制us单位。 # sector_delay=xxxx # 每读一个扇区后的延时。十进制us单位。 # exmem_1M @@ -15,7 +23,7 @@ # [global] - +lang_id = 0 # Final Fight Revenge