Создать ответ 
 
Рейтинг темы:
  • Голосов: 0 - Средняя оценка: 0
  • 1
  • 2
  • 3
  • 4
  • 5
вызов функции на С
Автор Сообщение
SWAT Не на форуме
Администратор
*******

Сообщений: 7138
Зарегистрирован: 04.01.2005
Рейтинг: 30
Сказал спасибо: 139
Поблагодарили 1175 раз(а) в 732 сообщ.
Сообщение: #9
RE: вызов функции на С
Да, у тебя проблема в буфере для сектора, ты его сделал ссылкой, при этом указав его размер. У тебя получился массив ссылок на char.
В общем я для наглядности сделал пару реализаций, на живую не проверял, так что извиняй если ошибка где затаилась Smile

PHP код:
//* IP.BIN dumper *//

#include "ds.h"

int main(int argcchar *argv[]) {
    
    
file_t fd;
    
uint8 secbuf[2048];
    
CDROM_TOC *toc = (CDROM_TOC *)secbuf/* Т.к. TOC используешь один раз, стоит разгрузить стек */
    
char dirp[] = "/ram/ip.bin"/* Можно взять из аргумента к команде - argv[1] */
    
uint32 startcur;
    
int rc;

    
rc cdrom_read_toc(toc0);

    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(dirpO_WRONLY);
    
    if (
fd == FILEHND_INVALID) {
        
ds_printf("DS_ERROR: Cannot open %s for writing!\n"dirp);
        return 
CMD_ERROR;
    }
    
    for(
cur 0cur 16cur++) {
        
        
rc cdrom_read_sectors(secbufstart cur1);
        
        if (
rc != ERR_OK) {
            
ds_printf("DS_ERROR: GD-ROM read error: %d\n"rc);
            
fs_close(fd);
            return 
CMD_ERROR;
        }
        
        
rc fs_write(fdsecbufsizeof(secbuf));

        if (
rc != sizeof(secbuf)) {
            
ds_printf("DS_ERROR: Error write to file: %d vs %d\n"rcsizeof(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 argcchar *argv[]) {
    
    
file_t fd;
    
uint8 *secbuf;
    
CDROM_TOC toc;
    
char dirp[] = "/ram/ip.bin";
    
uint32 startcur;
    
int rc;
    
    
secbuf calloc(1IPBIN_SIZE);
    
    if(
secbuf == NULL) {
        
ds_printf("DS_ERROR: No memory\n");
        return 
CMD_ERROR;
    }

    
rc cdrom_read_toc(&toc0);

    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(dirpO_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(secbufstartIPBIN_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(fdsecbufIPBIN_SIZE);

    if (
rc != IPBIN_SIZE) {
        
ds_printf("DS_ERROR: Error write to file: %d vs %d\n"rcIPBIN_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 cmdvoid *bufferint sectorint cnt); 

Поэтому в коде выше нужно сделать правки:

PHP код:
rc cdrom_read_sectors(CMD_PIOREADsecbufstart cur1);
rc cdrom_read_sectors(CMD_PIOREADsecbufstartIPBIN_SIZE 2048); 

Я пожалел что это сделал, ибо нарушил совместимость. В новой версии я вернул все обратно, поэтому нужно будет тебе учесть в своей программе в будущем, под какую версию DS она собирается. Это касается только функций cdrom.h

Update Убрал вычитание хардварного LBA 150, здесь это не нужно. Это когда работаешь с ISO9660, то там приходится его прибавлять и убавлять, так как все оффсеты прописаны без него.

[Изображение: barbers.png]
(Последний раз сообщение было отредактировано 04.02.2014 в 13:33, отредактировал пользователь SWAT.)
04.02.2014 11:30
Вебсайт Найти все сообщения Цитировать это сообщение
 Сказали спасибо: SILENT_Pavel , megavolt85
Создать ответ 


Сообщения в этой теме
RE: вызов функции на С - SWAT - 04.02.2014 11:30

Переход:


Пользователи просматривают эту тему: 1 Гость(ей)