#ifndef _DEVICE_TABLE_H_
#define _DEVICE_TABLE_H_
#include "basics.h"
#include "device.h"
#include "tree.h"
#ifdef HAVE_STRING_H
#include <string.h>
#else
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
#endif
typedef struct _device_callbacks device_callbacks;
typedef void *(device_creator)
(const char *name,
const device_unit *unit_address,
const char *args);
typedef void (device_init_callback)
(device *me);
typedef struct _device_init_callbacks {
device_init_callback *address;
device_init_callback *data;
} device_init_callbacks;
typedef void (device_address_callback)
(device *me,
attach_type attach,
int space,
unsigned_word addr,
unsigned nr_bytes,
access_type access,
device *client);
typedef struct _device_address_callbacks {
device_address_callback *attach;
device_address_callback *detach;
} device_address_callbacks;
typedef unsigned (device_io_read_buffer_callback)
(device *me,
void *dest,
int space,
unsigned_word addr,
unsigned nr_bytes,
cpu *processor,
unsigned_word cia);
typedef unsigned (device_io_write_buffer_callback)
(device *me,
const void *source,
int space,
unsigned_word addr,
unsigned nr_bytes,
cpu *processor,
unsigned_word cia);
typedef struct _device_io_callbacks {
device_io_read_buffer_callback *read_buffer;
device_io_write_buffer_callback *write_buffer;
} device_io_callbacks;
typedef unsigned (device_dma_read_buffer_callback)
(device *me,
void *dest,
int space,
unsigned_word addr,
unsigned nr_bytes);
typedef unsigned (device_dma_write_buffer_callback)
(device *me,
const void *source,
int space,
unsigned_word addr,
unsigned nr_bytes,
int violate_read_only_section);
typedef struct _device_dma_callbacks {
device_dma_read_buffer_callback *read_buffer;
device_dma_write_buffer_callback *write_buffer;
} device_dma_callbacks;
typedef void (device_interrupt_event_callback)
(device *me,
int my_port,
device *source,
int source_port,
int level,
cpu *processor,
unsigned_word cia);
typedef void (device_child_interrupt_event_callback)
(device *me,
device *parent,
device *source,
int source_port,
int level,
cpu *processor,
unsigned_word cia);
typedef struct _device_interrupt_port_descriptor {
const char *name;
int number;
int nr_ports;
port_direction direction;
} device_interrupt_port_descriptor;
typedef struct _device_interrupt_callbacks {
device_interrupt_event_callback *event;
device_child_interrupt_event_callback *child_event;
const device_interrupt_port_descriptor *ports;
} device_interrupt_callbacks;
typedef int (device_unit_decode_callback)
(device *bus,
const char *unit,
device_unit *address);
typedef int (device_unit_encode_callback)
(device *bus,
const device_unit *unit_address,
char *buf,
int sizeof_buf);
typedef int (device_address_to_attach_address_callback)
(device *bus,
const device_unit *address,
int *attach_space,
unsigned_word *attach_address,
device *client);
typedef int (device_size_to_attach_size_callback)
(device *bus,
const device_unit *size,
unsigned *nr_bytes,
device *client);
typedef struct _device_convert_callbacks {
device_unit_decode_callback *decode_unit;
device_unit_encode_callback *encode_unit;
device_address_to_attach_address_callback *address_to_attach_address;
device_size_to_attach_size_callback *size_to_attach_size;
} device_convert_callbacks;
typedef void (device_instance_delete_callback)
(device_instance *instance);
typedef int (device_instance_read_callback)
(device_instance *instance,
void *buf,
unsigned_word len);
typedef int (device_instance_write_callback)
(device_instance *instance,
const void *buf,
unsigned_word len);
typedef int (device_instance_seek_callback)
(device_instance *instance,
unsigned_word pos_hi,
unsigned_word pos_lo);
typedef int (device_instance_method)
(device_instance *instance,
int n_stack_args,
unsigned_cell stack_args[],
int n_stack_returns,
unsigned_cell stack_returns[]);
typedef struct _device_instance_methods {
const char *name;
device_instance_method *method;
} device_instance_methods;
struct _device_instance_callbacks {
device_instance_delete_callback *delete;
device_instance_read_callback *read;
device_instance_write_callback *write;
device_instance_seek_callback *seek;
const device_instance_methods *methods;
};
typedef device_instance *(device_create_instance_callback)
(device *me,
const char *full_path,
const char *args);
typedef device_instance *(package_create_instance_callback)
(device_instance *parent,
const char *args);
typedef int (device_ioctl_callback)
(device *me,
cpu *processor,
unsigned_word cia,
device_ioctl_request request,
va_list ap);
typedef void (device_usage_callback)
(int verbose);
struct _device_callbacks {
device_init_callbacks init;
device_address_callbacks address;
device_io_callbacks io;
device_dma_callbacks dma;
device_interrupt_callbacks interrupt;
device_convert_callbacks convert;
device_create_instance_callback *instance_create;
device_ioctl_callback *ioctl;
device_usage_callback *usage;
};
typedef struct _device_descriptor device_descriptor;
struct _device_descriptor {
const char *name;
device_creator *creator;
const device_callbacks *callbacks;
};
extern const device_descriptor *const device_table[];
#include "hw.h"
extern device_address_callback passthrough_device_address_attach;
extern device_address_callback passthrough_device_address_detach;
extern device_dma_read_buffer_callback passthrough_device_dma_read_buffer;
extern device_dma_write_buffer_callback passthrough_device_dma_write_buffer;
extern device_unit_decode_callback ignore_device_unit_decode;
extern device_init_callback generic_device_init_address;
extern device_unit_decode_callback generic_device_unit_decode;
extern device_unit_encode_callback generic_device_unit_encode;
extern device_address_to_attach_address_callback generic_device_address_to_attach_address;
extern device_size_to_attach_size_callback generic_device_size_to_attach_size;
extern const device_callbacks passthrough_device_callbacks;
#endif