147 lines
4.2 KiB
C
147 lines
4.2 KiB
C
#ifndef EMU_LPT_H
|
|
#define EMU_LPT_H
|
|
|
|
#define LPT1_ADDR 0x0378
|
|
#define LPT1_IRQ 7
|
|
#define LPT2_ADDR 0x0278
|
|
#define LPT2_IRQ 5
|
|
// LPT 1 on machines when installed
|
|
#define LPT_MDA_ADDR 0x03bc
|
|
#define LPT_MDA_IRQ 7
|
|
#define LPT4_ADDR 0x0268
|
|
#define LPT4_IRQ 5
|
|
#if 0
|
|
#define LPT5_ADDR 0x027c
|
|
#define LPT5_IRQ 7
|
|
#define LPT6_ADDR 0x026c
|
|
#define LPT6_IRQ 5
|
|
#endif
|
|
|
|
typedef struct lpt_device_s {
|
|
const char *name;
|
|
const char *internal_name;
|
|
|
|
void *(*init)(void *lpt);
|
|
void (*close)(void *priv);
|
|
void (*write_data)(uint8_t val, void *priv);
|
|
void (*write_ctrl)(uint8_t val, void *priv);
|
|
void (*autofeed)(uint8_t val,void *priv);
|
|
void (*strobe)(uint8_t old, uint8_t val,void *priv);
|
|
uint8_t (*read_status)(void *priv);
|
|
uint8_t (*read_ctrl)(void *priv);
|
|
void (*epp_write_data)(uint8_t is_addr, uint8_t val, void *priv);
|
|
void (*epp_request_read)(uint8_t is_addr, void *priv);
|
|
|
|
void *priv;
|
|
struct lpt_t *lpt;
|
|
//#ifdef EMU_DEVICE_H
|
|
// struct device_t *cfgdevice;
|
|
//#else
|
|
void *cfgdevice;
|
|
//#endif
|
|
} lpt_device_t;
|
|
|
|
#ifdef _TIMER_H_
|
|
typedef struct lpt_t {
|
|
uint8_t enabled;
|
|
uint8_t irq;
|
|
uint8_t irq_state;
|
|
uint8_t dma;
|
|
uint8_t dat;
|
|
uint8_t ctrl;
|
|
uint8_t ext;
|
|
uint8_t epp;
|
|
uint8_t ecp;
|
|
uint8_t ecr;
|
|
uint8_t in_dat;
|
|
uint8_t fifo_stat;
|
|
uint8_t dma_stat;
|
|
uint8_t state;
|
|
uint8_t autofeed;
|
|
uint8_t strobe;
|
|
uint8_t lv2;
|
|
uint8_t cnfga_readout;
|
|
uint8_t inst;
|
|
uint8_t pad[5];
|
|
uint16_t addr;
|
|
uint16_t id;
|
|
uint16_t pad0[2];
|
|
int enable_irq;
|
|
lpt_device_t *dt;
|
|
#ifdef FIFO_H
|
|
fifo16_t * fifo;
|
|
#else
|
|
void * fifo;
|
|
#endif
|
|
|
|
pc_timer_t fifo_out_timer;
|
|
} lpt_t;
|
|
#endif /* _TIMER_H_ */
|
|
|
|
typedef struct lpt_port_s {
|
|
uint8_t enabled;
|
|
|
|
int device;
|
|
} lpt_port_t;
|
|
|
|
extern lpt_port_t lpt_ports[PARALLEL_MAX];
|
|
|
|
typedef enum {
|
|
LPT_STATE_IDLE = 0,
|
|
LPT_STATE_READ_DMA,
|
|
LPT_STATE_WRITE_FIFO
|
|
} lpt_state_t;
|
|
|
|
extern void lpt_write(uint16_t port, uint8_t val, void *priv);
|
|
|
|
extern void lpt_write_to_fifo(void *priv, uint8_t val);
|
|
|
|
extern uint8_t lpt_read(uint16_t port, void *priv);
|
|
|
|
extern uint8_t lpt_read_port(lpt_t *dev, uint16_t reg);
|
|
|
|
extern uint8_t lpt_read_status(lpt_t *dev);
|
|
extern void lpt_irq(void *priv, int raise);
|
|
|
|
extern int lpt_device_get_from_internal_name(const char *str);
|
|
|
|
extern const char *lpt_device_get_name(int id);
|
|
extern const char *lpt_device_get_internal_name(int id);
|
|
|
|
#ifdef EMU_DEVICE_H
|
|
extern const device_t *lpt_device_getdevice(const int id);
|
|
#endif
|
|
|
|
extern int lpt_device_has_config(const int id);
|
|
|
|
extern const lpt_device_t lpt_dac_device;
|
|
extern const lpt_device_t lpt_dac_stereo_device;
|
|
|
|
extern const lpt_device_t dss_device;
|
|
|
|
extern const lpt_device_t lpt_hasp_savquest_device;
|
|
|
|
extern void lpt_set_ext(lpt_t *dev, uint8_t ext);
|
|
extern void lpt_set_ecp(lpt_t *dev, uint8_t ecp);
|
|
extern void lpt_set_epp(lpt_t *dev, uint8_t epp);
|
|
extern void lpt_set_lv2(lpt_t *dev, uint8_t lv2);
|
|
extern void lpt_set_fifo_threshold(lpt_t *dev, int threshold);
|
|
extern void lpt_set_cnfga_readout(lpt_t *dev, const uint8_t cnfga_readout);
|
|
extern void lpt_port_setup(lpt_t *dev, uint16_t port);
|
|
extern void lpt_port_irq(lpt_t *dev, uint8_t irq);
|
|
extern void lpt_port_dma(lpt_t *dev, uint8_t dma);
|
|
extern void lpt_port_remove(lpt_t *dev);
|
|
extern void lpt1_remove_ams(lpt_t *dev);
|
|
|
|
extern void lpt_devices_init(void);
|
|
extern void lpt_devices_close(void);
|
|
|
|
extern void lpt_set_next_inst(int ni);
|
|
extern void lpt_set_3bc_used(int is_3bc_used);
|
|
|
|
extern void lpt_standalone_init(void);
|
|
|
|
extern const device_t lpt_port_device;
|
|
|
|
#endif /*EMU_LPT_H*/
|