Да, у тебя проблема в буфере для сектора, ты его сделал ссылкой, при этом указав его размер. У тебя получился массив ссылок на char.
В общем я для наглядности сделал пару реализаций, на живую не проверял, так что извиняй если ошибка где затаилась
PHP код:
//* IP.BIN dumper *//
#include "ds.h"
int main(int argc, char *argv[]) {
file_t fd;
uint8 secbuf[2048];
CDROM_TOC *toc = (CDROM_TOC *)secbuf; /* Т.к. TOC используешь один раз, стоит разгрузить стек */
char dirp[] = "/ram/ip.bin"; /* Можно взять из аргумента к команде - argv[1] */
uint32 start, cur;
int rc;
rc = cdrom_read_toc(toc, 0);
if(rc != ERR_OK) {
ds_printf("DS_ERROR: Cannot read TOC: %d\n", rc);
return CMD_ERROR;
}
start = cdrom_locate_data_track(toc);
if(!start) {
ds_printf("DS_ERROR: Cannot find data track!\n");
return CMD_ERROR;
}
fd = fs_open(dirp, O_WRONLY);
if (fd == FILEHND_INVALID) {
ds_printf("DS_ERROR: Cannot open %s for writing!\n", dirp);
return CMD_ERROR;
}
for(cur = 0; cur < 16; cur++) {
rc = cdrom_read_sectors(secbuf, start + cur, 1);
if (rc != ERR_OK) {
ds_printf("DS_ERROR: GD-ROM read error: %d\n", rc);
fs_close(fd);
return CMD_ERROR;
}
rc = fs_write(fd, secbuf, sizeof(secbuf));
if (rc != sizeof(secbuf)) {
ds_printf("DS_ERROR: Error write to file: %d vs %d\n", rc, sizeof(secbuf));
fs_close(fd);
return CMD_ERROR;
}
}
fs_close(fd);
return CMD_OK;
}
PHP код:
//* IP.BIN dumper *//
#include "ds.h"
#define IPBIN_SIZE 32768
int main(int argc, char *argv[]) {
file_t fd;
uint8 *secbuf;
CDROM_TOC toc;
char dirp[] = "/ram/ip.bin";
uint32 start, cur;
int rc;
secbuf = calloc(1, IPBIN_SIZE);
if(secbuf == NULL) {
ds_printf("DS_ERROR: No memory\n");
return CMD_ERROR;
}
rc = cdrom_read_toc(&toc, 0);
if(rc != ERR_OK) {
ds_printf("DS_ERROR: Cannot read TOC: %d\n", rc);
free(secbuf);
return CMD_ERROR;
}
start = cdrom_locate_data_track(&toc);
if(!start) {
ds_printf("DS_ERROR: Cannot find data track!\n");
free(secbuf);
return CMD_ERROR;
}
fd = fs_open(dirp, O_WRONLY);
if (fd == FILEHND_INVALID) {
ds_printf("DS_ERROR: Cannot open %s for writing!\n", dirp);
free(secbuf);
return CMD_ERROR;
}
rc = cdrom_read_sectors(secbuf, start, IPBIN_SIZE / 2048);
if (rc != ERR_OK) {
ds_printf("DS_ERROR: GD-ROM read error: %d\n", rc);
fs_close(fd);
free(secbuf);
return CMD_ERROR;
}
rc = fs_write(fd, secbuf, IPBIN_SIZE);
if (rc != IPBIN_SIZE) {
ds_printf("DS_ERROR: Error write to file: %d vs %d\n", rc, IPBIN_SIZE);
fs_close(fd);
free(secbuf);
return CMD_ERROR;
}
fs_close(fd);
free(secbuf);
return CMD_OK;
}
А по поводу int cdrom_set_datatype(int p1, int cdxa, int sector_size); то в В KOS этой функции нет.
И кстати я что вспомнил, для RC1 в SDK есть директория patch, в которой хранятся хэдэры, их нужно тебе заменить в KOS, ибо там были правки и дополнения.
Допустим у функции чтения секторов, первым аргументом идет тип команды для сискола:
PHP код:
int cdrom_read_sectors(int cmd, void *buffer, int sector, int cnt);
Поэтому в коде выше нужно сделать правки:
PHP код:
rc = cdrom_read_sectors(CMD_PIOREAD, secbuf, start + cur, 1);
rc = cdrom_read_sectors(CMD_PIOREAD, secbuf, start, IPBIN_SIZE / 2048);
Я пожалел что это сделал, ибо нарушил совместимость. В новой версии я вернул все обратно, поэтому нужно будет тебе учесть в своей программе в будущем, под какую версию DS она собирается. Это касается только функций cdrom.h
Update Убрал вычитание хардварного LBA 150, здесь это не нужно. Это когда работаешь с ISO9660, то там приходится его прибавлять и убавлять, так как все оффсеты прописаны без него.