mirror of https://github.com/zeldaret/tmc.git
108 lines
4.9 KiB
C
108 lines
4.9 KiB
C
#ifndef GUARD_GBA_MULTI_BOOT_H
|
|
#define GUARD_GBA_MULTI_BOOT_H
|
|
|
|
#include "types.h"
|
|
|
|
#define MULTIBOOT_NCHILD 3 // Maximum number of slaves
|
|
#define MULTIBOOT_HEADER_SIZE 0xc0 // Header size
|
|
#define MULTIBOOT_SEND_SIZE_MIN 0x100 // Minimum transmission size
|
|
#define MULTIBOOT_SEND_SIZE_MAX 0x40000 // Maximum transmission size
|
|
|
|
struct MultiBootParam {
|
|
u32 system_work[5]; // Can be rewritten within system call.
|
|
// Used with library also.
|
|
u8 handshake_data; // Handshake data from client
|
|
u8 padding;
|
|
u16 handshake_timeout; // Handshake timeout check counter
|
|
u8 probe_count; // If not 0, during client recognition or
|
|
// boot program transfer
|
|
u8 client_data[MULTIBOOT_NCHILD]; // Handshake data from client
|
|
u8 palette_data; // Palette's flashing parameter during load
|
|
// for client
|
|
u8 response_bit; // When high probability that slave
|
|
// connected, 4P-2P: d3-d1 is 1.
|
|
u8 client_bit; // For slave distinguished as client,
|
|
// 4P-2P: d3-d1 is 1.
|
|
u8 reserved1; // Reserved
|
|
const u8* boot_srcp; // Boot program start (after header)
|
|
const u8* boot_endp; // Boot program end pointer
|
|
const u8* masterp; // Pointer to header referenced and output
|
|
// by master
|
|
u8* reserved2[MULTIBOOT_NCHILD]; // Reserved
|
|
u32 system_work2[4]; // Can be rewritten within system call.
|
|
u8 sendflag; // If SC7=1 and during send, not 0
|
|
u8 probe_target_bit; // If target recognized with client,
|
|
// 4P-2P: d3-d1 is 1.
|
|
u8 check_wait; // Wait frame until recoginition with client
|
|
u8 server_type; // client recognize method 0= Low Speed
|
|
// 1= High Speed
|
|
};
|
|
|
|
/* Error Code
|
|
* If value returned by MultiBootMain() is not 0, an error listed
|
|
* below has occurred. However, there is no need to have separate error
|
|
* messages for all error code types.
|
|
* "Communication Error. Please check connection. Retry with START."
|
|
* "Turn off power, check connection, and turn on again."
|
|
* "Slave is not connected."
|
|
* "Cannot recognize the slave."
|
|
* ,etc. Messages easy for the player to understand are good.
|
|
* NO_PROBE_TARGET: When recognizing client all machines returned
|
|
* abnormal data and there is no target.
|
|
* NO_DLREADY: client did not return a download preparations
|
|
* possible message.
|
|
* BOOT_FAILURE: MultiBoot() system call returned an error.
|
|
* HANDSHAKE_FAILURE: Failed to do handshake with master which should
|
|
* occur immediately after boot of slave.
|
|
* (Slave may be in infinite loop, request that power be turned off
|
|
* and on again.)
|
|
*/
|
|
#define MULTIBOOT_ERROR_04 0x04
|
|
#define MULTIBOOT_ERROR_08 0x08
|
|
#define MULTIBOOT_ERROR_0c 0x0c
|
|
#define MULTIBOOT_ERROR_40 0x40
|
|
#define MULTIBOOT_ERROR_44 0x44
|
|
#define MULTIBOOT_ERROR_48 0x48
|
|
#define MULTIBOOT_ERROR_4c 0x4c
|
|
#define MULTIBOOT_ERROR_80 0x80
|
|
#define MULTIBOOT_ERROR_84 0x84
|
|
#define MULTIBOOT_ERROR_88 0x88
|
|
#define MULTIBOOT_ERROR_8c 0x8c
|
|
#define MULTIBOOT_ERROR_NO_PROBE_TARGET 0x50
|
|
#define MULTIBOOT_ERROR_NO_DLREADY 0x60
|
|
#define MULTIBOOT_ERROR_BOOT_FAILURE 0x70
|
|
#define MULTIBOOT_ERROR_HANDSHAKE_FAILURE 0x71
|
|
|
|
/* After an error, or when a value other than 0xffff is returned,
|
|
* the avoid chattering wait(frames) until redo connection check.
|
|
* The client timeout is about 11 frames so use value sufficiently
|
|
* longer than this.
|
|
* Usually during this time the MASTER_INFO is sent, but when there
|
|
* is a system call error, nothing is sent at this time and it waits.
|
|
* Then, during this time period MASTER_INFO is sent.
|
|
*/
|
|
#define MULTIBOOT_CONNECTION_CHECK_WAIT 15
|
|
|
|
/* Recognition of Slave
|
|
* Value set in MultiBootParam structure member server_type
|
|
* MULTIBOOT_SERVER_TYPE_NORMAL: Slow speed recognition mode
|
|
* The MultiBootMain() function communicates 2 bytes with one call.
|
|
* Therefore, processing returns from MultiBootMain() function
|
|
* in short time.
|
|
* MULTIBOOT_SERVER_TYPE_QUICK: High speed recognition mode
|
|
* In MultiBootMain() function as many consecutive communications
|
|
* are done as possible.
|
|
* Therefore, processing may not return from MultiBootMain() for
|
|
* several dozen frames.
|
|
* During this time, there is no problem if processing for sound and
|
|
* display cannot be done. If processing for sound and display is
|
|
* done with timer interrupt processing, you can use.
|
|
*/
|
|
#define MULTIBOOT_SERVER_TYPE_NORMAL 0
|
|
#define MULTIBOOT_SERVER_TYPE_QUICK 1
|
|
|
|
/* Timeout for slave's final start up check 400 frames */
|
|
#define MULTIBOOT_HANDSHAKE_TIMEOUT 400
|
|
|
|
#endif // GUARD_GBA_MULTI_BOOT_H
|