#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <exec/types.h>
#include <exec/io.h>
#include <exec/execbase.h>
#include <exec/nodes.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <workbench/workbench.h>
#include <workbench/startup.h>
#include <devices/trackdisk.h>
#include <devices/scsidisk.h>
#include <devices/timer.h>
#include <devices/inputevent.h>
#include <libraries/dos.h>
#include <libraries/commodities.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/commodities_protos.h>
#include <clib/wb_protos.h>
#include <clib/intuition_protos.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <graphics/displayinfo.h>

#define VERSION "1.22"

#define BYTES_PER_LINE  16
#define SENSE_LEN 252
#define MAX_DATA_LEN 252
#define MAX_TOC_LEN 804    /* max TOC size = 100 TOC track descriptors */
#define PAD 0
#define  LINE_BUF (128)
#define NUM_OF_CDDAFRAMES 75  /* 75 frames per second audio */
#define CDDALEN 2448    /* 1 frame has max. 2448 bytes (subcode 2) */

#define OFFS_KEY 2
#define OFFS_CODE 12

typedef struct MsgPort MSGPORT;
typedef struct IOStdReq IOSTDREQ;
typedef struct List LIST;
typedef struct Node NODE;
typedef struct SCSICmd SCSICMD;

typedef struct
 {
   BYTE   code;
   UBYTE  *ptr;
 } IDTOSTRING;

typedef struct
 {
   UBYTE  opcode;
   UBYTE  b1;
   UBYTE  b2;
   UBYTE  b3;
   UBYTE  b4;
   UBYTE  control;
 } SCSICMD6;

typedef struct
 {
   UBYTE  opcode;
   UBYTE  b1;
   UBYTE  b2;
   UBYTE  b3;
   UBYTE  b4;
   UBYTE  b5;
   UBYTE  b6;
   UBYTE  b7;
   UBYTE  b8;
   UBYTE  control;
 } SCSICMD10;

typedef struct
 {
   UBYTE  opcode;
   UBYTE  b1;
   UBYTE  b2;
   UBYTE  b3;
   UBYTE  b4;
   UBYTE  b5;
   UBYTE  b6;
   UBYTE  b7;
   UBYTE  b8;
   UBYTE  b9;
   UBYTE  b10;
   UBYTE  control;
 } SCSICMD12;

#define  SCSI_CMD_TUR   0x00
#define  SCSI_CMD_RZU   0x01
#define  SCSI_CMD_RQS   0x03
#define  SCSI_CMD_FMU   0x04
#define  SCSI_CMD_RAB   0x07
#define  SCSI_CMD_RD 0x08
#define  SCSI_CMD_WR 0x0A
#define  SCSI_CMD_SK 0x0B
#define  SCSI_CMD_INQ   0x12
#define  SCSI_CMD_MSL   0x15
#define  SCSI_CMD_RU 0x16
#define  SCSI_CMD_RLU   0x17
#define  SCSI_CMD_MSE   0x1A
#define  SCSI_CMD_SSU   0x1B
#define  SCSI_CMD_RDI   0x1C
#define  SCSI_CMD_SDI   0x1D
#define SCSI_CMD_PAMR   0x1E
#define  SCSI_CMD_RCP   0x25
#define  SCSI_CMD_RXT   0x28
#define  SCSI_CMD_WXT   0x2A
#define  SCSI_CMD_SKX   0x2B
#define  SCSI_CMD_WVF   0x2E
#define  SCSI_CMD_VF 0x2F
#define  SCSI_CMD_RDD   0x37
#define  SCSI_CMD_WDB   0x3B
#define  SCSI_CMD_RDB   0x3C

#define SCSI_CMD_COPY      0x18
#define SCSI_CMD_COMPARE   0x39
#define SCSI_CMD_COPYANDVERIFY   0x3A
#define SCSI_CMD_CHGEDEF   0x40
#define SCSI_CMD_READSUBCHANNEL  0x42
#define SCSI_CMD_READTOC   0x43
#define SCSI_CMD_READHEADER   0x44
#define SCSI_CMD_PLAYAUDIO12  0xA5
#define SCSI_CMD_PLAYAUDIOTRACKINDEX   0x48
#define SCSI_CMD_PAUSERESUME    0x4B

extern struct Screen *Scr;
extern struct Window *MainWnd;
extern struct TextAttr topaz8;
extern APTR VisualInfo;

extern UBYTE TOC_NumTracks;
extern UBYTE TOC_Flags[];
extern ULONG TOC_Addr[];
extern char *TOC_Title[];
extern char *TOC_CDTitle;
extern char *TOC_CDInterpret;
extern char  TOC_TitleStrs[];
extern char  TOC_CDID[];
extern char  SongPath[128];
extern BYTE  Program[100][9];
extern char  FontName[];
extern UWORD offy;
