basically finished, but EmuTOS does not seem to like it yet...

This commit is contained in:
Markus Fröschle
2013-05-05 17:10:48 +00:00
parent 31108b04b4
commit 159e6e3bc1

View File

@@ -65,74 +65,78 @@
#define XH_TARGET_STOPPED (1 << 30) #define XH_TARGET_STOPPED (1 << 30)
#define XH_TARGET_RESERVED (1 << 31) #define XH_TARGET_RESERVED (1 << 31)
/* typedef struct _BPB
* FIXME: dangerous TRAP here! {
* uint16_t recsiz; /* Bytes per sector */
* all of these functions get compiled into BaS with "normal" GCC integers (32 bit). However, since they will be called uint16_t clsiz; /* Sectors per cluster */
* from code compiled with -mshort, integers must be declared uint32_t for those compilation units to adhere uint16_t clsizb; /* Bytes per cluster */
* to "normal" GCC calling conventions. uint16_t rdlen; /* Directory length */
* uint16_t fsiz; /* Length of the FAT */
* This is ugly and slow (all stack frames from -mshort compiled code need to be rearranged for "normal" uint16_t fatrec; /* Start of the 2nd FAT */
* calling conventions), but that's the way it currently is... uint16_t datrec; /* 1st free sector */
* uint16_t numcl; /* Total numbr of clusters */
*/ uint16_t bflags; /* Flags as bit-vector */
#ifdef __MSHORT__ /* Bit 0: 0 (12-Bit-FAT), 1 16-Bit-FAT */
#define UINT16_T uint32_t /* Bit 1: 0 (two FATs), 1 (one FAT) */
#else /* only available since TOS 2.06 */
#define UINT16_T uint16_t } BPB;
#endif
/* a riddle: how do you typedef a function pointer to a function that returns its own type? ;) */ /* a riddle: how do you typedef a function pointer to a function that returns its own type? ;) */
typedef void* (*xhdi_call_fun)(int xhdi_fun, ...); typedef void* (*xhdi_call_fun)(int xhdi_fun, ...);
extern uint32_t xhdi_call(int xhdi_fun, ...); struct XHDICALL_args
{
uint16_t opcode;
} __attribute__((packed));
extern uint32_t xhdi_call(struct XHDICALL_args *stack);
extern xhdi_call_fun xhdi_sd_install(xhdi_call_fun old_vector) __attribute__((__interrupt__)); extern xhdi_call_fun xhdi_sd_install(xhdi_call_fun old_vector) __attribute__((__interrupt__));
extern uint32_t xhdi_version(void); /* XHDI 0 */ extern uint16_t xhdi_version(void); /* XHDI 0 */
extern uint32_t xhdi_inquire_target(UINT16_T major, UINT16_T minor, uint32_t *block_size, uint32_t *flags, extern uint32_t xhdi_inquire_target(uint16_t major, uint16_t minor, uint32_t *block_size, uint32_t *flags,
char *product_name); /* XHDI 1 */ char *product_name); /* XHDI 1 */
extern uint32_t xhdi_reserve(UINT16_T major, UINT16_T minor, UINT16_T do_reserve, UINT16_T key); /* XHDI 2 */ extern uint32_t xhdi_reserve(uint16_t major, uint16_t minor, uint16_t do_reserve, uint16_t key); /* XHDI 2 */
extern uint32_t xhdi_lock(UINT16_T major, UINT16_T minor, UINT16_T do_lock, UINT16_T key); /* XHDI 3 */ extern uint32_t xhdi_lock(uint16_t major, uint16_t minor, uint16_t do_lock, uint16_t key); /* XHDI 3 */
extern uint32_t xhdi_stop(UINT16_T major, UINT16_T minor, UINT16_T do_stop, UINT16_T key); /* XHDI 4 */ extern uint32_t xhdi_stop(uint16_t major, uint16_t minor, uint16_t do_stop, uint16_t key); /* XHDI 4 */
extern uint32_t xhdi_eject(UINT16_T major, UINT16_T minor, UINT16_T do_eject, UINT16_T key); /* XHDI 5 */ extern uint32_t xhdi_eject(uint16_t major, uint16_t minor, uint16_t do_eject, uint16_t key); /* XHDI 5 */
extern uint32_t xhdi_drivemap(void); /* XHDI 6 */ extern uint32_t xhdi_drivemap(void); /* XHDI 6 */
extern uint32_t xhdi_inquire_device(UINT16_T bios_device, UINT16_T *major, UINT16_T *minor, extern uint32_t xhdi_inquire_device(uint16_t bios_device, uint16_t *major, uint16_t *minor,
uint32_t *start_sector, /* BPB */ void *bpb); /* XHDI 7 */ uint32_t *start_sector, /* BPB */ void *bpb); /* XHDI 7 */
extern uint32_t xhdi_inquire_driver(UINT16_T bios_device, char *name, char *version, extern uint32_t xhdi_inquire_driver(uint16_t bios_device, char *name, char *version,
char *company, UINT16_T *ahdi_version, UINT16_T *maxIPL); /* XHDI 8 */ char *company, uint16_t *ahdi_version, uint16_t *maxIPL); /* XHDI 8 */
extern uint32_t xhdi_new_cookie(void *newcookie); /* XHDI 9 */ extern uint32_t xhdi_new_cookie(uint32_t newcookie); /* XHDI 9 */
extern uint32_t xhdi_read_write(UINT16_T major, UINT16_T minor, UINT16_T rwflag, extern uint32_t xhdi_read_write(uint16_t major, uint16_t minor, uint16_t rwflag,
uint32_t recno, UINT16_T count, void *buf); /* XHDI 10 */ uint32_t recno, uint16_t count, void *buf); /* XHDI 10 */
extern uint32_t xhdi_inquire_target2(UINT16_T major, UINT16_T minor, uint32_t *block_size, extern uint32_t xhdi_inquire_target2(uint16_t major, uint16_t minor, uint32_t *block_size,
uint32_t *device_flags, char *product_name, UINT16_T stringlen); /* XHDI 11 */ uint32_t *device_flags, char *product_name, uint16_t stringlen); /* XHDI 11 */
extern uint32_t xhdi_inquire_device2(UINT16_T bios_device, UINT16_T *major, UINT16_T *minor, extern uint32_t xhdi_inquire_device2(uint16_t bios_device, uint16_t *major, uint16_t *minor,
UINT16_T *start_sector, /* BPB */ void *bpb, uint32_t *blocks, char *partid); /* XHDI 12 */ uint32_t *start_sector, BPB *bpb, uint32_t *blocks, char *partid); /* XHDI 12 */
extern uint32_t xhdi_driver_special(uint32_t key1, uint32_t key2, UINT16_T subopcode, void *data); /* XHDI 13 */ extern uint32_t xhdi_driver_special(uint32_t key1, uint32_t key2, uint16_t subopcode, void *data); /* XHDI 13 */
extern uint32_t xhdi_get_capacity(UINT16_T major, UINT16_T minor, uint32_t *blocks, uint32_t *bs); /* XHDI 14 */ extern uint32_t xhdi_get_capacity(uint16_t major, uint16_t minor, uint32_t *blocks, uint32_t *bs); /* XHDI 14 */
extern uint32_t xhdi_medium_changed(UINT16_T major, UINT16_T minor); /* XHDI 15 */ extern uint32_t xhdi_medium_changed(uint16_t major, uint16_t minor); /* XHDI 15 */
extern uint32_t xhdi_mint_info(UINT16_T opcode, void *data); /* XHDI 16 */ extern uint32_t xhdi_mint_info(uint16_t opcode, void *data); /* XHDI 16 */
extern uint32_t xhdi_dos_limits(UINT16_T which, uint32_t limit); /* XHDI 17 */ extern uint32_t xhdi_dos_limits(uint16_t which, uint32_t limit); /* XHDI 17 */
extern uint32_t xhdi_last_access(UINT16_T major, UINT16_T minor, uint32_t *ms); /* XHDI 18 */ extern uint32_t xhdi_last_access(uint16_t major, uint16_t minor, uint32_t *ms); /* XHDI 18 */
extern uint32_t xhdi_reaccess(UINT16_T major, UINT16_T minor); /* XHDI 19 */ extern uint32_t xhdi_reaccess(uint16_t major, uint16_t minor); /* XHDI 19 */
#endif /* _XHDI_SD_H_ */ #endif /* _XHDI_SD_H_ */