/* * 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 0xff00ef #define DJSUCCESS 0x40 /* status returned on successful operation */ #define DJBUSY 0 #define DJSTATUS 0x22 #define DJCHANNEl 0x50 /* * read a sector from the DJDMA * Return 0 on success, non-zero on failure. */ 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; } djopen () { register char *p, *st; p = DJCHANNEL; *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; else return -1; }