analog-utilities/src/v2analog.h

130 lines
3.0 KiB
C

#ifndef __V2ANALOG_H
#define __V2ANALOG_H
#define CARD_REGISTER(n) (*(volatile unsigned char *)(0xC080 | (n) | (cardslot << 4)))
#define VGA_MONOMODE CARD_REGISTER(0x1)
#define VGA_TBCOLOR CARD_REGISTER(0x2)
#define VGA_BORDER CARD_REGISTER(0x3)
#define CF_PTRL *((volatile unsigned char *)(0xC0EC | (cardslot << 8)))
#define CF_PTRH *((volatile unsigned char *)(0xC0ED | (cardslot << 8)))
#define CF_DATR *((volatile unsigned char *)(0xC0EE | (cardslot << 8)))
#define CF_DATW *((volatile unsigned char *)(0xC0EF | (cardslot << 8)))
#define CMD_BUFFER ((volatile unsigned char *)(0xC0F0 | (cardslot << 8)))
#define RPY_BUFFER ((volatile unsigned char *)(0xC0F8 | (cardslot << 8)))
#define REPLY_OK 0x00
#define REPLY_BUSY 0xBB
#define REPLY_EOF 0x01
#define REPLY_NOFILE 0x02
#define REPLY_EPARAM 0x03
#define REPLY_ECMD 0x04
typedef enum {
MODE_REBOOT = 0,
MODE_DIAG,
MODE_FS,
MODE_VGACARD,
MODE_APPLICARD,
MODE_SERIAL,
MODE_PARALLEL,
MODE_MIDI,
MODE_SNESMAX,
MODE_ETHERNET
} v2mode_t;
typedef enum {
SERIAL_LOOP = 0,
SERIAL_USB,
SERIAL_WIFI,
SERIAL_PRINTER,
} serialmux_t;
typedef enum {
USB_HOST_CDC,
USB_GUEST_CDC,
USB_GUEST_MIDI,
} usbmux_t;
typedef enum {
WIFI_CLIENT = 0,
WIFI_AP,
} wifimode_t;
typedef enum {
MACHINE_AUTO = 0,
MACHINE_APPLE_II = 1,
MACHINE_APPLE_IIE = 2,
MACHINE_APPLE_IIGS = 3,
MACHINE_PRAVETZ = 4,
MACHINE_BASIS = 5,
MACHINE_MAXVALUE = 6
} compat_t;
void hexprint(volatile uint8_t *buf, int size) {
while(size--) {
cprintf("%2X ", *buf++);
}
}
int cfg_cmd3(char *cmd, uint16_t param0, uint16_t param1, uint16_t param2) {
uint16_t timeout = 0x1fff;
#if 0
gotoy(16); gotox(8);
cputc(cmd[0]);
cputc(cmd[1]);
cprintf(" $%04X $%04X $%04X", param0, param1, param2);
#endif
RPY_BUFFER[7] = 0xFF;
CMD_BUFFER[7] = (param2 >> 8) & 0xFF;
RPY_BUFFER[6] = 0xFF;
CMD_BUFFER[6] = param2 & 0xFF;
RPY_BUFFER[5] = 0xFF;
CMD_BUFFER[5] = (param1 >> 8) & 0xFF;
RPY_BUFFER[4] = 0xFF;
CMD_BUFFER[4] = param1 & 0xFF;
RPY_BUFFER[3] = 0xFF;
CMD_BUFFER[3] = (param0 >> 8) & 0xFF;
RPY_BUFFER[2] = 0xFF;
CMD_BUFFER[2] = param0 & 0xFF;
RPY_BUFFER[1] = 0xFF;
CMD_BUFFER[1] = cmd[1];
RPY_BUFFER[0] = 0xFF;
CMD_BUFFER[0] = cmd[0];
// Wait for the command to start processing
while(RPY_BUFFER[0] == 0xFF) {
if(timeout > 0) timeout--;
}
// Wait while the command is processing
while(RPY_BUFFER[0] == REPLY_BUSY) {
if(timeout > 0) timeout--;
}
#if 0
gotoy(18); gotox(8);
hexprint(RPY_BUFFER, 8);
#endif
return (timeout == 0) || (RPY_BUFFER[0] != REPLY_OK);
}
int cfg_cmd2(char *cmd, uint16_t param0, uint16_t param1) {
return cfg_cmd3(cmd, param0, param1, 0);
}
int cfg_cmd1(char *cmd, uint16_t param0) {
return cfg_cmd3(cmd, param0, 0, 0);
}
int cfg_cmd0(char *cmd) {
return cfg_cmd3(cmd, 0, 0, 0);
}
#endif /* __V2ANALOG_H */