From 64d0a820fb9272242840c06282f256040f25f3d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Fr=C3=B6schle?= Date: Sat, 4 May 2013 05:38:53 +0000 Subject: [PATCH] started implementation of xhdi.h in the style of osbind.h --- sd-emutos/xhdi.c | 315 ----------------------------------------------- sd-emutos/xhdi.h | 228 +++++++++++++++++++++++++--------- 2 files changed, 169 insertions(+), 374 deletions(-) diff --git a/sd-emutos/xhdi.c b/sd-emutos/xhdi.c index 9a40e89..55f5739 100644 --- a/sd-emutos/xhdi.c +++ b/sd-emutos/xhdi.c @@ -5,320 +5,5 @@ * Author: mfro */ -#include -#include -#include #include "xhdi.h" - - -uint32_t xhdi_call(int xhdi_fun, ...) -{ - va_list arguments; - va_start(arguments, xhdi_fun); - - switch (xhdi_fun) - { - case XHDI_VERSION: - return xhdi_version(); - break; - - case XHDI_INQUIRE_TARGET: - { - uint16_t major; - uint16_t minor; - uint32_t *block_size; - uint32_t *flags; - char *product_name; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - block_size = va_arg(arguments, uint32_t *); - flags = va_arg(arguments, uint32_t *); - product_name = va_arg(arguments, char *); - return xhdi_inquire_target(major, minor, - block_size, flags, product_name); - } - break; - - case XHDI_RESERVE: - { - uint16_t major; - uint16_t minor; - uint16_t do_reserve; - uint16_t key; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - do_reserve = va_arg(arguments, unsigned int); - key = va_arg(arguments, unsigned int); - - return xhdi_reserve(major, minor, do_reserve, key); - } - break; - - case XHDI_LOCK: - { - uint16_t major; - uint16_t minor; - uint16_t do_lock; - uint16_t key; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - do_lock = va_arg(arguments, unsigned int); - key = va_arg(arguments, unsigned int); - - return xhdi_lock(major, minor, do_lock, key); - } - break; - - case XHDI_STOP: - { - uint16_t major; - uint16_t minor; - uint16_t do_stop; - uint16_t key; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - do_stop = va_arg(arguments, unsigned int); - key = va_arg(arguments, unsigned int); - - return xhdi_stop(major, minor, do_stop, key); - } - break; - - case XHDI_EJECT: - { - uint16_t major; - uint16_t minor; - uint16_t do_eject; - uint16_t key; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - do_eject = va_arg(arguments, unsigned int); - key = va_arg(arguments, unsigned int); - - return xhdi_eject(major, minor, do_eject, key); - } - break; - - case XHDI_DRIVEMAP: - return xhdi_drivemap(); - break; - - case XHDI_INQUIRE_DEVICE: - { - uint16_t bios_device; - uint16_t *major; - uint16_t *minor; - uint32_t *start_sector; - void *bpb; - - bios_device = va_arg(arguments, unsigned int); - major = va_arg(arguments, uint16_t *); - minor = va_arg(arguments, uint16_t *); - start_sector = va_arg(arguments, uint32_t *); - bpb = va_arg(arguments, void *); - - return xhdi_inquire_device(bios_device, major, minor, start_sector, bpb); - } - break; - - case XHDI_INQUIRE_DRIVER: - { - uint16_t bios_device; - char *name; - char *version; - char *company; - uint16_t *ahdi_version; - uint16_t *maxIPL; - - bios_device = va_arg(arguments, unsigned int); - name = va_arg(arguments, char *); - version = va_arg(arguments, char *); - company = va_arg(arguments, char *); - ahdi_version = va_arg(arguments, uint16_t *); - maxIPL = va_arg(arguments, uint16_t *); - - return xhdi_inquire_driver(bios_device, name, version, company, - ahdi_version, maxIPL); - } - break; - - case XHDI_NEW_COOKIE: - { - void *new_cookie; - - new_cookie = va_arg(arguments, void *); - - return xhdi_new_cookie(new_cookie); - } - break; - - case XHDI_READ_WRITE: - { - uint16_t major; - uint16_t minor; - uint16_t rwflag; - uint32_t recno; - uint16_t count; - void *buf; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - rwflag = va_arg(arguments, unsigned int); - recno = va_arg(arguments, uint32_t); - count = va_arg(arguments, unsigned int); - buf = va_arg(arguments, void *); - - return xhdi_read_write(major, minor, rwflag, recno, count, buf); - } - break; - - case XHDI_INQUIRE_TARGET2: - { - uint16_t major; - uint16_t minor; - uint32_t *block_size; - uint32_t *device_flags; - char *product_name; - uint16_t strlen; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - block_size = va_arg(arguments, uint32_t *); - device_flags = va_arg(arguments, uint32_t *); - product_name = va_arg(arguments, char *); - strlen = va_arg(arguments, unsigned int); - - return xhdi_inquire_target2(major, minor, block_size, device_flags, - product_name, strlen); - } - break; - - case XHDI_INQUIRE_DEVICE2: - { - uint16_t bios_device; - uint16_t *major; - uint16_t *minor; - uint16_t *start_sector; - void *bpb; - uint32_t *blocks; - char *partid; - - bios_device = va_arg(arguments, unsigned int); - major = va_arg(arguments, uint16_t *); - minor = va_arg(arguments, uint16_t *); - start_sector = va_arg(arguments, uint16_t *); - bpb = va_arg(arguments, void *); - blocks = va_arg(arguments, uint32_t *); - partid = va_arg(arguments, char *); - - return xhdi_inquire_device2(bios_device, major, minor, start_sector, - bpb, blocks, partid); - } - break; - - case XHDI_DRIVER_SPECIAL: - { - uint32_t key1; - uint32_t key2; - uint16_t subopcode; - void *data; - - key1 = va_arg(arguments, uint32_t); - key2 = va_arg(arguments, uint32_t); - subopcode = va_arg(arguments, unsigned int); - data = va_arg(arguments, void *); - - return xhdi_driver_special(key1, key2, subopcode, data); - } - break; - - case XHDI_GET_CAPACITY: - { - uint16_t major; - uint16_t minor; - uint32_t *blocks; - uint32_t *bs; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - blocks = va_arg(arguments, uint32_t *); - bs = va_arg(arguments, uint32_t *); - - return xhdi_get_capacity(major, minor, blocks, bs); - } - break; - - case XHDI_MEDIUM_CHANGED: - { - uint16_t major; - uint16_t minor; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - return xhdi_medium_changed(major, minor); - } - break; - - case XHDI_MINT_INFO: - { - uint16_t opcode; - void *data; - - opcode = va_arg(arguments, unsigned int); - data = va_arg(arguments, void *); - - return xhdi_mint_info(opcode, data); - } - break; - - case XHDI_DOS_LIMITS: - { - uint16_t which; - uint32_t limit; - - which = va_arg(arguments, unsigned int); - limit = va_arg(arguments, uint32_t); - - return xhdi_dos_limits(which, limit); - } - break; - - case XHDI_LAST_ACCESS: - { - uint16_t major; - uint16_t minor; - uint32_t *ms; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - ms = va_arg(arguments, uint32_t *); - - return xhdi_last_access(major, minor, ms); - } - break; - - case XHDI_REACCESS: - { - uint16_t major; - uint16_t minor; - - major = va_arg(arguments, unsigned int); - minor = va_arg(arguments, unsigned int); - - return xhdi_reaccess(major, minor); - } - break; - - default: - break; - } - xprintf("unknown XHDI function %d\r\n"); - return EINVFN; -} - diff --git a/sd-emutos/xhdi.h b/sd-emutos/xhdi.h index 3a78cda..45e85c4 100644 --- a/sd-emutos/xhdi.h +++ b/sd-emutos/xhdi.h @@ -8,34 +8,6 @@ #ifndef XHDI_H_ #define XHDI_H_ -/* - * xhdi_sd.h - * - * This file is part of BaS_gcc. - * - * BaS_gcc is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BaS_gcc is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with BaS_gcc. If not, see . - * - * Created on: 01.05.2013 - * Copyright 2012 M. Fršschle - */ -#ifndef _XHDI_SD_H_ -#define _XHDI_SD_H_ - -#ifdef __MSHORT__ -#error this include file is not suitable for -mshort compilation -#endif /* __MSHORT__ */ - /* XHDI function numbers */ #define XHDI_VERSION 0 @@ -79,45 +51,183 @@ #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 +#ifndef _FEATURES_H +#include +#endif /* _FEATURES_H */ -/* 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 long xhdi_entrypoint; -extern uint32_t xhdi_call(int xhdi_fun, ...); +/* XHDI #0 */ +#define xhdi_version(xhdi_entry) \ +__extension__ \ + ({ \ + register long retvalue __asm__("d0"); \ + \ + __asm__ volatile( \ + "move.w #XHDI_VERSION,-(sp)\n\t" \ + "jsr [xhdi_entry]\n\t" \ + "addq.l #2,sp\n\t" \ + : ="r"(retvalue) /* outputs */ \ + : [xhdi_entry]"g"(xhdi_entry) /* inputs */ \ + : CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ + AND_MEMORY \ + ); \ + retvalue; \ +}); +#define e_xhdi_version xhdi_version(xhdi_entrypoint) -extern xhdi_call_fun xhdi_sd_install(xhdi_call_fun old_vector) __attribute__((__interrupt__)); +/* XHDI #1 */ +#define xhdi_inquire_target(xhdi_entry, major, minor, block_size, flags, product_name) \ +__extension__ \ + ({ \ + register long retvalue __asm__("d0"); \ + \ + __asm__ volatile( \ + "move.w #XHDI_INQUIRE_TARGET,-(sp)\n\t" \ + "move.w [major],-(sp)\n\t" \ + "move.w [minor],-(sp)\n\t" \ + "lea [block_size],-(sp)\n\t" \ + "move.l [flags],-(sp)\n\t" \ + "lea [product_name],-(sp)\n\t" \ + "jsr [xhdi_entry]\n\t" \ + "lea 18(sp),sp\n\t" \ + : ="r"(retvalue) /* outputs */ \ + : [xhdi_entry]"g"(xhdi_entry), \ + [major]"g"(major), \ + [minor]"g"(minor), \ + [block_size]"g"(block_size), \ + [flags]"g"(flags), \ + [product_name]"g"(product_name) \ + : CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ + AND_MEMORY \ + ); \ + retvalue; \ +}); -extern uint32_t xhdi_version(void); /* XHDI 0 */ + /* XHDI #2 */ + #define xhdi_reserve(xhdi_entry, major, minor, do_reserve, key) \ + __extension__ \ + ({ \ + register long retvalue __asm__("d0"); \ + \ + __asm__ volatile( \ + "move.w #XHDI_RESERVE,-(sp)\n\t" \ + "move.w [major],-(sp)\n\t" \ + "move.w [minor],-(sp)\n\t" \ + "move.w [do_reserve],-(sp)\n\t" \ + "move.w [key],-(sp)\n\t" \ + "jsr [xhdi_entry]\n\t" \ + "lea 10(sp),sp\n\t" \ + : ="r"(retvalue) /* outputs */ \ + : [xhdi_entry]"g"(xhdi_entry), \ + [major]"g"(major), \ + [minor]"g"(minor), \ + [do_reserve]"g"(do_reserve), \ + [key]"g"(key), \ + : CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ + AND_MEMORY \ + ); \ + retvalue; \ + }); -extern uint32_t xhdi_inquire_target(UINT16_T major, UINT16_T minor, uint32_t *block_size, uint32_t *flags, - char *product_name); /* XHDI 1 */ +/* XHDI #3 */ +#define xhdi_lock(xhdi_entry, major, minor, do_lock, key) \ +__extension__ \ + ({ \ + register long retvalue __asm__("d0"); \ + \ + __asm__ volatile( \ + "move.w #XHDI_DO_LOCK,-(sp)\n\t" \ + "move.w [major],-(sp)\n\t" \ + "move.w [minor],-(sp)\n\t" \ + "move.w [do_lock],-(sp)\n\t" \ + "move.w [key],-(sp)\n\t" \ + "jsr [xhdi_entry]\n\t" \ + "lea 10(sp),sp\n\t" \ + : ="r"(retvalue) /* outputs */ \ + : [xhdi_entry]"g"(xhdi_entry), \ + [major]"g"(major), \ + [minor]"g"(minor), \ + [do_lock]"g"(do_lock), \ + [key]"g"(key), \ + : CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ + AND_MEMORY \ + ); \ + retvalue; \ +}); -extern uint32_t xhdi_reserve(UINT16_T major, UINT16_T minor, UINT16_T do_reserve, UINT16_T key); /* XHDI 2 */ +/* XHDI #4 */ +#define xhdi_stop(xhdi_entry, major, minor, do_stop, key) \ +__extension__ \ + ({ \ + register long retvalue __asm__("d0"); \ + \ + __asm__ volatile( \ + "move.w #XHDI_DO_STOP,-(sp)\n\t" \ + "move.w [major],-(sp)\n\t" \ + "move.w [minor],-(sp)\n\t" \ + "move.w [do_stop],-(sp)\n\t" \ + "move.w [key],-(sp)\n\t" \ + "jsr [xhdi_entry]\n\t" \ + "lea 10(sp),sp\n\t" \ + : ="r"(retvalue) /* outputs */ \ + : [xhdi_entry]"g"(xhdi_entry), \ + [major]"g"(major), \ + [minor]"g"(minor), \ + [do_stop]"g"(do_stop), \ + [key]"g"(key), \ + : CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ + AND_MEMORY \ + ); \ + retvalue; \ +}); -extern uint32_t xhdi_lock(UINT16_T major, UINT16_T minor, UINT16_T do_lock, UINT16_T key); /* XHDI 3 */ +/* XHDI #5 */ +#define xhdi_eject(xhdi_entry, major, minor, do_eject, key) \ +__extension__ \ + ({ \ + register long retvalue __asm__("d0"); \ + \ + __asm__ volatile( \ + "move.w #XHDI_DO_STOP,-(sp)\n\t" \ + "move.w [major],-(sp)\n\t" \ + "move.w [minor],-(sp)\n\t" \ + "move.w [do_eject],-(sp)\n\t" \ + "move.w [key],-(sp)\n\t" \ + "jsr [xhdi_entry]\n\t" \ + "lea 10(sp),sp\n\t" \ + : ="r"(retvalue) /* outputs */ \ + : [xhdi_entry]"g"(xhdi_entry), \ + [major]"g"(major), \ + [minor]"g"(minor), \ + [do_stop]"g"(do_eject), \ + [key]"g"(key), \ + : CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ + AND_MEMORY \ + ); \ + retvalue; \ +}); -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_drivemap(void); /* XHDI 6 */ + /* XHDI #6 */ + #define xhdi_drivemap(xhdi_entry) \ + __extension__ \ + ({ \ + register long retvalue __asm__("d0"); \ + \ + __asm__ volatile( \ + "move.w #XHDI_DRIVEMAP,-(sp)\n\t" \ + "jsr [xhdi_entry]\n\t" \ + "addq.l #2,sp\n\t" \ + : ="r"(retvalue) /* outputs */ \ + : [xhdi_entry]"g"(xhdi_entry) /* inputs */ \ + : CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \ + AND_MEMORY \ + ); \ + retvalue; \ + }); + #define e_xhdi_drivemap xhdi_drivemap(xhdi_entrypoint) +#ifdef _NOT_USED_ 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 */ @@ -149,7 +259,7 @@ extern uint32_t xhdi_last_access(UINT16_T major, UINT16_T minor, uint32_t *ms); extern uint32_t xhdi_reaccess(UINT16_T major, UINT16_T minor); /* XHDI 19 */ -#endif /* _XHDI_SD_H_ */ +#endif /* _NOT_USED_ */ #endif /* XHDI_H_ */