(de)compress can use new romfile.[ch]
This commit is contained in:
parent
ee74ea8a08
commit
956e34db7b
4
Makefile
4
Makefile
@ -5,10 +5,10 @@ all: zyxel-revert compress decompress
|
|||||||
zyxel-revert: configfile.o event.o filedata.o logging.o context.o serial.o statemachine.o xmodem.o zyxel-revert.o
|
zyxel-revert: configfile.o event.o filedata.o logging.o context.o serial.o statemachine.o xmodem.o zyxel-revert.o
|
||||||
$(CC) $(CFLAGS) $^ -o $@
|
$(CC) $(CFLAGS) $^ -o $@
|
||||||
|
|
||||||
compress: lzsc.o filedata.o compress.o
|
compress: lzsc.o filedata.o romfile.o compress.o
|
||||||
$(CC) $(CFLAGS) $^ -o $@
|
$(CC) $(CFLAGS) $^ -o $@
|
||||||
|
|
||||||
decompress: lzsd.o filedata.o decompress.o
|
decompress: lzsd.o filedata.o romfile.o decompress.o
|
||||||
$(CC) $(CFLAGS) $^ -o $@
|
$(CC) $(CFLAGS) $^ -o $@
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
|
67
compress.c
67
compress.c
@ -2,67 +2,24 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
|
|
||||||
#include "lzsc.h"
|
#include "lzsc.h"
|
||||||
#include "filedata.h"
|
#include "filedata.h"
|
||||||
|
#include "romfile.h"
|
||||||
|
|
||||||
struct rom0file {
|
/*
|
||||||
uint16_t version;
|
* $ compress <rom-0-base> <plain-config> <rom-0-outfile>
|
||||||
uint16_t size;
|
*/
|
||||||
uint16_t offset;
|
|
||||||
|
|
||||||
char name[14];
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
int parse_rom0(struct filedata *filedata, const char *infile)
|
|
||||||
{
|
|
||||||
struct rom0file file;
|
|
||||||
|
|
||||||
/* zweite page enthält config */
|
|
||||||
uint32_t offset = 0x2000;
|
|
||||||
while (1) {
|
|
||||||
memcpy(&file, (void *)(filedata->data) + offset, sizeof(file));
|
|
||||||
|
|
||||||
if (strcmp(file.name, "autoexec.net") == 0) {
|
|
||||||
printf("found autoexec.net: 0x%04x - 0x%04x (%d bytes)\n",
|
|
||||||
0x2000 + htons(file.offset), 0x2000 + htons(file.offset) + htons(file.size), htons(file.size));
|
|
||||||
|
|
||||||
/* 16 byte header */
|
|
||||||
void *buf = (void *)(filedata->data) + 0x2000 + htons(file.offset) +12;
|
|
||||||
|
|
||||||
/* little cleanup */
|
|
||||||
memset(buf, 0, htons(file.size));
|
|
||||||
|
|
||||||
struct filedata *indata = get_filedata(infile);
|
|
||||||
int size = lzs_pack(indata->data, indata->size, buf, 0xC00);
|
|
||||||
|
|
||||||
file.size = htons(size +12);
|
|
||||||
|
|
||||||
memcpy((void *)(filedata->data) + offset, &file, sizeof(file));
|
|
||||||
printf("new autoexec.net: 0x%04x - 0x%04x (%d bytes)\n",
|
|
||||||
0x2000 + htons(file.offset), 0x2000 + htons(file.offset) + htons(file.size), htons(file.size));
|
|
||||||
|
|
||||||
put_filedata("350LI2C1.rom.own", filedata);
|
|
||||||
|
|
||||||
free(indata);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file.name[0] == 0 || file.name[0] == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
offset += sizeof(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct filedata *rom0 = get_filedata("350LI2C1.rom");
|
struct romfile *rom = get_romfile(argv[1], "autoexec.net");
|
||||||
parse_rom0(rom0, "350LI2C1.rom.own_decomp");
|
|
||||||
|
|
||||||
free(rom0);
|
struct filedata *config = get_filedata(argv[2]);
|
||||||
|
rom->size = lzs_pack(config->data, config->size, rom->data + 0xC, 0x1000);
|
||||||
|
|
||||||
|
put_romfile(argv[3], rom);
|
||||||
|
|
||||||
|
free(config);
|
||||||
|
free(rom);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
59
decompress.c
59
decompress.c
@ -2,64 +2,27 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
|
|
||||||
#include "lzsd.h"
|
#include "lzsd.h"
|
||||||
#include "filedata.h"
|
#include "romfile.h"
|
||||||
|
|
||||||
struct rom0file {
|
|
||||||
uint16_t version;
|
|
||||||
uint16_t size;
|
|
||||||
uint16_t offset;
|
|
||||||
|
|
||||||
char name[14];
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
int parse_rom0(struct filedata *filedata, const char *outfile)
|
|
||||||
{
|
|
||||||
struct rom0file file;
|
|
||||||
|
|
||||||
/* zweite page enthält config */
|
|
||||||
uint32_t offset = 0x2000;
|
|
||||||
while (1) {
|
|
||||||
memcpy(&file, (void *)(filedata->data) + offset, sizeof(file));
|
|
||||||
|
|
||||||
if (strcmp(file.name, "autoexec.net") == 0) {
|
|
||||||
printf("found autoexec.net: 0x%04x - 0x%04x (%d bytes)\n",
|
|
||||||
0x2000 + htons(file.offset), 0x2000 + htons(file.offset) + htons(file.size), htons(file.size));
|
|
||||||
|
|
||||||
/* 64kb sollten reichen */
|
|
||||||
struct filedata *out = alloc_filedata(65535);
|
|
||||||
|
|
||||||
/* 16 byte header */
|
|
||||||
void *buf = (void *)(filedata->data) + 0x2000 + htons(file.offset) +12;
|
|
||||||
|
|
||||||
out->size = lzs_unpack(buf, htons(file.size) -12, out->data, out->size);
|
|
||||||
put_filedata(outfile, out);
|
|
||||||
free(out);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file.name[0] == 0 || file.name[0] == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
offset += sizeof(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $ decompress <rom-0-file>
|
||||||
|
*/
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct filedata *in = get_filedata(argv[1]);
|
struct romfile *rom = get_romfile(argv[1], "autoexec.net");
|
||||||
|
|
||||||
|
struct filedata *config = alloc_filedata(65536);
|
||||||
|
config->size = lzs_unpack(rom->data + 0xC, rom->size - 0xC, config->data, config->size);
|
||||||
|
|
||||||
char outname[64];
|
char outname[64];
|
||||||
strncpy(outname, argv[1], sizeof(outname));
|
strncpy(outname, argv[1], sizeof(outname));
|
||||||
strcat(outname, ".own_decomp");
|
strcat(outname, ".own_decomp");
|
||||||
|
|
||||||
parse_rom0(in, outname);
|
put_filedata(outname, config);
|
||||||
|
|
||||||
free(in);
|
free(config);
|
||||||
|
free(rom);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
2
lzsd.h
2
lzsd.h
@ -1,6 +1,8 @@
|
|||||||
#ifndef _LZSD_H_
|
#ifndef _LZSD_H_
|
||||||
#define _LZSD_H_
|
#define _LZSD_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
uint32_t lzs_unpack(void *src, uint32_t srcsize, void *dst, uint32_t dstsize);
|
uint32_t lzs_unpack(void *src, uint32_t srcsize, void *dst, uint32_t dstsize);
|
||||||
|
|
||||||
#endif /* _LZSD_H_ */
|
#endif /* _LZSD_H_ */
|
||||||
|
63
romfile.c
Normal file
63
romfile.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include "filedata.h"
|
||||||
|
#include "romfile.h"
|
||||||
|
|
||||||
|
struct romfile_header {
|
||||||
|
uint16_t version;
|
||||||
|
uint16_t size;
|
||||||
|
uint16_t offset;
|
||||||
|
|
||||||
|
char name[14];
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct romfile * get_romfile(const char *filename, const char *romfile_name)
|
||||||
|
{
|
||||||
|
struct romfile *romfile = malloc(sizeof(struct romfile));
|
||||||
|
if (romfile == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
romfile->file = get_filedata(filename);
|
||||||
|
if (romfile->file == NULL) {
|
||||||
|
free(romfile);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
romfile->baseoffset = 0x2000;
|
||||||
|
|
||||||
|
struct romfile_header header;
|
||||||
|
while (1) {
|
||||||
|
memcpy(&header, (void *)(romfile->file->data) + romfile->baseoffset, sizeof(header));
|
||||||
|
|
||||||
|
if (strcmp(header.name, romfile_name) == 0) {
|
||||||
|
romfile->data = (void *)(romfile->file->data) + 0x2000 + htons(header.offset);
|
||||||
|
romfile->size = htons(header.size);
|
||||||
|
return romfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header.name[0] == 0 || header.name[0] == -1) {
|
||||||
|
free(romfile->file);
|
||||||
|
free(romfile);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
romfile->baseoffset += sizeof(header);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int put_romfile(const char *filename, struct romfile *romfile)
|
||||||
|
{
|
||||||
|
struct romfile_header header;
|
||||||
|
memcpy(&header, (void *)(romfile->file->data) + romfile->baseoffset, sizeof(header));
|
||||||
|
|
||||||
|
header.size = htons(romfile->size);
|
||||||
|
memcpy((void *)(romfile->file->data) + romfile->baseoffset, &header, sizeof(header));
|
||||||
|
|
||||||
|
return put_filedata(filename, romfile->file);
|
||||||
|
}
|
22
romfile.h
Normal file
22
romfile.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef _ROMFILE_H_
|
||||||
|
#define _ROMFILE_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "filedata.h"
|
||||||
|
|
||||||
|
struct romfile {
|
||||||
|
struct filedata *file;
|
||||||
|
|
||||||
|
/* offset to struct rom0file-struct in file->data */
|
||||||
|
uint32_t baseoffset;
|
||||||
|
|
||||||
|
/* the data */
|
||||||
|
uint8_t *data;
|
||||||
|
uint16_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct romfile * get_romfile(const char *filename, const char *romfile_name);
|
||||||
|
int put_romfile(const char *filename, struct romfile *romfile);
|
||||||
|
|
||||||
|
#endif /* _ROMFILE_H_ */
|
Loading…
Reference in New Issue
Block a user