nkeynes@1: /* nkeynes@1: * nkeynes@1: */ nkeynes@1: nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include "gui.h" nkeynes@1: #include "ipbin.h" nkeynes@1: #include "sh4core.h" nkeynes@1: #include "mem.h" nkeynes@1: nkeynes@1: char ip_bin_magic[32] = "SEGA SEGAKATANA SEGA ENTERPRISES"; nkeynes@1: char iso_magic[6] = "\001CD001"; nkeynes@1: nkeynes@1: #define CDI_V2 0x80000004 nkeynes@1: #define CDI_V3 0x80000005 nkeynes@1: nkeynes@1: void open_file( char *filename ) nkeynes@1: { nkeynes@1: char buf[32]; nkeynes@1: uint32_t tmpa[2]; nkeynes@1: struct stat st; nkeynes@1: nkeynes@1: int fd = open( filename, O_RDONLY ); nkeynes@1: if( fd == -1 ) { nkeynes@1: ERROR( "Unable to open file: '%s' (%s)", filename, nkeynes@1: strerror(errno) ); nkeynes@1: return; nkeynes@1: } nkeynes@1: nkeynes@1: fstat( fd, &st ); nkeynes@1: if( st.st_size < 32768 ) { nkeynes@1: ERROR( "File '%s' too small to be a dreamcast image", filename ); nkeynes@1: close(fd); nkeynes@1: return; nkeynes@1: } nkeynes@1: nkeynes@1: /* begin magic */ nkeynes@1: if( read( fd, buf, 32 ) != 32 ) { nkeynes@1: ERROR( "Unable to read from file '%s'", filename ); nkeynes@1: close(fd); nkeynes@1: return; nkeynes@1: } nkeynes@1: if( memcmp( buf, ip_bin_magic, 32 ) == 0 ) { nkeynes@1: /* we have a DC bootstrap */ nkeynes@1: if( st.st_size == BOOTSTRAP_SIZE ) { nkeynes@1: char *load = mem_get_region( BOOTSTRAP_LOAD_ADDR ); nkeynes@1: /* Just the bootstrap, no image... */ nkeynes@1: WARN( "File '%s' contains bootstrap only, loading anyway", nkeynes@1: filename ); nkeynes@1: lseek( fd, 0, SEEK_SET ); nkeynes@1: read( fd, load, BOOTSTRAP_SIZE ); nkeynes@1: parse_ipbin( load ); nkeynes@1: sh4_reset(); nkeynes@1: sh4_set_pc( BOOTSTRAP_LOAD_ADDR + 0x300 ); nkeynes@1: set_disassembly_region( BOOTSTRAP_LOAD_ADDR ); nkeynes@1: set_disassembly_pc( sh4r.pc, TRUE ); nkeynes@2: update_gui(); nkeynes@1: } else { nkeynes@1: /* look for a valid ISO9660 header */ nkeynes@1: lseek( fd, 32768, SEEK_SET ); nkeynes@1: read( fd, buf, 8 ); nkeynes@1: if( memcmp( buf, iso_magic, 6 ) == 0 ) { nkeynes@1: /* Alright, got it */ nkeynes@1: INFO( "Loading ISO9660 filesystem from '%s'", nkeynes@1: filename ); nkeynes@1: } nkeynes@1: } nkeynes@1: } else { nkeynes@1: /* check if it's a CDI file: */ nkeynes@1: lseek( fd, -8, SEEK_END ); nkeynes@1: read( fd, &tmpa, 8 ); nkeynes@1: if( tmpa[0] == CDI_V2 || tmpa[0] == CDI_V3 ) { nkeynes@1: /* Yup, it is */ nkeynes@1: INFO( "Loading CDI file '%s'", filename ); nkeynes@1: } else { nkeynes@1: ERROR( "Don't know what to do with '%s'", filename ); nkeynes@1: } nkeynes@1: } nkeynes@1: close(fd); nkeynes@1: }