mirror of https://github.com/jamie/ciso.git
Compare commits
4 Commits
Author | SHA1 | Date |
---|---|---|
Jamie Macey | c5204affaf | |
Jamie Macey | 34d581334f | |
Jamie Macey | aab55397fc | |
Juha Laukkanen | 87af861468 |
|
@ -1,28 +1,21 @@
|
||||||
ciso is a simple commandline utility to compress PSP iso files.
|
ciso is a simple commandline utility to compress PSP iso files.
|
||||||
|
|
||||||
This package is a (currently incomplete) port of a package provided
|
This package is an OSX port of a package provided by Ubuntu: http://packages.ubuntu.com/search?keywords=ciso
|
||||||
by Ubuntu: http://packages.ubuntu.com/natty/ciso
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
make
|
||||||
|
make install # (optional)
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
|
|
||||||
To decompress a cso file:
|
To decompress a cso file:
|
||||||
|
|
||||||
ciso 0 infile.cso outfile.iso
|
ciso 0 infile.cso outfile.iso
|
||||||
|
|
||||||
To compress an iso file:
|
To compress an iso file:
|
||||||
|
|
||||||
ciso level infile.iso outfile.cso
|
ciso level infile.iso outfile.cso
|
||||||
|
|
||||||
where level ranges from 1 (fast, poor compression) to 9 (slow, high
|
where level ranges from 1 (fast, poor compression) to 9 (slow, high
|
||||||
compression).
|
compression).
|
||||||
|
|
||||||
# WARNING
|
|
||||||
|
|
||||||
Do Not Trust Your Data To This
|
|
||||||
|
|
||||||
While it appears that iso -> cso -> iso roundtrips are lossless, the
|
|
||||||
generated cso is broken and existing csos that I have are not
|
|
||||||
recognized by the executable.
|
|
||||||
|
|
||||||
Given the compilation warnings I get I am assuming it's buggy due to
|
|
||||||
differences between Linux and MacOS libraries.
|
|
||||||
|
|
37
ciso.c
37
ciso.c
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <zlib.h> /* /usr(/local)/include/zlib.h */
|
#include <zlib.h> /* /usr(/local)/include/zlib.h */
|
||||||
#include <zconf.h>
|
#include <zconf.h>
|
||||||
|
|
||||||
|
@ -31,10 +32,10 @@ const char *fname_in,*fname_out;
|
||||||
FILE *fin,*fout;
|
FILE *fin,*fout;
|
||||||
z_stream z;
|
z_stream z;
|
||||||
|
|
||||||
unsigned int *index_buf = NULL;
|
uint32_t *index_buf = NULL;
|
||||||
unsigned int *crc_buf = NULL;
|
uint32_t *crc_buf = NULL;
|
||||||
unsigned char *block_buf1 = NULL;
|
uint8_t *block_buf1 = NULL;
|
||||||
unsigned char *block_buf2 = NULL;
|
uint8_t *block_buf2 = NULL;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
compress ISO to CSO
|
compress ISO to CSO
|
||||||
|
@ -43,9 +44,9 @@ unsigned char *block_buf2 = NULL;
|
||||||
CISO_H ciso;
|
CISO_H ciso;
|
||||||
int ciso_total_block;
|
int ciso_total_block;
|
||||||
|
|
||||||
unsigned long long check_file_size(FILE *fp)
|
uint64_t check_file_size(FILE *fp)
|
||||||
{
|
{
|
||||||
unsigned long long pos;
|
uint64_t pos;
|
||||||
|
|
||||||
if( fseek(fp,0,SEEK_END) < 0)
|
if( fseek(fp,0,SEEK_END) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -80,9 +81,9 @@ unsigned long long check_file_size(FILE *fp)
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
int decomp_ciso(void)
|
int decomp_ciso(void)
|
||||||
{
|
{
|
||||||
unsigned long long file_size;
|
uint64_t file_size;
|
||||||
unsigned int index , index2;
|
uint32_t index , index2;
|
||||||
unsigned long long read_pos , read_size;
|
uint64_t read_pos , read_size;
|
||||||
int total_sectors;
|
int total_sectors;
|
||||||
int index_size;
|
int index_size;
|
||||||
int block;
|
int block;
|
||||||
|
@ -117,7 +118,7 @@ int decomp_ciso(void)
|
||||||
ciso_total_block = ciso.total_bytes / ciso.block_size;
|
ciso_total_block = ciso.total_bytes / ciso.block_size;
|
||||||
|
|
||||||
/* allocate index block */
|
/* allocate index block */
|
||||||
index_size = (ciso_total_block + 1 ) * sizeof(unsigned long);
|
index_size = (ciso_total_block + 1 ) * sizeof(uint32_t);
|
||||||
index_buf = malloc(index_size);
|
index_buf = malloc(index_size);
|
||||||
block_buf1 = malloc(ciso.block_size);
|
block_buf1 = malloc(ciso.block_size);
|
||||||
block_buf2 = malloc(ciso.block_size*2);
|
block_buf2 = malloc(ciso.block_size*2);
|
||||||
|
@ -138,7 +139,7 @@ int decomp_ciso(void)
|
||||||
|
|
||||||
/* show info */
|
/* show info */
|
||||||
printf("Decompress '%s' to '%s'\n",fname_in,fname_out);
|
printf("Decompress '%s' to '%s'\n",fname_in,fname_out);
|
||||||
printf("Total File Size %ld bytes\n",ciso.total_bytes);
|
printf("Total File Size %lld bytes\n",ciso.total_bytes);
|
||||||
printf("block size %d bytes\n",ciso.block_size);
|
printf("block size %d bytes\n",ciso.block_size);
|
||||||
printf("total blocks %d blocks\n",ciso_total_block);
|
printf("total blocks %d blocks\n",ciso_total_block);
|
||||||
printf("index align %d\n",1<<ciso.align);
|
printf("index align %d\n",1<<ciso.align);
|
||||||
|
@ -237,8 +238,8 @@ int decomp_ciso(void)
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
int comp_ciso(int level)
|
int comp_ciso(int level)
|
||||||
{
|
{
|
||||||
unsigned long long file_size;
|
uint64_t file_size;
|
||||||
unsigned long long write_pos;
|
uint64_t write_pos;
|
||||||
int total_sectors;
|
int total_sectors;
|
||||||
int index_size;
|
int index_size;
|
||||||
int block;
|
int block;
|
||||||
|
@ -250,14 +251,14 @@ int comp_ciso(int level)
|
||||||
int align,align_b,align_m;
|
int align,align_b,align_m;
|
||||||
|
|
||||||
file_size = check_file_size(fin);
|
file_size = check_file_size(fin);
|
||||||
if(file_size<0)
|
if(file_size==(uint64_t)-1LL)
|
||||||
{
|
{
|
||||||
printf("Can't get file size\n");
|
printf("Can't get file size\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate index block */
|
/* allocate index block */
|
||||||
index_size = (ciso_total_block + 1 ) * sizeof(unsigned long);
|
index_size = (ciso_total_block + 1 ) * sizeof(uint32_t);
|
||||||
index_buf = malloc(index_size);
|
index_buf = malloc(index_size);
|
||||||
crc_buf = malloc(index_size);
|
crc_buf = malloc(index_size);
|
||||||
block_buf1 = malloc(ciso.block_size);
|
block_buf1 = malloc(ciso.block_size);
|
||||||
|
@ -279,7 +280,7 @@ int comp_ciso(int level)
|
||||||
|
|
||||||
/* show info */
|
/* show info */
|
||||||
printf("Compress '%s' to '%s'\n",fname_in,fname_out);
|
printf("Compress '%s' to '%s'\n",fname_in,fname_out);
|
||||||
printf("Total File Size %ld bytes\n",ciso.total_bytes);
|
printf("Total File Size %lld bytes\n",ciso.total_bytes);
|
||||||
printf("block size %d bytes\n",ciso.block_size);
|
printf("block size %d bytes\n",ciso.block_size);
|
||||||
printf("index align %d\n",1<<ciso.align);
|
printf("index align %d\n",1<<ciso.align);
|
||||||
printf("compress level %d\n",level);
|
printf("compress level %d\n",level);
|
||||||
|
@ -306,7 +307,7 @@ int comp_ciso(int level)
|
||||||
percent_cnt = percent_period;
|
percent_cnt = percent_period;
|
||||||
printf("compress %3d%% avarage rate %3d%%\r"
|
printf("compress %3d%% avarage rate %3d%%\r"
|
||||||
,block / percent_period
|
,block / percent_period
|
||||||
,block==0 ? 0 : 100*write_pos/(block*0x800));
|
,block==0 ? 0 : (uint32_t)(100*write_pos/(block*0x800)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (deflateInit2(&z, level , Z_DEFLATED, -15,8,Z_DEFAULT_STRATEGY) != Z_OK)
|
if (deflateInit2(&z, level , Z_DEFLATED, -15,8,Z_DEFAULT_STRATEGY) != Z_OK)
|
||||||
|
@ -401,7 +402,7 @@ int main(int argc, char *argv[])
|
||||||
int level;
|
int level;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
fprintf(stderr, "Compressed ISO9660 converter Ver.1.01 by BOOSTER\n");
|
fprintf(stderr, "Compressed ISO9660 converter Ver.1.02 by BOOSTER\n");
|
||||||
|
|
||||||
if (argc != 4)
|
if (argc != 4)
|
||||||
{
|
{
|
||||||
|
|
82
ciso.h
82
ciso.h
|
@ -19,44 +19,46 @@
|
||||||
Copyright 2005 BOOSTER
|
Copyright 2005 BOOSTER
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef __CISO_H__
|
||||||
|
#define __CISO_H__
|
||||||
|
/*
|
||||||
|
complessed ISO(9660) header format
|
||||||
|
*/
|
||||||
|
typedef struct ciso_header
|
||||||
|
{
|
||||||
|
uint8_t magic[4]; /* +00 : 'C','I','S','O' */
|
||||||
|
uint32_t header_size; /* +04 : header size (==0x18) */
|
||||||
|
uint64_t total_bytes; /* +08 : number of original data size */
|
||||||
|
uint32_t block_size; /* +10 : number of compressed block size */
|
||||||
|
uint8_t ver; /* +14 : version 01 */
|
||||||
|
uint8_t align; /* +15 : align of index value */
|
||||||
|
uint8_t rsv_06[2]; /* +16 : reserved */
|
||||||
|
#if 0
|
||||||
|
// INDEX BLOCK
|
||||||
|
uint32_t index[0]; /* +18 : block[0] index */
|
||||||
|
uint32_t index[1]; /* +1C : block[1] index */
|
||||||
|
:
|
||||||
|
:
|
||||||
|
uint32_t index[last]; /* +?? : block[last] */
|
||||||
|
uint32_t index[last+1]; /* +?? : end of last data point */
|
||||||
|
// DATA BLOCK
|
||||||
|
uint8_t data[]; /* +?? : compressed or plain sector data */
|
||||||
|
#endif
|
||||||
|
}CISO_H;
|
||||||
|
|
||||||
|
/*
|
||||||
|
note:
|
||||||
|
|
||||||
|
file_pos_sector[n] = (index[n]&0x7fffffff) << CISO_H.align
|
||||||
|
file_size_sector[n] = ( (index[n+1]&0x7fffffff) << CISO_H.align) - file_pos_sector[n]
|
||||||
|
|
||||||
|
if(index[n]&0x80000000)
|
||||||
|
// read 0x800 without compress
|
||||||
|
else
|
||||||
|
// read file_size_sector[n] bytes and decompress data
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __CISO_H__
|
|
||||||
#define __CISO_H__
|
|
||||||
/*
|
|
||||||
complessed ISO(9660) header format
|
|
||||||
*/
|
|
||||||
typedef struct ciso_header
|
|
||||||
{
|
|
||||||
unsigned char magic[4]; /* +00 : 'C','I','S','O' */
|
|
||||||
unsigned long header_size; /* +04 : header size (==0x18) */
|
|
||||||
unsigned long long total_bytes; /* +08 : number of original data size */
|
|
||||||
unsigned long block_size; /* +10 : number of compressed block size */
|
|
||||||
unsigned char ver; /* +14 : version 01 */
|
|
||||||
unsigned char align; /* +15 : align of index value */
|
|
||||||
unsigned char rsv_06[2]; /* +16 : reserved */
|
|
||||||
#if 0
|
|
||||||
// INDEX BLOCK
|
|
||||||
unsigned int index[0]; /* +18 : block[0] index */
|
|
||||||
unsigned int index[1]; /* +1C : block[1] index */
|
|
||||||
:
|
|
||||||
:
|
|
||||||
unsigned int index[last]; /* +?? : block[last] */
|
|
||||||
unsigned int index[last+1]; /* +?? : end of last data point */
|
|
||||||
// DATA BLOCK
|
|
||||||
unsigned char data[]; /* +?? : compressed or plain sector data */
|
|
||||||
#endif
|
|
||||||
}CISO_H;
|
|
||||||
|
|
||||||
/*
|
|
||||||
note:
|
|
||||||
|
|
||||||
file_pos_sector[n] = (index[n]&0x7fffffff) << CISO_H.align
|
|
||||||
file_size_sector[n] = ( (index[n+1]&0x7fffffff) << CISO_H.align) - file_pos_sector[n]
|
|
||||||
|
|
||||||
if(index[n]&0x80000000)
|
|
||||||
// read 0x800 without compress
|
|
||||||
else
|
|
||||||
// read file_size_sector[n] bytes and decompress data
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
Loading…
Reference in New Issue