Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <kos.h>
- //#include <dream.h>
- #include "ds.h"
- #include "/usr/local/dc/kos/kos/kernel/arch/dreamcast/fs/dcload-syscalls.h"
- int memzero(unsigned char *buf,int size)
- {
- int i;
- for(i=0;i<size;i++)
- if (buf[i]) return 1;
- return 0;
- }
- #define N 1
- #if 1
- #define open2 open
- #define close2 close
- #define write2 write
- #else
- static int compress_fd = -1;
- static int zero_count;
- int open2(char *file,int flags)
- {
- int fd = open(file,flags);
- if (flags&0x80000000) {
- compress_fd = fd;
- zero_count = 0;
- }
- return fd;
- }
- int write2(int fd,unsigned char *buf,long size)
- {
- int i,ret;
- if (fd!=compress_fd) return write(fd,buf,size);
- if (memzero(buf,i)==0) {
- zero_count+=size;
- } else {
- int count = 0x80000000 + size;
- char save[4];
- if (zero_count) {
- ret = write(fd,&zero_count,4);
- zero_count = 0;
- }
- buf-=4;
- memcpy(save,buf,4);
- buf[0]=count;
- buf[1]=count>>8;
- buf[2]=count>>16;
- buf[3]=count>>24;
- ret = write(fd,buf,size+4);
- memcpy(buf,save,4);
- }
- if (ret!=-1) ret = size;
- return ret;
- }
- int close2(int fd)
- {
- if (fd==compress_fd) {
- compress_fd = -1;
- if (zero_count) {
- write(fd,&zero_count,4);
- zero_count = 0;
- }
- }
- return close(fd);
- }
- #endif
- void track_save(int no,int first,int size,int type)
- {
- int i,fd;
- char file[40];
- char secbuf[2352*N];
- const static char data_hdr[12] = {
- 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00
- };
- #if 1
- int compress = 0;
- #else
- int compress = 0x80000000;
- #endif
- int prev,sizemb,secbyte;
- ds_printf(file,"track%02d.%s",no,type==4?"iso":"raw");
- // strcpy(file,"tmp");
- ds_printf("%s\n",file);
- fd = open2(file,O_WRONLY|O_CREAT|O_TRUNC|compress);
- if (fd<0) {
- ds_printf("open err");
- return;
- }
- secbyte = (type==4?2048:2352);
- sizemb = size*secbyte/1000000;
- prev = -1;
- for(i=0;i<size;i+=N) {
- int mega = i*secbyte/1000000;
- if (prev!=mega) {
- ds_printf(" %4d/%dM %d%\r",mega,sizemb,i*100/size);
- prev = mega;
- }
- if (cdrom_read_sectors(secbuf,first+i,N)) {
- ds_printf("read err");
- close2(fd);
- return;
- }
- if (type==4) {
- /* data */
- if (memcmp(secbuf,data_hdr,10/*sizeof(data_hdr)*/)){
- break;
- }
- write2(fd,secbuf+16,secbyte);
- } else {
- /* audio? */
- if (memzero(secbuf,secbyte)==0) continue;
- /* skip all zero */
- write2(fd,secbuf,secbyte);
- }
- }
- ds_printf(" %4d/%d %d%\r",sizemb,sizemb,100);
- close2(fd);
- }
- // 0x8c0000bc is the original DC BIOS GD_ROM Syscall address!!...
- #define MAKE_SYSCALL(rs, p1, p2, idx) \
- uint32 *syscall_bc = (uint32*)0x8c0000bc; \
- int (*syscall)() = (int (*)())(*syscall_bc); \
- rs syscall((p1), (p2), 0, (idx));
- /* Reset system functions */
- static void gdc_init_system() { MAKE_SYSCALL(/**/, 0, 0, 3); }
- /* Submit a command to the system */
- static int gdc_req_cmd(int cmd, void *param) { MAKE_SYSCALL(return, cmd, param, 0); }
- /* Check status on an executed command */
- static int gdc_get_cmd_stat(int f, void *status) { MAKE_SYSCALL(return, f, status, 1); }
- /* Execute submitted commands */
- static void gdc_exec_server() { MAKE_SYSCALL(/**/, 0, 0, 2); }
- /* Check drive status and get disc type */
- static int gdc_get_drv_stat(void *param) { MAKE_SYSCALL(return, param, 0, 4); }
- /* Set disc access mode */
- static int gdc_change_data_type(void *param) { MAKE_SYSCALL(return, param, 0, 10); }
- int _cdrom_reinit(int n) {
- int rv = ERR_OK;
- int i, r = -1, cdxa;
- uint32 params[4];
- /* Try a few times; it might be busy. If it's still busy
- after this loop then it's probably really dead. */
- for (i=0; i<8; i++) {
- if (!(r = cdrom_exec_cmd(24, NULL)))
- break;
- }
- if (i >= 8) { rv = r; goto exit; }
- /* Check disc type and set parameters */
- gdc_get_drv_stat(params);
- cdxa = params[1] == 32;
- params[0] = 0; /* 0 = set, 1 = get */
- params[1] = (n?4096:8192); /* 8192 ? */
- params[2] = 0; //cdxa ? 2048 : 1024; /* CD-XA mode 1/2 */
- params[3] = (n?2352:2048); /* sector size */
- if (gdc_change_data_type(params) < 0) { rv = ERR_SYS; goto exit; }
- exit:
- return rv;
- }
- /* The main program */
- int main(int argc, char **argv) {
- int fd,i,ret;
- int first,last,session;
- char secbuf[2352];
- char *p;
- CDROM_TOC toc;
- ds_printf("\nGD-Debug by OzOnE. 2011\n\n");
- if (cdrom_init() || _cdrom_reinit(1)) {
- ds_printf("cdrom init error\n");
- return CMD_ERROR;
- }
- ret = cdrom_read_sectors(secbuf,45150,1);
- for (i=0; i<32; i++) {
- ds_printf(" %01X", secbuf+i);
- }
- if (ret) {
- ds_printf("ip read error\n");
- return CMD_ERROR;
- }
- if (memcmp(secbuf+16,"SEGA",4)) {
- ds_printf("not GD\n");
- exit(1);
- }
- return CMD_OK;
- }
Advertisement
Add Comment
Please, Sign In to add comment