diff --git a/sd-emutos/emusd.c b/sd-emutos/emusd.c index 524eb06..421ad88 100644 --- a/sd-emutos/emusd.c +++ b/sd-emutos/emusd.c @@ -73,8 +73,8 @@ int main(int argc, char *argv[]) bas_vector = bas_sd_vector(old_vector); printf("got vector from BaS: %p\r\n", bas_vector); - setcookie('XHDI', (uint32_t) bas_vector); - + //setcookie('XHDI', (uint32_t) bas_vector); + XHNewCookie(old_vector, bas_vector); printf("vector to BaS driver set\r\n"); return 0; diff --git a/sd-emutos/xhdi.h b/sd-emutos/xhdi.h index d25e0e1..d89b3a6 100644 --- a/sd-emutos/xhdi.h +++ b/sd-emutos/xhdi.h @@ -51,6 +51,22 @@ #define XH_TARGET_STOPPED (1 << 30) #define XH_TARGET_RESERVED (1 << 31) +/* XHDI DOS limits */ + +#define XH_DL_SECSIZ (0) /* Maximum sector size (BIOS level) */ +#define XH_DL_MINFAT (1) /* Minimum number of FATs */ +#define XH_DL_MAXFAT (2) /* Maximal number of FATs */ +#define XH_DL_MINSPC (3) /* Minimum sectors per cluster */ +#define XH_DL_MAXSPC (4) /* Maximum sectors per cluster */ +#define XH_DL_CLUSTS (5) /* Maximum number of clusters of a 16-bit FAT */ +#define XH_DL_MAXSEC (6) /* Maximum number of sectors */ +#define XH_DL_DRIVES (7) /* Maximum number of BIOS drives supported by the DOS */ +#define XH_DL_CLSIZB (8) /* Maximum cluster size */ +#define XH_DL_RDLEN (9) /* Max. (bpb->rdlen * bpb->recsiz/32) */ +#define XH_DL_CLUSTS12 (12) /* Max. number of clusters of a 12-bit FAT */ +#define XH_DL_CLUSTS32 (13) /* Max. number of clusters of a 32 bit FAT */ +#define XH_DL_BFLAGS (14) /* Supported bits in bpb->bflags */ + #ifndef _FEATURES_H #include #endif /* _FEATURES_H */ @@ -121,8 +137,8 @@ __extension__ \ "move.l %[entry],a0\n\t" \ "jsr (a0)\n\t" \ "lea 10(sp),sp\n\t" \ - : "=r"(retvalue) /* outputs */ \ - : [a_xhdi_entry]"g"(xhdi_entry), \ + : "=r"(retvalue) /* outputs */ \ + : [entry]"g"(xhdi_entry), \ [a_major]"g"(major), \ [a_minor]"g"(minor), \ [a_do_reserve]"g"(do_reserve), \ @@ -211,8 +227,8 @@ __extension__ \ }) /* XHDI #6 */ - #define XHDrvMap(xhdi_entry) \ - __extension__ \ +#define XHDrvMap(xhdi_entry) \ +__extension__ \ ({ \ register long retvalue __asm__("d0"); \ \ @@ -226,8 +242,7 @@ __extension__ \ : CLOBBER_REGISTERS /* clobbered regs */ \ ); \ retvalue; \ - }) - #define e_xhdi_drivemap xhdi_drivemap(xhdi_entrypoint) +}) /* XHDI #7 */ #define XHInqDev(xhdi_entry, bios_device, major, minor, start_sector, bpb) \ @@ -281,7 +296,7 @@ __extension__ \ [a_version]"g"(version), \ [a_company]"g"(company), \ [a_ahdi_version]"g"(ahdi_version), \ - [a_max_ipl]"g"(max_ipl), \ + [a_max_ipl]"g"(max_ipl) \ : CLOBBER_REGISTERS /* clobbered regs */ \ ); \ retvalue; \ @@ -328,7 +343,7 @@ __extension__ \ : [entry]"g"(xhdi_entry), \ [a_major]"g"(major), \ [a_minor]"g"(minor), \ - [a_rwflag]"g"(rwflag) \ + [a_rwflag]"g"(rwflag), \ [a_recno]"g"(recno), \ [a_count]"g"(count), \ [a_buf]"g"(buf) \ @@ -347,7 +362,6 @@ __extension__ \ "move.w %[a_stringlen],-(sp)\n\t" \ "move.l %[a_product_name],-(sp)\n\t" \ "move.l %[a_device_flags],-(sp)\n\t" \ - "move.l %[a_recno],-(sp)\n\t" \ "move.l %[a_block_size],-(sp)\n\t" \ "move.w %[a_minor],-(sp)\n\t" \ "move.w %[a_major],-(sp)\n\t" \ @@ -357,12 +371,12 @@ __extension__ \ "lea 24(sp),sp\n\t" \ : "=r"(retvalue) /* outputs */ \ : [entry]"g"(xhdi_entry), \ - [major]"g"(major), \ - [minor]"g"(minor), \ - [blocksize]"g"(blocksize) \ - [device_flags]"g"(device_flags), \ - [product_name]"g"(product_name), \ - [stringlen]"g"(stringlen) \ + [a_major]"g"(major), \ + [a_minor]"g"(minor), \ + [a_block_size]"g"(block_size), \ + [a_device_flags]"g"(device_flags), \ + [a_product_name]"g"(product_name), \ + [a_stringlen]"g"(stringlen) \ : CLOBBER_REGISTERS /* clobbered regs */ \ ); \ retvalue; \ @@ -375,7 +389,7 @@ __extension__ \ register long retvalue __asm__("d0"); \ \ __asm__ volatile( \ - "move.l %[a_part_id],-(sp)\n\t" \ + "move.l %[a_partid],-(sp)\n\t" \ "move.l %[a_blocks],-(sp)\n\t" \ "move.l %[a_bpb],-(sp)\n\t" \ "move.l %[a_start_sector],-(sp)\n\t" \ @@ -391,7 +405,7 @@ __extension__ \ [a_bios_device]"g"(bios_device), \ [a_major]"g"(major), \ [a_minor]"g"(minor), \ - [a_start_sector]"g"(start_sector) \ + [a_start_sector]"g"(start_sector), \ [a_bpb]"g"(bpb), \ [a_blocks]"g"(blocks), \ [a_partid]"g"(partid) \ @@ -468,7 +482,7 @@ __extension__ \ : "=r"(retvalue) /* outputs */ \ : [entry]"g"(xhdi_entry), \ [a_major]"g"(major), \ - [a_minor]"g"(minor), \ + [a_minor]"g"(minor) \ : CLOBBER_REGISTERS /* clobbered regs */ \ ); \ retvalue; \ @@ -490,14 +504,14 @@ __extension__ \ : "=r"(retvalue) /* outputs */ \ : [entry]"g"(xhdi_entry), \ [a_opcode]"g"(opcode), \ - [a_data]"g"(data), \ + [a_data]"g"(data) \ : CLOBBER_REGISTERS /* clobbered regs */ \ ); \ retvalue; \ }) /* XHDI #17 */ -#define XHDosLimits(xhdi_entry, which, limit) \ +#define XHDOSLimits(xhdi_entry, which, limit) \ __extension__ \ ({ \ register long retvalue __asm__("d0"); \ @@ -543,7 +557,7 @@ __extension__ \ }) /* XHDI #19 */ -#define xhdi_last_reaccess(xhdi_entry, major, minor) \ +#define XHReaccess(xhdi_entry, major, minor) \ __extension__ \ ({ \ register long retvalue __asm__("d0"); \ diff --git a/sd-emutos/xhdi_test.c b/sd-emutos/xhdi_test.c index 8d790d3..10948c0 100644 --- a/sd-emutos/xhdi_test.c +++ b/sd-emutos/xhdi_test.c @@ -50,6 +50,12 @@ void print_bpb(_BPB *bpb) printf("\t\tnumcl = %u\r\n", bpb->numcl); printf("\t\tbflags = %x\r\n", bpb->bflags); } + +/* + * XHDI test routine + * + * XHDI functions must be called in supervisor mode - pack everything in a function that can be called by Supexec() + */ void xhdi_test(void) { long drvmap; @@ -61,43 +67,117 @@ void xhdi_test(void) drvmap = XHDrvMap(xhdi); printf("XHDrvmap = %lx\r\n", drvmap); - printf("XHInqDev for all XHDI devices\r\n"); + printf("XHInqDev and XHInqDriver for all XHDI devices\r\n"); for (i = 0; i < 32; i++) { + char driver_name[17]; + char driver_version[7]; + char driver_company[17]; + uint16_t ahdi_version; + uint16_t max_ipl; + uint16_t major = 0; uint16_t minor = 0; long start_sector = 0L; uint32_t ret; - _BPB *bpb; + _BPB *bpb = NULL; + long blocks; + char part_id[20]; if ((drvmap >> i) & 1) { + printf("XHInqDev(%d):\r\n", i); ret = XHInqDev(xhdi, i, &major, &minor, &start_sector, &bpb); if (ret == E_OK || ret == EDRVNR) { long block_size; long flags; - char *product_name; + char product_name[33]; + char buff[512]; + unsigned long blocks; + unsigned long blocksize; + unsigned long ms; printf("drive %d returned %d:\r\n", i, ret); printf("\tmajor = %x, minor = %x, start_sector = %lx, bpb = %p\r\n", major, minor, start_sector, bpb); if (bpb != NULL) print_bpb(bpb); - printf("trying to eject device major = %u, minor = %u. result = %ld\r\n", + printf("XHInqTarget() major = %x, minor = %x. result = %ld\r\n", major, minor, + XHInqTarget(xhdi, major, minor, &block_size, &flags, &product_name)); + printf("block_size = %ld, flags = %lx, product_name = \"%s\"\r\n", block_size, flags, product_name); + + printf("XHInqTarget2() major = %x, minor = %x. result = %ld\r\n", major, minor, + XHInqTarget2(xhdi, major, minor, &block_size, &flags, &buff, 512)); + printf("block_size = %ld, flags = %lx, product_name = \"%s\"\r\n", block_size, flags, product_name); + + printf("try to read sector 1 from device major = %x, minor = %x. Result: %ld\r\n", + major, minor, XHReadWrite(xhdi, major, minor, 0, 1, 1, &buff)); + + (void) Cconws("\r\n\r\n"); + (void) Cconin(); + + printf("XHEject() on device major = %x, minor = %x. result = %ld\r\n", major, minor, XHEject(xhdi, major, minor, 1, 1)); - printf("trying to lock device major = %u, minor = %u. result = %ld\r\n", + + printf("XHLock() on device major = %x, minor = %x. result = %ld\r\n", major, minor, XHLock(xhdi, major, minor, 1, 1)); - printf("inquire target major = %u, minor = %u. result = %ld\r\n", major, minor, - XHInqTarget(xhdi, major, minor, &block_size, &flags, &product_name)); - printf("block_size = %ld, flags = %ld, product_name = \"%s\"", block_size, flags, product_name); + printf("XHReserve() on device major = %x, minor = %x. result = %ld\r\n", + major, minor, XHReserve(xhdi, major, minor, 1, 1)); + printf("XHStop() on device major = %x, minor = %x. result = %ld\r\n", + major, minor, XHStop(xhdi, major, minor, 1, 1)); + + printf("XHDriverSpecial() on device major = %x, minor = %x. result = %ld\r\n", + major, minor, XHDriverSpecial(xhdi, 'EMUT', 0x12345678, 0, NULL)); + + printf("XHGetCapacity() on device major = %x, minor = %x. result = %ld\r\n", + major, minor, XHGetCapacity(xhdi, major, minor, &blocks, &blocksize)); + printf("blocks = %ld, blocksize = %ld\r\n", blocks, blocksize); + + printf("XHMediumChanged() on device major = %x, minor = %x. Result = %ld\r\n", + major, minor, XHMediumChanged(xhdi, major, minor)); + + printf("XHMintInfo() on driver. Result = %ld\r\n", + XHMintInfo(xhdi, 1, &buff)); + + (void) Cconws("\r\n\r\n"); + (void) Cconin(); + + printf("XHDOSLimits(XH_DL_SECSIZ); on driver. Result = %ld\r\n", + XHDOSLimits(xhdi, XH_DL_SECSIZ, 0)); + + ms = 0L; + printf("XHLastAccess() on device major = %x, minor = %x. Result = %ld\r\n", + major, minor, XHLastAccess(xhdi, major, minor, &ms)); + printf("ms = %ld\r\n", ms); + + printf("XHReaccess() on device major = %x, minor = %x. Result = %ld\r\n", + major, minor, XHReaccess(xhdi, major, minor)); + } + printf("XHInqDriver(%d):", i); + ret = XHInqDriver(xhdi, i, &driver_name, &driver_version, &driver_company, &ahdi_version, &max_ipl); + printf("%d\r\n", ret); + if (ret == E_OK || ret == EDRVNR) + { + printf("driver_name = %s, driver_version = %s, driver_company = %s, ahdi_version = %d, max_ipl = %d\r\n", + driver_name, driver_version, driver_company, ahdi_version, max_ipl); + } + + printf("XHInqDev2(%d):\r\n", i); + ret = XHInqDev2(xhdi, i, &major, &minor, &start_sector, &bpb, &blocks, &part_id); + if (ret == E_OK || ret == EDRVNR) + { + printf("drive %d returned %d:\r\n", i, ret); + printf("\tmajor = %x, minor = %x, start_sector = %lx, bpb = %p, blocks = %ld, part_id = %s\r\n", + major, minor, start_sector, bpb, blocks, part_id); } } bpb = NULL; } } + int main(int argc, char *argv[]) { (void) Cconws("\033EGCC XHDI Test Program\r\n=====================\r\n\r\n");