Annotation of Net2/arch/i386/boot/io.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Ported to boot 386BSD by Julian Elischer ([email protected]) Sept 1992
                      3:  *
                      4:  * Mach Operating System
                      5:  * Copyright (c) 1992, 1991 Carnegie Mellon University
                      6:  * All Rights Reserved.
                      7:  * 
                      8:  * Permission to use, copy, modify and distribute this software and its
                      9:  * documentation is hereby granted, provided that both the copyright
                     10:  * notice and this permission notice appear in all copies of the
                     11:  * software, derivative works or modified versions, and any portions
                     12:  * thereof, and that both notices appear in supporting documentation.
                     13:  * 
                     14:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     15:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     16:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     17:  * 
                     18:  * Carnegie Mellon requests users of this software to return to
                     19:  * 
                     20:  *  Software Distribution Coordinator  or  [email protected]
                     21:  *  School of Computer Science
                     22:  *  Carnegie Mellon University
                     23:  *  Pittsburgh PA 15213-3890
                     24:  * 
                     25:  * any improvements or extensions that they make and grant Carnegie Mellon
                     26:  * the rights to redistribute these changes.
                     27:  */
                     28: 
                     29: /*
                     30:  * HISTORY
                     31:  * $Log: io.c,v $
                     32:  * Revision 1.1  1993/03/21 18:08:38  cgd
                     33:  * after 0.2.2 "stable" patches applied
                     34:  *
                     35:  * Revision 2.2  92/04/04  11:35:57  rpd
                     36:  *     Fixed for IBM L40's A20 initialization.
                     37:  *     [92/03/30            rvb]
                     38:  * 
                     39:  *     Created.
                     40:  *     [92/03/30            mg32]
                     41:  * 
                     42:  */
                     43: 
                     44: #include <i386/include/pio.h>
                     45: 
                     46: #define K_RDWR                 0x60            /* keyboard data & cmds (read/write) */
                     47: #define K_STATUS       0x64            /* keyboard status */
                     48: #define K_CMD          0x64            /* keybd ctlr command (write-only) */
                     49: 
                     50: #define K_OBUF_FUL     0x01            /* output buffer full */
                     51: #define K_IBUF_FUL     0x02            /* input buffer full */
                     52: 
                     53: #define KC_CMD_WIN     0xd0            /* read  output port */
                     54: #define KC_CMD_WOUT    0xd1            /* write output port */
                     55: #define KB_A20         0x9f            /* enable A20,
                     56:                                           enable output buffer full interrupt
                     57:                                           enable data line
                     58:                                           disable clock line */
                     59: 
                     60: /*
                     61:  * Gate A20 for high memory
                     62:  */
                     63: unsigned char  x_20 = KB_A20;
                     64: gateA20()
                     65: {
                     66: #ifdef IBM_L40
                     67:        outb(0x92, 0x2);
                     68: #else  IBM_L40
                     69:        while (inb(K_STATUS) & K_IBUF_FUL);
                     70:        while (inb(K_STATUS) & K_OBUF_FUL)
                     71:                (void)inb(K_RDWR);
                     72: 
                     73:        outb(K_CMD, KC_CMD_WOUT);
                     74:        while (inb(K_STATUS) & K_IBUF_FUL);
                     75:        outb(K_RDWR, x_20);
                     76:        while (inb(K_STATUS) & K_IBUF_FUL);
                     77: #endif IBM_L40
                     78: }
                     79: 
                     80: /* printf - only handles %d as decimal, %c as char, %s as string */
                     81: 
                     82: printf(format,data)
                     83:      char *format;
                     84:      int data;
                     85: {
                     86:        int *dataptr = &data;
                     87:        char c;
                     88:        while (c = *format++)
                     89:                if (c != '%')
                     90:                        putchar(c);
                     91:                else
                     92:                        switch (c = *format++) {
                     93:                              case 'd': {
                     94:                                      int num = *dataptr++;
                     95:                                      char buf[10], *ptr = buf;
                     96:                                      if (num<0) {
                     97:                                              num = -num;
                     98:                                              putchar('-');
                     99:                                      }
                    100:                                      do
                    101:                                              *ptr++ = '0'+num%10;
                    102:                                      while (num /= 10);
                    103:                                      do
                    104:                                              putchar(*--ptr);
                    105:                                      while (ptr != buf);
                    106:                                      break;
                    107:                              }
                    108:                              case 'x': {
                    109:                                      int num = *dataptr++, dig;
                    110:                                      char buf[8], *ptr = buf;
                    111:                                      do
                    112:                                              *ptr++ = (dig=(num&0xf)) > 9?
                    113:                                                        'a' + dig - 10 :
                    114:                                                        '0' + dig;
                    115:                                      while (num >>= 4);
                    116:                                      do
                    117:                                              putchar(*--ptr);
                    118:                                      while (ptr != buf);
                    119:                                      break;
                    120:                              }
                    121:                              case 'c': putchar((*dataptr++)&0xff); break;
                    122:                              case 's': {
                    123:                                      char *ptr = (char *)*dataptr++;
                    124:                                      while (c = *ptr++)
                    125:                                              putchar(c);
                    126:                                      break;
                    127:                              }
                    128:                        }
                    129: }
                    130: 
                    131: putchar(c)
                    132: {
                    133:        if (c == '\n')
                    134:                putc('\r');
                    135:        putc(c);
                    136: }
                    137: 
                    138: getchar()
                    139: {
                    140:        int c;
                    141: 
                    142:        if ((c=getc()) == '\r')
                    143:                c = '\n';
                    144:        if (c == '\b') {
                    145:                putchar('\b');
                    146:                putchar(' ');
                    147:        }
                    148:        putchar(c);
                    149:        return(c);
                    150: }
                    151: 
                    152: gets(buf)
                    153: char *buf;
                    154: {
                    155:        int     i;
                    156:        char *ptr=buf;
                    157: 
                    158:        for (i = 240000; i>0; i--)
                    159:                if (ischar())
                    160:                        for (;;)
                    161:                                switch(*ptr = getchar() & 0xff) {
                    162:                                      case '\n':
                    163:                                      case '\r':
                    164:                                        *ptr = '\0';
                    165:                                        return 1;
                    166:                                      case '\b':
                    167:                                        if (ptr > buf) ptr--;
                    168:                                        continue;
                    169:                                      default:
                    170:                                        ptr++;
                    171:                                }
                    172:        return 0;
                    173: }
                    174: 
                    175: strcmp(s1, s2)
                    176: char *s1, *s2;
                    177: {
                    178:        while (*s1 == *s2) {
                    179:                if (!*s1++)
                    180:                        return 0;
                    181:                s2++;
                    182:        }
                    183:        return 1;
                    184: }
                    185: 
                    186: bcopy(from, to, len)
                    187: char *from, *to;
                    188: int len;
                    189: {
                    190:        while (len-- > 0)
                    191:                *to++ = *from++;
                    192: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.