
/*************************************************************************
**
** o5protocol.h
** Copyright (c) 1995,1996 Daniel Kahlin <tlr@stacken.kth.se>
**
******/

#define HEADER_FILENAMELEN	24
#define TIMEOUT_FILEWAIT	360

struct o_header {
	UBYTE	ohd_type;
	UBYTE	ohd_subtype;
};


/**************************************************************************
**
** MEMORY TRANSFER
**
** - WRITEMEM
** 1. SEND WMHD
** 2. WAIT FOR RESPONSE
** 3. SEND BODY (channel 1)
** 4. WAIT FOR RESPONSE
**
** - READMEM
** 1. SEND RMHD
** 2. WAIT FOR RESPONSE
** 3. RECEIVE BODY (channel 1)
** 4. SEND OK
**
** - SYS
** 1. SEND SYHD
** 2. WAIT FOR RESPONSE
**
** - RUN
** 1. SEND RUHD
** 2. WAIT FOR RESPONSE
**
******/
#define	TYPE_MEMTRANSFER	0x01

#define	SUB_MT_WRITEMEM		0x01
#define SUB_MT_READMEM		0x02
#define	SUB_MT_SYS				0x03
#define SUB_MT_RUN				0x04

struct wm_header {
	UBYTE	wmhd_type;
	UBYTE	wmhd_subtype;
	UBYTE wmhd_start_l;
	UBYTE wmhd_start_h;
	UBYTE wmhd_end_l;
	UBYTE wmhd_end_h;
};

struct rm_header {
	UBYTE	rmhd_type;
	UBYTE	rmhd_subtype;
	UBYTE rmhd_start_l;
	UBYTE rmhd_start_h;
	UBYTE rmhd_end_l;
	UBYTE rmhd_end_h;
};

struct sy_header {
	UBYTE	syhd_type;
	UBYTE	syhd_subtype;
	UBYTE syhd_pc_l;
	UBYTE syhd_pc_h;
	UBYTE syhd_memory;
	UBYTE syhd_sr;
	UBYTE syhd_ac;
	UBYTE syhd_xr;
	UBYTE syhd_yr;
	UBYTE syhd_sp;
};

struct ru_header {
	UBYTE	ruhd_type;
	UBYTE	ruhd_subtype;
	UBYTE ruhd_lowmem_l;
	UBYTE ruhd_lowmem_h;
	UBYTE ruhd_himem_l;
	UBYTE ruhd_himem_h;
};

/**************************************************************************
**
** DISKCOMMAND
**
** - DIRECTORY
** 1. SEND DRHD
** 2. WAIT FOR RESPONSE
** 3. c64 LOADs FILE
** 4. WAIT FOR RESPONSE + FILESIZE (DRRS)
** 5. SEND OK
** 6. RECEIVE BODY (channel 1)
** 7. SEND OK
**
** - STATUS
** 1. SEND STHD
** 2. WAIT FOR RESPONSE
** 3. READ ONE BLOCK ON CHANNEL 1
** 4. SEND OK
**
** - COMMAND
** 1. SEND CMHD
** 2. WAIT FOR RESPONSE
** 3. SEND ONE BLOCK ON CHANNEL 1
** 4. WAIT FOR RESPONSE
**
******/
#define	TYPE_DISKCOMMAND	0x03

#define	SUB_DC_DIRECTORY	0x01
#define	SUB_DC_STATUS			0x02
#define	SUB_DC_COMMAND		0x03


struct dr_header {
	UBYTE	drhd_type;
	UBYTE	drhd_subtype;
	UBYTE drhd_pad[2];
	UBYTE drhd_device;
	UBYTE drhd_filename[24];
};


struct dr_response {
	UBYTE	drrs_response;
	UBYTE	drrs_len_l;
	UBYTE drrs_len_h;
};

struct st_header {
	UBYTE	sthd_type;
	UBYTE	sthd_subtype;
	UBYTE sthd_pad[2];
	UBYTE sthd_device;
};
struct cm_header {
	UBYTE	cmhd_type;
	UBYTE	cmhd_subtype;
	UBYTE cmhd_pad[2];
	UBYTE cmhd_device;
};


/**************************************************************************
**
** FILE TRANSFER
**
** - WRITEFILE
** 1. SEND WFHD
** 2. WAIT FOR RESPONSE
** 3. SEND BODY (channel 1)
** 4. c64 SAVEs FILE
** 5. WAIT FOR RESPONSE
**
** - READFILE
** 1. SEND RFHD
** 2. WAIT FOR RESPONSE
** 3. c64 LOADs FILE
** 4. WAIT FOR RESPONSE + FILESIZE (RFRS)
** 5. SEND OK
** 6. RECEIVE BODY (channel 1)
** 7. SEND OK
**
******/
#define	TYPE_FILETRANSFER	0x02

#define	SUB_FT_WRITEFILE	0x01
#define	SUB_FT_READFILE		0x02

struct wf_header {
	UBYTE	wfhd_type;
	UBYTE	wfhd_subtype;
	UBYTE wfhd_len_l;
	UBYTE wfhd_len_h;
	UBYTE wfhd_device;
	UBYTE wfhd_filename[24];
};

struct rf_header {
	UBYTE	rfhd_type;
	UBYTE	rfhd_subtype;
	UBYTE rfhd_pad[2];
	UBYTE rfhd_device;
	UBYTE rfhd_filename[24];
};


struct rf_response {
	UBYTE	rfrs_response;
	UBYTE	rfrs_len_l;
	UBYTE rfrs_len_h;
};


/**************************************************************************
**
** RAWDISKTRANSFER
**
** - WRITETRACK
** 1. SEND WTHD
** 2. WAIT FOR RESPONSE
** 3. SEND BODY (channel 1)
** 4. c64 WRITEs TRACK
** 5. WAIT FOR RESPONSE
**
** - READTRACK
** 1. SEND RTHD
** 2. WAIT FOR RESPONSE
** 3. c64 READs TRACK
** 4. WAIT FOR RESPONSE + NUM SECTORS (RTRS)
** 5. SEND OK
** 6. RECEIVE BODY (channel 1)
** 7. SEND OK
**
** - WRITESECTOR
** 1. SEND WSHD
** 2. WAIT FOR RESPONSE
** 3. SEND BODY (channel 1)
** 4. c64 WRITEs SECTOR
** 5. WAIT FOR RESPONSE
**
** - READSECTOR
** 1. SEND RSHD
** 2. WAIT FOR RESPONSE
** 3. c64 READs SECTOR
** 4. WAIT FOR RESPONSE
** 5. RECEIVE BODY (channel 1)
** 6. SEND OK
**
******/
#define	TYPE_RAWDISKTRANSFER 0x06

#define	SUB_RT_WRITETRACK	0x01
#define	SUB_RT_READTRACK 0x02
#define	SUB_RT_WRITESECTOR 0x03
#define	SUB_RT_READSECTOR	0x04

struct wt_header {
	UBYTE	wthd_type;
	UBYTE	wthd_subtype;
	UBYTE wthd_track;
	UBYTE wthd_numtracks;
	UBYTE wthd_device;
};


struct rt_header {
	UBYTE	rthd_type;
	UBYTE	rthd_subtype;
	UBYTE rthd_track;
	UBYTE rthd_numtracks;
	UBYTE rthd_device;
};

struct rt_response {
	UBYTE	rtrs_response;
	UBYTE	rtrs_sectors;
};

struct ws_header {
	UBYTE	wshd_type;
	UBYTE	wshd_subtype;
	UBYTE wshd_track;
	UBYTE wshd_sector;
	UBYTE wshd_device;
};

struct rs_header {
	UBYTE	rshd_type;
	UBYTE	rshd_subtype;
	UBYTE rshd_track;
	UBYTE rshd_sector;
	UBYTE rshd_device;
};


/**************************************************************************
**
** TEST COMMAND
**
******/
#define	TYPE_TESTCOMMAND	0x04

#define	SUB_TC_BLOCKTEST	0x01
#define SUB_TC_FILETEST		0x02

struct bt_header {
	UBYTE	bthd_type;
	UBYTE	bthd_subtype;
};

struct ft_header {
	UBYTE	fthd_type;
	UBYTE	fthd_subtype;
	UBYTE fthd_len_l;
	UBYTE fthd_len_h;
};
struct ft_response {
	UBYTE	ftrs_response;
	UBYTE	ftrs_len_l;
	UBYTE ftrs_len_h;
};




/**************************************************************************
**
** SERVER PROTOCOL
**
** - LOAD
** 1. GOT SRVLDHD
** 2. SEND RESPONSE (OK, NOTSUPPORTED, STRING)+ filelen
** 3. WAIT FOR RESPONSE + newstart (srvldrs2)
** 4. SEND BODY (channel 1)
** 5. WAIT FOR RESPONSE
**
** - SAVE
** 1. GOT SRVSVHD
** 2. SEND RESPONSE (OK, NOTSUPPORTED, STRING)
** 3. RECEIVE BODY (channel 1)
** 4. SEND RESPONSE (OK, NOTSUPPORTED, STRING)
**
** - COMMAND
** 1. GOT SRVCMHD
** 2. SEND RESPONSE (OK, NOTSUPPORTED, STRING)
**
** - READSTRING
** 1. GOT SRVRSHD
** 2. SEND RESPONSE (OK, NOTSUPPORTED, STRING)+ rows
** 3. WAIT FOR OK
** 4. SEND BODY (channel 1)
**
******/
#define	TYPE_SERVER	0x05

#define	SUB_SRV_LOAD 0x01
#define	SUB_SRV_SAVE 0x02
#define	SUB_SRV_COMMAND 0x03
#define	SUB_SRV_READSTRING 0x04

struct srvld_header {
	UBYTE	srvldhd_type;
	UBYTE	srvldhd_subtype;
	UBYTE srvldhd_pad[4];
	UBYTE srvldhd_filename[64];
};

struct srvld_response {
	UBYTE	srvldrs_response;
	UBYTE	srvldrs_start_l;
	UBYTE srvldrs_start_h;
	UBYTE	srvldrs_end_l;
	UBYTE srvldrs_end_h;
};

struct srvld_response2 {
	UBYTE	srvldrs2_response;
	UBYTE	srvldrs2_start_l;
	UBYTE srvldrs2_start_h;
};

struct srvsv_header {
	UBYTE	srvsvhd_type;
	UBYTE	srvsvhd_subtype;
	UBYTE srvsvhd_start_l;
	UBYTE srvsvhd_start_h;
	UBYTE srvsvhd_end_l;
	UBYTE srvsvhd_end_h;
	UBYTE srvsvhd_filename[64];
};


struct srvcm_header {
	UBYTE	srvcmhd_type;
	UBYTE	srvcmhd_subtype;
	UBYTE srvcmhd_pad[4];
	UBYTE srvcmhd_command[64];
};


struct srvrs_header {
	UBYTE	srvrshd_type;
	UBYTE	srvrshd_subtype;
	UBYTE srvrshd_width;
	UBYTE srvrshd_height;
};

struct srvrs_response {
	UBYTE	srvrsrs_response;
	UBYTE	srvrsrs_rows;
};

#define SRVRS_MOREMASK	0x80

/**************************************************************************
**
** RESPONSE CODES
**
******/
#define	RESP_OK						0x80
#define	RESP_NOTSUPPORTED	0x81
#define	RESP_ERROR				0x82
#define	RESP_STRING				0x83
