|
|
1.1 ! root 1: /* ! 2: * Mach Operating System ! 3: * Copyright (c) 1992 Carnegie Mellon University ! 4: * All Rights Reserved. ! 5: * ! 6: * Permission to use, copy, modify and distribute this software and its ! 7: * documentation is hereby granted, provided that both the copyright ! 8: * notice and this permission notice appear in all copies of the ! 9: * software, derivative works or modified versions, and any portions ! 10: * thereof, and that both notices appear in supporting documentation. ! 11: * ! 12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 15: * ! 16: * Carnegie Mellon requests users of this software to return to ! 17: * ! 18: * Software Distribution Coordinator or [email protected] ! 19: * School of Computer Science ! 20: * Carnegie Mellon University ! 21: * Pittsburgh PA 15213-3890 ! 22: * ! 23: * any improvements or extensions that they make and grant Carnegie Mellon ! 24: * the rights to redistribute these changes. ! 25: */ ! 26: ! 27: /* ! 28: * HISTORY ! 29: * $Log: if_de6s.S,v $ ! 30: * Revision 1.1.1.1 1997/02/25 21:27:16 thomas ! 31: * Initial source ! 32: * ! 33: * Revision 1.1.1.1 1996/10/30 01:39:26 thomas ! 34: * Imported from UK22 ! 35: * ! 36: # Revision 1.3 1995/04/26 19:22:12 baford ! 37: # got alignment working right for both ELF and a.out ! 38: # ! 39: # Revision 1.2 1995/04/25 16:13:28 baford ! 40: # got kernel working with ELF build tools ! 41: # ! 42: # Revision 1.1 1994/11/08 20:47:25 baford ! 43: # merged in CMU's MK83-MK83a diffs ! 44: # ! 45: * Revision 2.2 93/11/17 18:33:19 dbg ! 46: * Moved source into kernel/i386at/DLINK/if_de6c.c, since we ! 47: * can't release it but don't want to lose it. ! 48: * [93/11/17 dbg] ! 49: * ! 50: * Revision 2.2.2.1 93/09/21 21:00:39 dbg ! 51: * <no changes> ! 52: * ! 53: * Revision 2.2.1.1 93/09/03 15:06:26 dbg ! 54: * Created. ! 55: * [92/08/13 rvb] ! 56: * ! 57: * ! 58: * File: if_de6s.s ! 59: * Author: Robert V. Baron ! 60: */ ! 61: ! 62: #include <mach/machine/asm.h> ! 63: #undef DATA ! 64: ! 65: #include <i386at/if_de6c.h> ! 66: ! 67: P2ALIGN(2) ! 68: de6csetmemaddr: ! 69: movl 8(%ebp), %ebx /* addr */ ! 70: movb %bl, %al /* low byte; low nibble */ ! 71: salb $4, %al ! 72: orb $(RW_ADR), %al ! 73: outb %al, %dx ! 74: movl %edi, %ecx ! 75: 0: loop 0b ! 76: ! 77: movb %bl, %al /* low byte; high nibble */ ! 78: andb $0xf0, %al ! 79: orb $(RW_ADR|STROBE), %al ! 80: outb %al, %dx ! 81: movl %edi, %ecx ! 82: 0: loop 0b ! 83: ! 84: movb %bh, %al /* high byte; low nibble */ ! 85: salb $4, %al ! 86: orb $(RW_ADR), %al ! 87: outb %al, %dx ! 88: movl %edi, %ecx ! 89: 0: loop 0b ! 90: ! 91: movb %bh, %al /* high byte; high nibble */ ! 92: andb $0xf0, %al ! 93: orb $(RW_ADR|STROBE), %al ! 94: outb %al, %dx ! 95: movl %edi, %ecx ! 96: 0: loop 0b ! 97: ret ! 98: ! 99: /* de6cwriteasm(address, buf, len, port, delay) */ ! 100: ENTRY(de6cwriteasm) ! 101: pushl %ebp ! 102: movl %esp, %ebp ! 103: pushl %edi ! 104: pushl %esi ! 105: pushl %ebx ! 106: movl 20(%ebp), %edx /* port */ ! 107: movl 24(%ebp), %edi /* delay */ ! 108: ! 109: call de6csetmemaddr ! 110: ! 111: cld ! 112: movl 16(%ebp), %ecx /* cnt */ ! 113: movl 12(%ebp), %esi /* source */ ! 114: ! 115: cmpl $1, %edi /* no delay/latency */ ! 116: je 2f ! 117: 1: lodsb /* leave delay/latency */ ! 118: pushl %ecx ! 119: movb %al, %bl /* high byte; low nibble */ ! 120: salb $4, %al ! 121: outb %al, %dx ! 122: movl %edi, %ecx ! 123: 0: loop 0b ! 124: ! 125: movb %bl, %al /* high byte; high nibble */ ! 126: andb $0xf0, %al ! 127: orb $(WRITE|STROBE), %al /* NB: WRITE == 0 */ ! 128: outb %al, %dx ! 129: movl %edi, %ecx ! 130: 0: loop 0b ! 131: popl %ecx ! 132: loop 1b ! 133: ! 134: popl %ebx ! 135: popl %esi ! 136: popl %edi ! 137: leave ! 138: ret ! 139: /* edi and ebx free */ ! 140: 2: lodsb ! 141: movb %al, %bl /* high byte; low nibble */ ! 142: salb $4, %al ! 143: outb %al, %dx ! 144: ! 145: movb %bl, %al /* high byte; high nibble */ ! 146: andb $0xf0, %al ! 147: orb $(WRITE|STROBE), %al /* NB: WRITE == 0 */ ! 148: outb %al, %dx ! 149: loop 2b ! 150: ! 151: 6: popl %ebx ! 152: popl %esi ! 153: popl %edi ! 154: leave ! 155: ret ! 156: ! 157: ! 158: /* de6creadasm(address, buf, len, port, delay) */ ! 159: ENTRY(de6creadasm) ! 160: pushl %ebp ! 161: movl %esp, %ebp ! 162: pushl %edi ! 163: pushl %esi ! 164: pushl %ebx ! 165: movl 20(%ebp), %edx /* port */ ! 166: movl 24(%ebp), %edi /* delay for desetmemaddr*/ ! 167: movl %edi, %esi /* delay; cause edi used by stosl */ ! 168: ! 169: call de6csetmemaddr ! 170: ! 171: cld ! 172: movl 16(%ebp), %ecx /* cnt */ ! 173: movl 12(%ebp), %edi /* destination */ ! 174: movw $0x0901, %bx /* bl = 1 = READ; bh = READ|STROBE */ ! 175: ! 176: #ifdef out_in ! 177: cmpl $1, %esi /* no delay/latency */ ! 178: je 2f ! 179: #endif /* out_in */ ! 180: 1: xorw %ax, %ax /* leave delay/latency */ ! 181: pushl %ecx ! 182: movb %bl, %al ! 183: outb %al, %dx ! 184: movl %esi, %ecx ! 185: 0: loop 0b ! 186: incw %dx /* inb from STAT == port + 1 */ ! 187: inb %dx, %al /* first byte high nibble goes into */ ! 188: decw %dx ! 189: salw $4, %ax /* ... low nibble formed byte */ ! 190: ! 191: movb %bh, %al ! 192: outb %al, %dx ! 193: movl %esi, %ecx ! 194: 0: loop 0b ! 195: incw %dx /* inb from STAT == port + 1 */ ! 196: inb %dx, %al /* second byte high nibble goes into */ ! 197: decw %dx ! 198: andb $0xf0, %al /* ... high nibble formed byte */ ! 199: orb %ah, %al ! 200: stosb ! 201: popl %ecx ! 202: loop 1b ! 203: ! 204: popl %ebx ! 205: popl %esi ! 206: popl %edi ! 207: leave ! 208: ret ! 209: ! 210: 2: xorw %ax, %ax /* leave delay/latency */ ! 211: movb %bl, %al ! 212: outb %al, %dx ! 213: incw %dx /* inb from STAT == port + 1 */ ! 214: inb %dx, %al /* high nibble goes into low nibble */ ! 215: decw %dx ! 216: salw $4, %ax ! 217: ! 218: movb %bh, %al ! 219: outb %al, %dx ! 220: incw %dx /* inb from STAT == port + 1 */ ! 221: inb %dx, %al ! 222: decw %dx ! 223: andb $0xf0, %al ! 224: orb %ah, %al ! 225: stosb ! 226: loop 2b ! 227: ! 228: popl %ebx ! 229: popl %esi ! 230: popl %edi ! 231: leave ! 232: ret ! 233: ! 234: ! 235: #ifdef unroll_wins ! 236: unrolled loop for write iff no delay ! 237: 2: lodsl ! 238: movl %eax, %ebx /* byte one; low nibble */ ! 239: salb $4, %al ! 240: outb %al, %dx ! 241: ! 242: movb %bl, %al /* byte one; high nibble */ ! 243: andb $0xf0, %al ! 244: orb $8, %al ! 245: outb %al, %dx ! 246: loop 3f ! 247: jmp 6f ! 248: 3: sarl $8, %ebx ! 249: movb %bl, %al /* byte two; low nibble */ ! 250: salb $4, %al ! 251: outb %al, %dx ! 252: ! 253: movb %bl, %al /* byte two; high nibble */ ! 254: andb $0xf0, %al ! 255: orb $8, %al ! 256: outb %al, %dx ! 257: loop 4f ! 258: jmp 6f ! 259: 4: sarl $8, %ebx ! 260: movb %bl, %al /* byte three; low nibble */ ! 261: salb $4, %al ! 262: outb %al, %dx ! 263: ! 264: movb %bl, %al /* byte three; high nibble */ ! 265: andb $0xf0, %al ! 266: orb $8, %al ! 267: outb %al, %dx ! 268: loop 5f ! 269: jmp 6f ! 270: 5: sarl $8, %ebx ! 271: movb %bl, %al /* byte three; low nibble */ ! 272: salb $4, %al ! 273: outb %al, %dx ! 274: ! 275: movb %bl, %al /* byte four; high nibble */ ! 276: andb $0xf0, %al ! 277: orb $8, %al ! 278: outb %al, %dx ! 279: loop 2b ! 280: #endif /* unroll_wins */ ! 281:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.