Add skeleton for writable cdrom image file.
This commit is contained in:
@@ -24,6 +24,7 @@ add_library(cdrom OBJECT
|
|||||||
cdrom_image.c
|
cdrom_image.c
|
||||||
cdrom_image_viso.c
|
cdrom_image_viso.c
|
||||||
cdrom_mke.c
|
cdrom_mke.c
|
||||||
|
cdrom_image_writable.c
|
||||||
)
|
)
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
target_include_directories(86Box PRIVATE PkgConfig::SNDFILE)
|
target_include_directories(86Box PRIVATE PkgConfig::SNDFILE)
|
||||||
|
|||||||
197
src/cdrom/cdrom_image_writable.c
Normal file
197
src/cdrom/cdrom_image_writable.c
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
/*
|
||||||
|
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||||
|
* running old operating systems and software designed for IBM
|
||||||
|
* PC systems and compatibles from 1981 through fairly recent
|
||||||
|
* system designs based on the PCI bus.
|
||||||
|
*
|
||||||
|
* This file is part of the 86Box distribution.
|
||||||
|
*
|
||||||
|
* CD-R(W) writable image file handling module.
|
||||||
|
*
|
||||||
|
* Authors: Nat Portillo, <claunia@claunia.com>
|
||||||
|
*
|
||||||
|
* Copyright 2025 Nat Portillo.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __STDC_FORMAT_MACROS
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#ifdef ENABLE_IMAGE_LOG
|
||||||
|
#include <stdarg.h>
|
||||||
|
#endif
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <86box/log.h>
|
||||||
|
#include <86box/cdrom.h>
|
||||||
|
#include <86box/cdrom_image_writable.h>
|
||||||
|
|
||||||
|
#include <sndfile.h>
|
||||||
|
|
||||||
|
#define MAX_LINE_LENGTH 512
|
||||||
|
#define MAX_FILENAME_LENGTH 256
|
||||||
|
#define CROSS_LEN 512
|
||||||
|
|
||||||
|
static char temp_keyword[1024];
|
||||||
|
|
||||||
|
typedef struct track_index_t {
|
||||||
|
int64_t start;
|
||||||
|
uint64_t length;
|
||||||
|
uint64_t file_start;
|
||||||
|
uint64_t file_length;
|
||||||
|
track_file_t *file;
|
||||||
|
} track_index_t;
|
||||||
|
|
||||||
|
typedef struct track_t {
|
||||||
|
uint8_t session;
|
||||||
|
uint8_t attr;
|
||||||
|
uint8_t tno;
|
||||||
|
uint8_t point;
|
||||||
|
uint8_t extra[4];
|
||||||
|
uint8_t mode;
|
||||||
|
uint8_t form;
|
||||||
|
uint8_t subch_type;
|
||||||
|
uint8_t skip;
|
||||||
|
uint8_t max_index;
|
||||||
|
uint32_t sector_size;
|
||||||
|
track_index_t idx[100];
|
||||||
|
} track_t;
|
||||||
|
|
||||||
|
typedef struct cd_image_t {
|
||||||
|
cdrom_t *dev;
|
||||||
|
void *log;
|
||||||
|
int has_audio;
|
||||||
|
int32_t tracks_num;
|
||||||
|
track_t *tracks;
|
||||||
|
} cd_image_t;
|
||||||
|
|
||||||
|
#ifdef ENABLE_IMAGE_LOG
|
||||||
|
int image_do_log = ENABLE_IMAGE_LOG;
|
||||||
|
|
||||||
|
void
|
||||||
|
image_log(void *priv, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
if (image_do_log) {
|
||||||
|
va_start(ap, fmt);
|
||||||
|
log_out(priv, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *cit[4] = { "SPECIAL", "NONE", "ZERO", "NORMAL" };
|
||||||
|
#else
|
||||||
|
# define image_log(priv, fmt, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
wimage_get_track_info(const void *local, const uint32_t track,
|
||||||
|
const int end, track_info_t *ti)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
wimage_get_raw_track_info(const void *local, int *num, uint8_t *buffer)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
wimage_is_track_pre(const void *local, const uint32_t sector)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
wimage_read_sector(const void *local, uint8_t *buffer,
|
||||||
|
const uint32_t sector)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t
|
||||||
|
wimage_get_track_type(const void *local, const uint32_t sector)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t
|
||||||
|
wimage_get_last_block(const void *local)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
wimage_read_dvd_structure(const void *local, const uint8_t layer, const uint8_t format,
|
||||||
|
uint8_t *buffer, uint32_t *info)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
wimage_is_dvd(const void *local)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
wimage_has_audio(const void *local)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
wimage_close(void *local)
|
||||||
|
{
|
||||||
|
// TODO: Not implemented
|
||||||
|
}
|
||||||
|
|
||||||
|
static const cdrom_ops_t image_ops = {
|
||||||
|
wimage_get_track_info,
|
||||||
|
wimage_get_raw_track_info,
|
||||||
|
wimage_is_track_pre,
|
||||||
|
wimage_read_sector,
|
||||||
|
wimage_get_track_type,
|
||||||
|
wimage_get_last_block,
|
||||||
|
wimage_read_dvd_structure,
|
||||||
|
wimage_is_dvd,
|
||||||
|
wimage_has_audio,
|
||||||
|
NULL,
|
||||||
|
wimage_close,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Public functions. */
|
||||||
|
void *
|
||||||
|
wimage_open(cdrom_t *dev, const char *path)
|
||||||
|
{
|
||||||
|
cd_image_t *img = (cd_image_t *) calloc(1, sizeof(cd_image_t));
|
||||||
|
|
||||||
|
dev->ops = &image_ops;
|
||||||
|
|
||||||
|
// TODO: Not implemented
|
||||||
|
|
||||||
|
return img;
|
||||||
|
}
|
||||||
34
src/include/86box/cdrom_image_writable.h
Normal file
34
src/include/86box/cdrom_image_writable.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||||
|
* running old operating systems and software designed for IBM
|
||||||
|
* PC systems and compatibles from 1981 through fairly recent
|
||||||
|
* system designs based on the PCI bus.
|
||||||
|
*
|
||||||
|
* This file is part of the 86Box distribution.
|
||||||
|
*
|
||||||
|
* CD-R(W) writable image file handling module.
|
||||||
|
*
|
||||||
|
* Authors: Nat Portillo, <claunia@claunia.com>
|
||||||
|
*
|
||||||
|
* Copyright 2025 Nat Portillo.
|
||||||
|
*/
|
||||||
|
#ifndef CDROM_IMAGE_WRITABLE_H
|
||||||
|
#define CDROM_IMAGE_WRITABLE_H
|
||||||
|
|
||||||
|
/* Track file struct. */
|
||||||
|
typedef struct track_file_t {
|
||||||
|
int (*read)(void *priv, uint8_t *buffer, uint64_t seek, size_t count);
|
||||||
|
uint64_t (*get_length)(void *priv);
|
||||||
|
void (*close)(void *priv);
|
||||||
|
|
||||||
|
char fn[260];
|
||||||
|
FILE *fp;
|
||||||
|
void *priv;
|
||||||
|
void *log;
|
||||||
|
|
||||||
|
int motorola;
|
||||||
|
} track_file_t;
|
||||||
|
|
||||||
|
extern void *wimage_open(cdrom_t *dev, const char *path);
|
||||||
|
|
||||||
|
#endif /*CDROM_IMAGE_WRITABLE_H*/
|
||||||
Reference in New Issue
Block a user