b43047a20f
On Sparc and PowerMac, the bit 0 of the address selects the register type (control or data) and bit 1 selects the channel (B or A). On m68k Macintosh and NeXTcube, the bit 0 selects the channel and bit 1 the register type. This patch introduces a new parameter (bit_swap) to the device interface to indicate bits usage must be swapped between registers and channels. For the moment all the machines use the bit 0, but this change will be needed to emulate the Quadra 800 or NeXTcube machine. Signed-off-by: Laurent Vivier <laurent@vivier.eu> Reviewed-by: Hervé Poussineau <hpoussin@reactos.org> [thh: added NeXTcube to the patch description] Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20190831074519.32613-5-huth@tuxfamily.org> Signed-off-by: Thomas Huth <huth@tuxfamily.org>
61 lines
1.3 KiB
C
61 lines
1.3 KiB
C
#ifndef HW_ESCC_H
|
|
#define HW_ESCC_H
|
|
|
|
#include "chardev/char-fe.h"
|
|
#include "chardev/char-serial.h"
|
|
#include "hw/sysbus.h"
|
|
#include "ui/input.h"
|
|
|
|
/* escc.c */
|
|
#define TYPE_ESCC "escc"
|
|
#define ESCC_SIZE 4
|
|
|
|
#define ESCC(obj) OBJECT_CHECK(ESCCState, (obj), TYPE_ESCC)
|
|
|
|
typedef enum {
|
|
escc_chn_a, escc_chn_b,
|
|
} ESCCChnID;
|
|
|
|
typedef enum {
|
|
escc_serial, escc_kbd, escc_mouse,
|
|
} ESCCChnType;
|
|
|
|
#define ESCC_SERIO_QUEUE_SIZE 256
|
|
|
|
typedef struct {
|
|
uint8_t data[ESCC_SERIO_QUEUE_SIZE];
|
|
int rptr, wptr, count;
|
|
} ESCCSERIOQueue;
|
|
|
|
#define ESCC_SERIAL_REGS 16
|
|
typedef struct ESCCChannelState {
|
|
qemu_irq irq;
|
|
uint32_t rxint, txint, rxint_under_svc, txint_under_svc;
|
|
struct ESCCChannelState *otherchn;
|
|
uint32_t reg;
|
|
uint8_t wregs[ESCC_SERIAL_REGS], rregs[ESCC_SERIAL_REGS];
|
|
ESCCSERIOQueue queue;
|
|
CharBackend chr;
|
|
int e0_mode, led_mode, caps_lock_mode, num_lock_mode;
|
|
int disabled;
|
|
int clock;
|
|
uint32_t vmstate_dummy;
|
|
ESCCChnID chn; /* this channel, A (base+4) or B (base+0) */
|
|
ESCCChnType type;
|
|
uint8_t rx, tx;
|
|
QemuInputHandlerState *hs;
|
|
} ESCCChannelState;
|
|
|
|
typedef struct ESCCState {
|
|
SysBusDevice parent_obj;
|
|
|
|
struct ESCCChannelState chn[2];
|
|
uint32_t it_shift;
|
|
bool bit_swap;
|
|
MemoryRegion mmio;
|
|
uint32_t disabled;
|
|
uint32_t frequency;
|
|
} ESCCState;
|
|
|
|
#endif
|