view frbl/reconst/command.c @ 401:4b6b595ae0a0

compal/boot/code-deriv: new analysis
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 14 Jan 2023 23:59:23 +0000
parents b5b8df53aa51
children
line wrap: on
line source

#include "main/sys_types.h"
#include "command.h"

long
com_analyze_request(SYS_UWORD8 *request_received, t_com_request *request)
{
	SYS_WORD32 sp8;
	long sp12 = COM_SUCCESS;
	SYS_UWORD32 sp16, sp20;
	SYS_UWORD8 sp24;
	SYS_UWORD16 *sp28;
	SYS_UWORD16 sp32, sp34, sp36, sp38, sp40, sp42, sp44, sp46;

	sp20 = *request_received++;
	COM_COMMAND_WORD(request) = *request_received++;
	sp16 = 1;
	switch (COM_COMMAND_WORD(request)) {
	case COM_READ_PARAMETERS:	/* 0x26 */
		sp16 += 2;
		sp34 = *request_received++;
		sp32 = *request_received++;
		COM_READ_PARAMS_OFFSET(request) = (sp34 << 8) + sp32;
		sp16 += 1;
		sp24 = *request_received++;
		COM_NUMBER_OF_PARAMS_READ(request) = sp24;
		if (sp24 > COM_MAX_NUMBER_OF_16BITS_DATA)
			sp12 = COM_PARAMETER_ERROR;
		break;
	case COM_WRITE_PARAMETERS:	/* 0x7a */
		sp16 += 2;
		sp34 = *request_received++;
		sp32 = *request_received++;
		COM_WRITTEN_PARAMS_OFFSET(request) = (sp34 << 8) + sp32;
		sp16 += 1;
		sp24 = *request_received++;
		COM_NUMBER_OF_PARAMS_WRITTEN(request) = sp24;
		if (sp24 > COM_MAX_NUMBER_OF_16BITS_DATA) {
			sp12 = COM_PARAMETER_ERROR;
			break;
		}
		sp28 = COM_WRITTEN_PARAMS_LIST_ADDRESS(request);
		for (sp8 = 0; sp8 < sp24; sp8++) {
			sp38 = *request_received++;
			sp36 = *request_received++;
			*sp28++ = (sp38 << 8) + sp36;
			sp16 += 2;
		}
		break;
	case COM_SEND_RUN_ADDRESS:	/* 0x11e */
		sp16 += 2;
		sp40 = *request_received++;
		sp42 = *request_received++;
		COM_ADDRESS_MSB(request) = (sp40 << 8) + sp42;
		sp16 += 2;
		sp44 = *request_received++;
		sp46 = *request_received++;
		COM_ADDRESS_LSB(request) = (sp44 << 8) + sp46;
		break;
	case COM_GET_MONITOR_ID:
	case COM_GET_FLASH_ID:
	case COM_GET_CHIP_ID:
	case COM_GET_BOARD_ID:
	case COM_ERASE_FLASH:
	case COM_WRITE_DATA:
	case COM_START_APPLICATION:
	case COM_LOAD_APPLICATION:
		break;
	default:
		sp12 = COM_COMMAND_UNKNOWN;
	}
	if (sp20 != sp16)
		sp12 = COM_PARAMETER_ERROR;
	return sp12;
}

long
com_build_confirmation(t_com_confirmation *confirmation,
			SYS_UWORD8 *confirmation_to_send)
{
	SYS_WORD32 sp8;
	long sp12 = COM_SUCCESS;
	SYS_UWORD8 sp16;
	SYS_UWORD8 *sp20;
	SYS_UWORD8 sp24;
	SYS_UWORD16 *sp28;
	SYS_UWORD16 sp32;

	sp20 = confirmation_to_send++;
	*confirmation_to_send++ = COM_COMMAND_WORD(confirmation);
	sp16 = 1;
	*confirmation_to_send++ = COM_RESULT(confirmation);
	sp16++;
	switch (COM_COMMAND_WORD(confirmation)) {
	case COM_GET_MONITOR_ID:	/* 0x202 */
		if (COM_RESULT(confirmation))
			break;
		*confirmation_to_send++ = COM_MONITOR_ID(confirmation);
		*confirmation_to_send++ =
				COM_MONITOR_VERSION_FIRST_NBR(confirmation);
		*confirmation_to_send++ =
				COM_MONITOR_VERSION_SECOND_NBR(confirmation);
		sp16 += 3;
		break;
	case COM_GET_FLASH_ID:		/* 0x23c */
		if (COM_RESULT(confirmation))
			break;
		*confirmation_to_send++ = COM_FLASH_ID(confirmation);
		sp16++;
		break;
	case COM_GET_CHIP_ID:		/* 0x25a */
		if (COM_RESULT(confirmation))
			break;
		*confirmation_to_send++ = COM_CHIP_ID(confirmation);
		sp16++;
		break;
	case COM_GET_BOARD_ID:		/* 0x266 */
		if (COM_RESULT(confirmation))
			break;
		*confirmation_to_send++ = COM_BOARD_ID(confirmation);
		sp16++;
		break;
	case COM_ERASE_FLASH:
		break;
	case COM_WRITE_DATA:		/* 0x272 */
		if (COM_RESULT(confirmation))
			break;
		sp32 = COM_FILE_CHECKSUM(confirmation);
		*confirmation_to_send++ = (sp32 & 0xFF00) >> 8;
		*confirmation_to_send++ = sp32 & 0xFF;
		sp32 = COM_FLASH_CHECKSUM(confirmation);
		*confirmation_to_send++ = (sp32 & 0xFF00) >> 8;
		*confirmation_to_send++ = sp32 & 0xFF;
		sp16 += 4;
		break;
	case COM_START_APPLICATION:	/* 0x2dc */
		if (COM_RESULT(confirmation))
			break;
		*confirmation_to_send++ = COM_STARTING_STATE(confirmation);
		sp16++;
		break;
	case COM_READ_PARAMETERS:	/* 0x2e8 */
		if (COM_RESULT(confirmation))
			break;
		sp16++;
		sp24 = COM_NUMBER_OF_PARAMS_READ(confirmation);
		*confirmation_to_send++ = sp24;
		if (sp24 > COM_MAX_NUMBER_OF_16BITS_DATA) {
			sp12 = COM_PARAMETER_ERROR;
			break;
		}
		sp28 = COM_READ_PARAMS_LIST_ADDRESS(confirmation);
		for (sp8 = 0; sp8 < sp24; sp8++) {
			*confirmation_to_send++ = (*sp28 & 0xFF00) >> 8;
			*confirmation_to_send++ = *sp28++ & 0xFF;
			sp16 += 2;
		}
		break;
	case COM_WRITE_PARAMETERS:
		break;
	case COM_LOAD_APPLICATION:	/* 0x374 */
		if (COM_RESULT(confirmation))
			break;
		sp32 = COM_FILE_RAM_CHECKSUM(confirmation);
		*confirmation_to_send++ = (sp32 & 0xFF00) >> 8;
		*confirmation_to_send++ = sp32 & 0xFF;
		sp32 = COM_RAM_CHECKSUM(confirmation);
		*confirmation_to_send++ = (sp32 & 0xFF00) >> 8;
		*confirmation_to_send++ = sp32 & 0xFF;
		sp16 += 4;
		break;
	case COM_SEND_RUN_ADDRESS:
		break;
	default:
		sp12 = COM_COMMAND_UNKNOWN;
	}
	*sp20 = sp16;
	return sp12;
}