diff options
author | Michael Shalayeff <mickey@cvs.openbsd.org> | 1996-10-29 13:09:06 +0000 |
---|---|---|
committer | Michael Shalayeff <mickey@cvs.openbsd.org> | 1996-10-29 13:09:06 +0000 |
commit | 0d07f2cca9a5c81fac809c79f5e46c454dd35416 (patch) | |
tree | f84a3ecd35e9f7fb9d438d48601de7368602e03f | |
parent | 31a731584ca067bdf30c9d9577adc25501208b71 (diff) |
not int new libsa, or moved
-rw-r--r-- | sys/arch/i386/stand/as.c | 269 | ||||
-rw-r--r-- | sys/arch/i386/stand/asbootblk.c | 236 | ||||
-rw-r--r-- | sys/arch/i386/stand/bmap.c | 125 | ||||
-rw-r--r-- | sys/arch/i386/stand/breadxx.c | 82 |
4 files changed, 0 insertions, 712 deletions
diff --git a/sys/arch/i386/stand/as.c b/sys/arch/i386/stand/as.c deleted file mode 100644 index 796b2650378..00000000000 --- a/sys/arch/i386/stand/as.c +++ /dev/null @@ -1,269 +0,0 @@ -/* $NetBSD: as.c,v 1.4 1994/10/27 04:21:45 cgd Exp $ */ - -/* - * sys/i386/stand/as.c - * - * Standalone driver for Adaptech 1542 SCSI - * - * Pace Willisson pace@blitz.com April 8, 1992 - */ - -#include <sys/param.h> -#include <sys/disklabel.h> -#include <dev/isa/ahareg.h> -#include "saio.h" - -#ifdef ASDEBUG -#define ASPRINT(x) { printf x; DELAY (10000); } -#else -#define ASPRINT(x) -#endif - -#define NRETRIES 3 - -int as_port = 0x330; - -struct mailbox_entry mailbox[2]; - -int -asopen(io) -struct iob *io; -{ - struct disklabel *dd; - char cdb[6]; - char data[12]; - int val; - int oval; - int i; - struct iob aio; - - if (io->i_unit < 0 || io->i_unit > 8 - || io->i_part < 0 || io->i_part > 8 - || io->i_ctlr < 0 || io->i_ctlr > 0) - return (-1); - - /* dma setup: see page 5-31 in the Adaptech manual */ - outb (0xd6, 0xc1); - outb (0xd4, 0x01); - - ASPRINT (("resetting adaptech card... ")); - - outb (as_port + AS_CONTROL, AS_CONTROL_SRST); - - /* delay a little */ - for (i = 0; i < 100; i++) - inb (0x84); - - while (inb (as_port + AS_STATUS) != (AS_STATUS_INIT | AS_STATUS_IDLE)) - ; - - ASPRINT (("reset ok ")); - - as_put_byte (AS_CMD_MAILBOX_INIT); - as_put_byte (1); /* one mailbox out, one in */ - as_put_byte ((int)mailbox >> 16); - as_put_byte ((int)mailbox >> 8); - as_put_byte ((int)mailbox); - - while (inb (as_port + AS_STATUS) & AS_STATUS_INIT) - ; - - ASPRINT (("mailbox init ok ")); - - /* do mode select to set the logical block size */ - bzero (cdb, 6); - cdb[0] = 0x15; /* MODE SELECT */ - cdb[4] = 12; /* parameter list length */ - - bzero (data, 12); - data[3] = 8; /* block descriptor length */ - data[9] = DEV_BSIZE >> 16; - data[10] = DEV_BSIZE >> 8; - data[11] = DEV_BSIZE; - - if (ascmd (io->i_unit, 0, cdb, 6, data, 12, 1) < 0) { - printf ("as%d: error setting logical block size\n", - io->i_unit); - return (-1); - } - - aio = *io; - aio.i_bn = LABELSECTOR; - aio.i_cc = DEV_BSIZE; - /*io->i_ma = buf;*/ - aio.i_boff = 0; - -#ifdef was - if (asstrategy (&aio, F_READ) == DEV_BSIZE) { - dd = (struct disklabel *)aio.i_ma; - io->i_boff = dd->d_partitions[io->i_part].p_offset; - ASPRINT (("partition offset %d ", io->i_boff)); - } -#else -{ -extern struct disklabel disklabel; - io->i_boff = disklabel.d_partitions[io->i_part].p_offset; - ASPRINT (("partition offset %d ", io->i_boff)); -} -#endif - - ASPRINT (("asopen ok ")); - return(0); -} - -/* func is F_WRITE or F_READ - * io->i_unit, io->i_part, io->i_bn is starting block - * io->i_cc is byte count - * io->i_ma is memory address - * io->i_boff is block offset for this partition (set up in asopen) - */ -int -asstrategy(io, func) -struct iob *io; -{ - char cdb[6]; - int blkno; - int retry; - - ASPRINT (("asstrategy(target=%d, block=%d+%d, count=%d) ", - io->i_unit, io->i_bn, io->i_boff, io->i_cc)); - - if (func == F_WRITE) { - printf ("as%d: write not supported\n", io->i_unit); - return (0); - } - - if (io->i_cc == 0) - return (0); - - if (io->i_cc % DEV_BSIZE != 0) { - printf ("as%d: transfer size not multiple of %d\n", - io->i_unit, DEV_BSIZE); - return (0); - } - - /* retry in case we get a unit-attention error, which just - * means the drive has been reset since the last command - */ - for (retry = 0; retry < NRETRIES; retry++) { - blkno = io->i_bn + io->i_boff; - - cdb[0] = 8; /* scsi read opcode */ - cdb[1] = (blkno >> 16) & 0x1f; - cdb[2] = blkno >> 8; - cdb[3] = blkno; - cdb[4] = io->i_cc / DEV_BSIZE; - cdb[5] = 0; /* control byte (used in linking) */ - - if (ascmd (io->i_unit, 1, cdb, 6, io->i_ma, io->i_cc, - retry == NRETRIES - 1) >= 0) { - ASPRINT (("asstrategy ok ")); - return (io->i_cc); - } - } - - ASPRINT (("asstrategy failed ")); - return (0); -} - -int -ascmd (target, readflag, cdb, cdblen, data, datalen, printerr) -int target; -int readflag; -char *cdb; -int cdblen; -char *data; -int datalen; -int printerr; -{ - struct ccb ccb; - int physaddr; - unsigned char *sp; - int i; - - if (mailbox[0].cmd != 0) - /* this can't happen, unless the card flakes */ - _stop ("asstart: mailbox not available\n"); - - bzero (&ccb, sizeof ccb); - - ccb.ccb_opcode = 0; - ccb.ccb_addr_and_control = target << 5; - if (datalen != 0) - ccb.ccb_addr_and_control |= readflag ? 8 : 0x10; - else - ccb.ccb_addr_and_control |= 0x18; - - ccb.ccb_data_len_msb = datalen >> 16; - ccb.ccb_data_len_mid = datalen >> 8; - ccb.ccb_data_len_lsb = datalen; - - ccb.ccb_requst_sense_allocation_len = MAXSENSE; - - physaddr = (int)data; - ccb.ccb_data_ptr_msb = physaddr >> 16; - ccb.ccb_data_ptr_mid = physaddr >> 8; - ccb.ccb_data_ptr_lsb = physaddr; - - ccb.ccb_scsi_command_len = cdblen; - bcopy (cdb, ccb.ccb_cdb, cdblen); - -#ifdef ASDEBUG - printf ("ccb: "); - for (i = 0; i < 48; i++) - printf ("%x ", ((unsigned char *)&ccb)[i]); - printf ("\n"); - /*getchar ();*/ -#endif - - physaddr = (int)&ccb; - mailbox[0].msb = physaddr >> 16; - mailbox[0].mid = physaddr >> 8; - mailbox[0].lsb = physaddr; - mailbox[0].cmd = 1; - - /* tell controller to look in its mailbox */ - outb (as_port + AS_CONTROL, AS_CONTROL_IRST); - as_put_byte (AS_CMD_START_SCSI_COMMAND); - - /* wait for status */ - ASPRINT (("waiting for status...")); - while (mailbox[1].cmd == 0) - ; - mailbox[1].cmd = 0; - - - if (ccb.ccb_host_status != 0 || ccb.ccb_target_status != 0) { -#ifdef ASDEBUG - printerr = 1; -#endif - if (printerr) { - printf ("as%d error: hst=%x tst=%x sense=", - target, - ccb.ccb_host_status, - ccb.ccb_target_status); - sp = ccb_sense (&ccb); - for (i = 0; i < 8; i++) - printf ("%x ", sp[i]); - printf ("\n"); -#ifdef ASDEBUG - /*getchar ();*/ -#endif - } - return (-1); - } - - ASPRINT (("ascmd ok ")); - - return (0); -} - -int -as_put_byte (val) -int val; -{ - while (inb (as_port + AS_STATUS) & AS_STATUS_CDF) - ; - outb (as_port + AS_DATA_OUT, val); -} - diff --git a/sys/arch/i386/stand/asbootblk.c b/sys/arch/i386/stand/asbootblk.c deleted file mode 100644 index f3ea79c233c..00000000000 --- a/sys/arch/i386/stand/asbootblk.c +++ /dev/null @@ -1,236 +0,0 @@ -/* $NetBSD: asbootblk.c,v 1.4 1994/10/27 04:21:46 cgd Exp $ */ - -/* - * sys/i386/stand/asbootblk.c - * - * Boot block for Adaptech 1542 SCSI - * - * April 10, 1992 - * Pace Willisson - * pace@blitz.com - * - * Placed in the public domain with NO WARRANTIES, not even the - * implied warranties for MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. - * - * To compile: - * - * cc -O -c -DRELOC=0x70000 asbootblk.c - * ld -N -T 7c00 asbootblk.o - * - * This should result in a file with 512 bytes of text and no initialized - * data. Strip the 32 bit header and place in block 0. - * - * When run, this program copies at least the first 8 blocks of SCSI - * target 0 to the address specified by RELOC, then jumps to the - * address RELOC+1024 (skipping the boot block and disk label). Usually, - * disks have 512 bytes per block, but I don't think they ever have - * less, and it wont hurt if they are bigger, as long as RELOC + 8*SIZE - * is less than 0xa0000. - * - * This bootblock does not support fdisk partitions, and can only be used - * as the master boot block. - */ - -#include <sys/param.h> -#include <sys/disklabel.h> -#include <dev/isa/ahareg.h> - -/* RELOC should be defined with a -D flag to cc */ - -#define SECOND_LEVEL_BOOT_START (RELOC + 0x400) -#define READ_SIZE 8192 - -#define as_port 0x330 -#define target 0 - - -#define NBLOCKS (READ_SIZE / 512) /* how many logical blocks to read */ - - -/* These are the parameters to pass to the second level boot */ -#define dev 4 /* major device number of as driver in - i386/stand/conf.c and i386/i386/conf.c */ -#define unit 0 /* partition number of root file system */ -#define off 0 /* block offset of root file system */ - -/* inline i/o borrowed from Roell X server */ -static __inline__ void -outb(port, val) -short port; -char val; -{ - __asm__ volatile("outb %%al, %1" : :"a" (val), "d" (port)); -} - -static __inline__ unsigned int -inb(port) -short port; -{ - unsigned int ret; - __asm__ volatile("xorl %%eax, %%eax; inb %1, %%al" - : "=a" (ret) : "d" (port)); - return ret; -} - -/* this code is linked at 0x7c00 and is loaded there by the BIOS */ - -asm (" - /* we're running in 16 real mode, so normal assembly doesn't work */ -bootbase: - /* interrupts off */ - cli - - /* load gdt */ - .byte 0x2e,0x0f,0x01,0x16 /* lgdt %cs:$imm */ - .word _gdtarg + 2 - - /* turn on protected mode */ - smsw %ax - orb $1,%al - lmsw %ax - - /* flush prefetch queue and reload %cs */ - .byte 0xea /* ljmp $8, flush */ - .word flush - .word 8 - -flush: - /* now running in 32 bit mode */ - movl $0x10,%eax - movl %ax,%ds - movl %ax,%es - movl %ax,%ss - movl $0x7c00,%esp - call _main -"); /* end of asm */ - -const char gdt[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0xff, 0xff, 0, 0, 0, 0x9f, 0xcf, 0, /* code segment */ - 0xff, 0xff, 0, 0, 0, 0x93, 0xcf, 0, /* data segment */ -}; - -const struct { - short filler; - short size; - const char *gdt; -} gdtarg = { 0, sizeof gdt - 1, gdt }; - -#define CRTBASE ((char *)0xb8000) -#define CHECKPOINT(x) (CRTBASE[0] = x) - -volatile struct mailbox_entry mailbox[2]; -const char ccb[] = { - 0, /* opcode: normal read/write */ - (target << 5) | 8, /* target num and read flag */ - 10, /* scsi cmd len */ - 1, /* no automatic request for sense */ - READ_SIZE >> 16, /* data length */ - READ_SIZE >> 8, - READ_SIZE, - RELOC >> 16, /* data pointer */ - RELOC >> 8, - RELOC, - 0, 0, 0, /* link pointer */ - 0, /* link id */ - 0, /* host status */ - 0, /* target status */ - 0, 0, /* reserved */ - - /* scsi cdb */ - 0x28, /* read opcode */ - 0, /* logical unit number */ - 0, 0, 0, 0, /* logical block address */ - 0, /* reserved */ - 0, NBLOCKS, /* transfer length */ - 0, /* link control */ -}; - -int (*f)(); - -main () -{ - int i; - extern char edata[], end[]; - char volatile * volatile p, *q; - int physaddr; - - CHECKPOINT ('a'); - - /* clear bss */ - for (p = edata; p < end; p++) - *p = 0; - - f = (int (*)())SECOND_LEVEL_BOOT_START; - - /* dma setup: see page 5-31 in the Adaptech manual */ - /* this knows we are using drq 5 */ - outb (0xd6, 0xc1); - outb (0xd4, 0x01); - - outb (as_port + AS_CONTROL, AS_CONTROL_SRST); - - /* delay a little */ - inb (0x84); - - while (inb (as_port + AS_STATUS) != (AS_STATUS_INIT | AS_STATUS_IDLE)) - ; - - CHECKPOINT ('b'); - - as_put_byte (AS_CMD_MAILBOX_INIT); - as_put_byte (1); /* one mailbox out, one in */ - as_put_byte ((int)mailbox >> 16); - as_put_byte ((int)mailbox >> 8); - as_put_byte ((int)mailbox); - - while (inb (as_port + AS_STATUS) & AS_STATUS_INIT) - ; - - CHECKPOINT ('c'); - - mailbox[0].msb = (int)ccb >> 16; - mailbox[0].mid = (int)ccb >> 8; - mailbox[0].lsb = (int)ccb; - mailbox[0].cmd = 1; - - as_put_byte (AS_CMD_START_SCSI_COMMAND); - - /* wait for done */ - while (mailbox[1].cmd == 0) - ; - - CHECKPOINT ('d'); - - if (mailbox[1].cmd != 1) { - /* some error */ - CHECKPOINT ('X'); - while (1); - } - - CHECKPOINT ('e'); - - /* the optimazation that gcc uses when it knows we are jumpping - * to a constant address is broken, so we have to use a variable - * here - */ - (*f)(dev, unit, off); -} - -int -as_put_byte (val) -int val; -{ - while (inb (as_port + AS_STATUS) & AS_STATUS_CDF) - ; - outb (as_port + AS_DATA_OUT, val); -} - -asm (" -ebootblkcode: - . = 510 - .byte 0x55 - .byte 0xaa -ebootblk: /* MUST BE EXACTLY 0x200 BIG FOR SURE */ -"); diff --git a/sys/arch/i386/stand/bmap.c b/sys/arch/i386/stand/bmap.c deleted file mode 100644 index 64bf2924efd..00000000000 --- a/sys/arch/i386/stand/bmap.c +++ /dev/null @@ -1,125 +0,0 @@ -/* $NetBSD: bmap.c,v 1.3 1994/10/27 04:21:48 cgd Exp $ */ - -/* - * Copyright (c) 1982, 1986, 1989 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ufs_bmap.c 7.13 (Berkeley) 5/8/91 - */ - -#include <sys/param.h> -#include <ufs/ufs/dinode.h> -#include <ufs/ffs/fs.h> -#include <errno.h> - -/* - * Bmap converts a the logical block number of a file - * to its physical block number on the disk. The conversion - * is done by using the logical block number to index into - * the array of block pointers described by the dinode. - */ -extern struct fs *fs; -extern int bdev; - -static daddr_t bap[2*1024]; -static daddr_t bnobap; - -bmap(dip, bn, bnp) - register struct dinode *dip; - register daddr_t bn; - daddr_t *bnp; -{ - register daddr_t nb; - int i, j, sh; - int error; - -/*fprintf(stderr, "bmap %d ", bn);*/ - if (bn < 0) - return (EFBIG); - - /* - * The first NDADDR blocks are direct blocks - */ - if (bn < NDADDR) { - nb = dip->di_db[bn]; - if (nb == 0) { - *bnp = (daddr_t)-1; -/*fprintf(stderr, "%d\n", *bnp);*/ - return (0); - } - *bnp = fsbtodb(fs, nb); -/*fprintf(stderr, "%d\n", *bnp);*/ - return (0); - } - /* - * Determine the number of levels of indirection. - */ - sh = 1; - bn -= NDADDR; - for (j = NIADDR; j > 0; j--) { - sh *= NINDIR(fs); - if (bn < sh) - break; - bn -= sh; - } - if (j == 0) - return (EFBIG); - /* - * Fetch through the indirect blocks. - */ - nb = dip->di_ib[NIADDR - j]; - if (nb == 0) { - *bnp = (daddr_t)-1; -/*fprintf(stderr, "%d\n", *bnp);*/ - return (0); - } - for (; j <= NIADDR; j++) { - daddr_t bno = fsbtodb(fs, nb); - - if (bnobap != bno && -(error = bread(bdev, bno, &bap, - (int)fs->fs_bsize))) { - return (error); - } - bnobap = bno; - sh /= NINDIR(fs); - i = (bn / sh) % NINDIR(fs); - nb = bap[i]; - if (nb == 0) { - *bnp = (daddr_t)-1; -/*fprintf(stderr, "%d\n", *bnp);*/ - return (0); - } - } - *bnp = fsbtodb(fs, nb); -/*fprintf(stderr, "%d\n", *bnp);*/ - return (0); -} diff --git a/sys/arch/i386/stand/breadxx.c b/sys/arch/i386/stand/breadxx.c deleted file mode 100644 index 5662b6baabc..00000000000 --- a/sys/arch/i386/stand/breadxx.c +++ /dev/null @@ -1,82 +0,0 @@ -/* $NetBSD: breadxx.c,v 1.3 1994/10/27 04:21:50 cgd Exp $ */ - -/* - * Copyright (c) 1989, 1990, 1991, 1992 William F. Jolitz, TeleMuse - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This software is a component of "386BSD" developed by - William F. Jolitz, TeleMuse. - * 4. Neither the name of the developer nor the name "386BSD" - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS A COMPONENT OF 386BSD DEVELOPED BY WILLIAM F. JOLITZ - * AND IS INTENDED FOR RESEARCH AND EDUCATIONAL PURPOSES ONLY. THIS - * SOFTWARE SHOULD NOT BE CONSIDERED TO BE A COMMERCIAL PRODUCT. - * THE DEVELOPER URGES THAT USERS WHO REQUIRE A COMMERCIAL PRODUCT - * NOT MAKE USE THIS WORK. - * - * FOR USERS WHO WISH TO UNDERSTAND THE 386BSD SYSTEM DEVELOPED - * BY WILLIAM F. JOLITZ, WE RECOMMEND THE USER STUDY WRITTEN - * REFERENCES SUCH AS THE "PORTING UNIX TO THE 386" SERIES - * (BEGINNING JANUARY 1991 "DR. DOBBS JOURNAL", USA AND BEGINNING - * JUNE 1991 "UNIX MAGAZIN", GERMANY) BY WILLIAM F. JOLITZ AND - * LYNNE GREER JOLITZ, AS WELL AS OTHER BOOKS ON UNIX AND THE - * ON-LINE 386BSD USER MANUAL BEFORE USE. A BOOK DISCUSSING THE INTERNALS - * OF 386BSD ENTITLED "386BSD FROM THE INSIDE OUT" WILL BE AVAILABLE LATE 1992. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE DEVELOPER BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Interface to driver to obtain a block off the disk drive. - */ -#include <sys/param.h> -#include "saio.h" - - -char *devname = "XX"; -static ss = 1; -struct iob iobuf; -bread(bdev, off, addr, sz) - char *addr; -{ -#ifdef DEBUG - printf("bread %d %d %x %d\n", bdev, off, addr, sz); -#endif - iobuf.i_dev = 0; - iobuf.i_adapt = 0; - iobuf.i_ctlr = 0; - iobuf.i_part = 0; - iobuf.i_unit = 0; - iobuf.i_cc = sz; - iobuf.i_bn = off; - iobuf.i_ma = addr; - /*io.i_boff= 0;*/ - iobuf.i_flgs = F_FILE | F_READ; - if(ss) { ss=0; xxopen(&iobuf); } - xxstrategy(&iobuf, F_READ); - scankbd(); - return(0); -} - |