1 /* 2 * Copyright (c) 1982 Regents of the University of California 3 */ 4 #ifndef lint 5 static char sccsid[] = "@(#)asio.c 4.4 02/14/82"; 6 #endif not lint 7 8 #include <stdio.h> 9 #include "as.h" 10 /* 11 * Block I/O routines for logical I/O concurrently in 12 * more than one place in the same file. 13 */ 14 int biofd; /* file descriptor for block I/O file */ 15 off_t boffset; /* physical position in logical file */ 16 BFILE *biobufs; /* the block I/O buffers */ 17 18 #define error(severity, message) \ 19 {yyerror(message); if (severity) delexit();} 20 21 Flushfield(n) 22 register int n; 23 { 24 while (n>0) { 25 outb(bitfield); 26 bitfield >>= 8; 27 n -= 8; 28 } 29 bitoff=0; 30 bitfield=0; 31 } 32 33 /* 34 * Block I/O Routines 35 */ 36 bopen(bp, off) 37 struct biobuf *bp; 38 off_t off; 39 { 40 41 bp->b_ptr = bp->b_buf; 42 bp->b_nleft = BUFSIZ - off % BUFSIZ; 43 bp->b_off = off; 44 bp->b_link = biobufs; 45 biobufs = bp; 46 } 47 48 int bwrerror; 49 50 bwrite(p, cnt, bp) 51 register char *p; 52 register int cnt; 53 register struct biobuf *bp; 54 { 55 register int put; 56 register char *to; 57 58 top: 59 if (cnt == 0) 60 return; 61 if (bp->b_nleft) { 62 put = bp->b_nleft; 63 if (put > cnt) 64 put = cnt; 65 bp->b_nleft -= put; 66 to = bp->b_ptr; 67 #ifdef lint 68 *to = *to; 69 #endif lint 70 asm("movc3 r8,(r11),(r7)"); 71 bp->b_ptr += put; 72 p += put; 73 cnt -= put; 74 goto top; 75 } 76 if (cnt >= BUFSIZ) { 77 if (bp->b_ptr != bp->b_buf) 78 bflush1(bp); 79 put = cnt - cnt % BUFSIZ; 80 if (boffset != bp->b_off) 81 (void)lseek(biofd, (long)bp->b_off, 0); 82 if (write(biofd, p, put) != put) { 83 bwrerror = 1; 84 error(1, "Output write error"); 85 } 86 bp->b_off += put; 87 boffset = bp->b_off; 88 p += put; 89 cnt -= put; 90 goto top; 91 } 92 bflush1(bp); 93 goto top; 94 } 95 96 bflush() 97 { 98 register struct biobuf *bp; 99 100 if (bwrerror) 101 return; 102 for (bp = biobufs; bp; bp = bp->b_link) 103 bflush1(bp); 104 } 105 106 bflush1(bp) 107 register struct biobuf *bp; 108 { 109 register int cnt = bp->b_ptr - bp->b_buf; 110 111 if (cnt == 0) 112 return; 113 if (boffset != bp->b_off) 114 (void)lseek(biofd, (long)bp->b_off, 0); 115 if (write(biofd, bp->b_buf, cnt) != cnt) { 116 bwrerror = 1; 117 error(1, "Output write error"); 118 } 119 bp->b_off += cnt; 120 boffset = bp->b_off; 121 bp->b_ptr = bp->b_buf; 122 bp->b_nleft = BUFSIZ; 123 } 124 125 bflushc(bp, c) 126 register struct biobuf *bp; 127 char c; 128 { 129 bflush1(bp); 130 bputc(c, bp); 131 } 132