diff --git a/BaS_gcc/include/xhdi_sd.h b/BaS_gcc/include/xhdi_sd.h index c5d6eff..b7dc772 100644 --- a/BaS_gcc/include/xhdi_sd.h +++ b/BaS_gcc/include/xhdi_sd.h @@ -65,74 +65,78 @@ #define XH_TARGET_STOPPED (1 << 30) #define XH_TARGET_RESERVED (1 << 31) -/* - * FIXME: dangerous TRAP here! - * - * all of these functions get compiled into BaS with "normal" GCC integers (32 bit). However, since they will be called - * from code compiled with -mshort, integers must be declared uint32_t for those compilation units to adhere - * to "normal" GCC calling conventions. - * - * This is ugly and slow (all stack frames from -mshort compiled code need to be rearranged for "normal" - * calling conventions), but that's the way it currently is... - * - */ -#ifdef __MSHORT__ -#define UINT16_T uint32_t -#else -#define UINT16_T uint16_t -#endif +typedef struct _BPB +{ + uint16_t recsiz; /* Bytes per sector */ + uint16_t clsiz; /* Sectors per cluster */ + uint16_t clsizb; /* Bytes per cluster */ + uint16_t rdlen; /* Directory length */ + uint16_t fsiz; /* Length of the FAT */ + uint16_t fatrec; /* Start of the 2nd FAT */ + uint16_t datrec; /* 1st free sector */ + uint16_t numcl; /* Total numbr of clusters */ + uint16_t bflags; /* Flags as bit-vector */ + /* Bit 0: 0 (12-Bit-FAT), 1 16-Bit-FAT */ + /* Bit 1: 0 (two FATs), 1 (one FAT) */ + /* only available since TOS 2.06 */ +} BPB; /* 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, ...); -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 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 */ -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_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 */ -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 */ +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 */ -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, - uint32_t recno, UINT16_T count, void *buf); /* XHDI 10 */ +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 */ -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 */ +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 */ -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 */ +extern uint32_t xhdi_inquire_device2(uint16_t bios_device, uint16_t *major, uint16_t *minor, + 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_ */