/* * Morrow DJDMA */ #include "boot.h" #define VERSO 0200 /* other side */ #define DJDRIVE 0 /* boot from drive 0 */ #define DJREAD 0x20 #define DJHALT 0x25 #define DJSETADDR 0x23 #define DJSTATE ((char *) 0xff00ef) #define DJSUCCESS 0x40 /* status returned on successful operation */ #define DJBUSY 0 #define DJSTATUS 0x22 #define DJCHANNEL ((char *) 0x50) /* * read a sector from the DJDMA * Return 0 on success, non-zero on failure. */ /*VARARGS*/ djread (cyl, head, sect, addr) int cyl, head, sect; char *addr; { register char *p, *st; sect++; /* 1-origin sector number correction */ if (head) cyl |= VERSO; /* other side */ p = DJCHANNEL; *p++ = DJSETADDR; /* set the dest. address */ *p++ = lobyte(addr); *p++ = midbyte(addr); *p++ = hibyte(addr); *p++ = DJREAD; *p++ = cyl; /* cylinder and head */ *p++ = sect; /* sector */ *p++ = DJDRIVE; /* drive */ *(st = p++) = DJBUSY; /* return status */ *p++ = DJHALT; run (DJSTATE, p); return *st != DJSUCCESS; } /* * Initialize the Morrow DJDMA */ #define DJLOGICAL 0x2e #define FIVEFIRST 4 #define EIGHTFIRST 0 djopen () { register char *p, *st; p = DJCHANNEL; *p++ = DJLOGICAL; *p++ = FIVEFIRST; *p++ = DJBUSY; *p++ = DJSTATUS; /* djdma status */ *p++ = DJDRIVE; *p++ = DJBUSY; *p++ = DJBUSY; *p++ = DJBUSY; *(st = p++) = DJBUSY; *p++ = DJHALT; run (DJSTATE, p); if (*st == DJSUCCESS) return 0; /* * Try the 8" drive */ p = DJCHANNEL; *p++ = DJLOGICAL; *p++ = EIGHTFIRST; *p++ = DJBUSY; *p++ = DJSTATUS; /* djdma status */ *p++ = DJDRIVE; *p++ = DJBUSY; *p++ = DJBUSY; *p++ = DJBUSY; *(st = p++) = DJBUSY; *p++ = DJHALT; run (DJSTATE, p); if (*st == DJSUCCESS) return 0; return -1; }