|
|
1.1 ! root 1: //////// ! 2: / ! 3: / Ram Pipe Device Driver Assembler Support ! 4: / ! 5: / urcopy( up, np, n ) -- copy user data to pipe ! 6: / rucopy( np, up, n ) -- copy pipe data to user ! 7: / ! 8: //////// ! 9: ! 10: .globl urcopy_ ! 11: .globl rucopy_ ! 12: ! 13: //////// ! 14: / ! 15: / Offsets of fields within the ram pipe structure ! 16: / ! 17: //////// ! 18: ! 19: Q_SIZE = 0 ! 20: Q_MASK = 2 ! 21: Q_IX = 4 ! 22: Q_ISEG = 6 ! 23: Q_OX = 8 ! 24: Q_OSEG = 10 ! 25: Q_IGATE = 12 ! 26: Q_OGATE = 14 ! 27: ! 28: //////// ! 29: / ! 30: / Urcopy ( up, rp, cnt ) ! 31: / char * up; ! 32: / struct ring * rp; ! 33: / unsigned cnt; ! 34: / ! 35: / Input: up = pointer to user data to copy. ! 36: / rp = pointer to ring structure to copy data to. ! 37: / cnt = number of data bytes to copy. ! 38: / ! 39: / Action: Copy CNT bytes from UP to RP->Q_IX. ! 40: / ! 41: / Return: Number of bytes transferred. ! 42: / ! 43: //////// ! 44: ! 45: urcopy_: / urcopy ( up, rp, cnt ) ! 46: push si / register char *up; /* SI */ ! 47: push di / register struct ring *rp; /* BX */ ! 48: push bp / unsigned cnt; ! 49: mov bp, sp / { ! 50: pushf / register char *cp; /* DI */ ! 51: push ds / register unsigned ret; /* AX */ ! 52: push es / register unsigned n; /* CX */ ! 53: / register unsigned m; /* DX */ ! 54: mov si, 8(bp) / ! 55: mov bx, 10(bp) / ! 56: mov cx, 12(bp) / n = cnt; ! 57: mov dx, Q_MASK(bx) / m = rp->q_mask; ! 58: les di, Q_IX(bx) / cp = rp->q_ix; ! 59: mov ds, uds_ / ! 60: / ! 61: cld / ! 62: 0: movsb / do { *cp++ = *up++; ! 63: and di, dx / wrap(cp); ! 64: loop 0b / } while (--n != 0); ! 65: / ! 66: pop es / ! 67: pop ds / ! 68: mov ax, 12(bp) / ret = cnt; ! 69: cli / s = sphi(); ! 70: mov Q_IX(bx), di / rp->q_ix = cp; ! 71: add Q_SIZE(bx), ax / rp->q_size += ret; ! 72: popf / spl( s ); ! 73: pop bp / ! 74: pop di / return ret; ! 75: pop si / ! 76: ret / } ! 77: ! 78: //////// ! 79: / ! 80: / Rucopy ( rp, up, cnt ) ! 81: / struct ring * rp; ! 82: / char * up; ! 83: / unsigned cnt; ! 84: / ! 85: / Input: rp = pointer to ring structure to copy data from. ! 86: / up = pointer to user data. ! 87: / cnt = number of data bytes to copy. ! 88: / ! 89: / Action: Copy CNT bytes from RP->Q_OX to UP. ! 90: / ! 91: / Return: None. ! 92: / ! 93: //////// ! 94: ! 95: rucopy_: / rucopy ( rp, up, cnt ) ! 96: push si / register struct ring *rp; /* BX */ ! 97: push di / register char * up; /* DI */ ! 98: push bp / unsigned cnt; ! 99: mov bp, sp / { ! 100: pushf / register char *cp; /* SI */ ! 101: push ds / register unsigned ret; /* AX */ ! 102: push es / register unsigned n; /* CX */ ! 103: / register unsigned m; /* DX */ ! 104: mov bx, 8(bp) / ! 105: mov di, 10(bp) / ! 106: mov cx, 12(bp) / ! 107: mov dx, Q_MASK(bx) / m = rp->q_mask; ! 108: mov es, uds_ / ! 109: lds si, Q_OX(bx) / cp = rp->q_ox; ! 110: / ! 111: cld / ! 112: 0: movsb / do { *up++ = *cp++; ! 113: and si, dx / wrap(cp); ! 114: loop 0b / } while (--cnt != 0); ! 115: / ! 116: pop es / ! 117: pop ds / ! 118: mov ax, 12(bp) / ret = cnt; ! 119: cli / s = sphi(); ! 120: mov Q_OX(bx), si / rp->q_ox = cp; ! 121: sub Q_SIZE(bx), ax / rp->q_size -= ret; ! 122: popf / spl( s ); ! 123: pop bp / ! 124: pop di / return ret; ! 125: pop si / ! 126: ret / }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.