#include <exec/errors.h> #include <exec/memory.h> #include <devices/trackdisk.h> struct ExecBase* SysBase; const char DevName[]="mntsd.device"; const char DevIdString[]="mntsd 1.0 (28 Feb 2018)"; const UWORD DevVersion=1; const UWORD DevRevision=0; #include "stabs.h" int __UserDevInit(struct Device* dev) { return 1; } int __UserDevCleanup(void) { return 0; } int __UserDevOpen(struct IORequest *io, ULONG unitnum, ULONG flags) { io->io_Error = 0; return 0; } int __UserDevClose(struct IORequest *io) { return 0; } ADDTABL_1(__BeginIO,a1); void __BeginIO(struct IOStdReq *iostd) { unsigned int err = IOERR_NOCMD; unsigned int offset; struct DriveGeometry *geo; switch (iostd->io_Command) { case CMD_RESET: case CMD_UPDATE: case CMD_CLEAR: case CMD_STOP: case CMD_START: case CMD_FLUSH: case TD_MOTOR: case TD_SEEK: case TD_REMOVE: case TD_CHANGENUM: case TD_CHANGESTATE: case TD_PROTSTATUS: case TD_ADDCHANGEINT: case TD_REMCHANGEINT: iostd->io_Actual = 0; err = 0; break; case TD_GETDRIVETYPE: iostd->io_Actual = DG_DIRECT_ACCESS; err = 0; break; case TD_GETGEOMETRY: geo = (struct DriveGeometry *)iostd->io_Data; geo->dg_SectorSize = 512; geo->dg_TotalSectors = 22; geo->dg_Cylinders = 80; geo->dg_CylSectors = 44; geo->dg_Heads = 2; geo->dg_TrackSectors = 22; geo->dg_BufMemType = MEMF_PUBLIC; geo->dg_DeviceType = DG_DIRECT_ACCESS; geo->dg_Flags = DGF_REMOVABLE; err = 0; break; case TD_FORMAT: case CMD_WRITE: offset = iostd->io_Offset; iostd->io_Actual = iostd->io_Length; err = 0;//SD_ReadWrite(sdu, io, offset, 1); break; case CMD_READ: offset = iostd->io_Offset; iostd->io_Actual = iostd->io_Length; err = 0;//SD_ReadWrite(sdu, io, offset, 0); break; default: kprintf("Unknown IO command: %ld\n", iostd->io_Command); err = IOERR_NOCMD; break; } iostd->io_Error = err; if (!(iostd->io_Flags & IOF_QUICK)) { // ReplyMsg does this: io->io_Message.mn_Node.ln_Type = NT_REPLYMSG; ReplyMsg(&iostd->io_Message); } } ADDTABL_1(__AbortIO,a1); void __AbortIO(struct IORequest* io) { if (!io) return; io->io_Error = IOERR_ABORTED; } ADDTABL_END();
@spidi, post #7
czy sterownik nie musi odnosić się do sprzętu ? np. jakiegoś adresu pod którym znajduje się dane urządzenie ?
//SD_ReadWrite(sdu, io, offset, 1); musiałoby jakieś dane zwracać i może wówczas pokaże się ikonka dysku
@piotr_go, post #10