|
|
1.1 ! root 1: /* Console Processor Interface */ ! 2: /* Tahoe version, Nov. 1982 */ ! 3: ! 4: /****************************************/ ! 5: /* */ ! 6: /* Reduced DCB layout for byte */ ! 7: /* communication. */ ! 8: /* */ ! 9: /****************************************/ ! 10: ! 11: asm(".set CPMDCB,21"); ! 12: asm(".set DC_OFF,2"); ! 13: asm(".set DC_ON,1"); ! 14: asm(".set DCR,27"); ! 15: asm(".set PDCS,28"); ! 16: asm(".set CTL_SW,0x41b"); /* Addr of switches to turn on Cache, MME, Fault */ ! 17: long tmp_lw; ! 18: ! 19: ! 20: #define CPBUFLEN 200 /* Output buffer length */ ! 21: struct cphdr ! 22: { ! 23: char cp_unit; /* Done bit & unit # */ ! 24: char cp_comm; /* Command */ ! 25: short cp_count; /* Counter (when relevant) */ ! 26: }; ! 27: ! 28: struct cpdcb_o /* Output structure */ ! 29: { ! 30: struct cphdr cp_hdr; ! 31: char cp_buf[CPBUFLEN]; /* Buffer for output or 'stty' */ ! 32: }; ! 33: ! 34: struct cpdcb_i /* Structure for input */ ! 35: { ! 36: struct cphdr cp_hdr; ! 37: char cpi_buf[4]; /* Buffer for input */ ! 38: }; ! 39: ! 40: #define CPDONE 0x80 /* 'Done' bit in cp_unit */ ! 41: #define CPTAKE 0x40 /* CP 'ack' to this cpdcb */ ! 42: ! 43: /* Values for 'unit' */ ! 44: #define CPUNIT 0 /* The CP itself */ ! 45: #define CPCONS 1 /* Console line */ ! 46: #define CPREMOT 2 /* Remote line */ ! 47: ! 48: /* Values for 'command' */ ! 49: #define CPRESET 0 ! 50: #define CPWRITE 1 ! 51: #define CPREAD 2 ! 52: #define CPSTTY 3 ! 53: #define CPBOOT 4 ! 54: ! 55: ! 56: /* Put a char to CPU2 console */ ! 57: ! 58: #define NCHAR 1 ! 59: ! 60: long cpbuf_sz = 1; /* Buffer size */ ! 61: long charcnt = 0; ! 62: struct cpdcb_o cpout; /* DCB for output */ ! 63: ! 64: asm(".set HISR,0x410"); ! 65: ! 66: putchar(c) ! 67: { ! 68: cpout.cp_hdr.cp_unit = CPCONS; /* Reset done bit */ ! 69: cpout.cp_hdr.cp_comm = CPWRITE; /* Set command */ ! 70: cpout.cp_buf[charcnt] = c; ! 71: if (cpbuf_sz <= 1) ! 72: { /* Char I/O mode */ ! 73: cpout.cp_hdr.cp_count = 1; ! 74: cp_poll(c); ! 75: } ! 76: else ! 77: { ! 78: charcnt++; ! 79: if (((charcnt+1) > cpbuf_sz) || (c == '\n') || (c == '\r')) ! 80: { /* buffer full, print it */ ! 81: charcnt = 0; ! 82: cpout.cp_hdr.cp_count = cpbuf_sz; ! 83: cp_poll(c); ! 84: } ! 85: } ! 86: asm("movl $0,*$HISR"); /* Mask out console xmit int */ ! 87: } ! 88: ! 89: cp_poll(c) ! 90: char c; ! 91: { register long time; ! 92: ! 93: asm("andl3 *$0x418,$0x8,_tmp_lw"); ! 94: if (tmp_lw) /* Data cache ON */ ! 95: asm("mtpr $DC_OFF,$DCR"); /* Turn data cache OFF */ ! 96: time = 0x1ff0000; ! 97: asm("movab _cpout,r10"); ! 98: asm("andl2 $0xffffff,r10"); ! 99: asm("mtpr r10,$CPMDCB"); ! 100: tmp_lw = (long)(&cpout.cp_hdr.cp_unit); ! 101: while (time-- && !(cpout.cp_hdr.cp_unit & CPDONE)); ! 102: if (!(cpout.cp_hdr.cp_unit & CPDONE)) cp_hlt(); /* Time out */ ! 103: if (c== '\n') putchar('\r'); ! 104: if (tmp_lw) /* Data cache was ON */ ! 105: asm("mtpr $DC_ON,$DCR"); /* Turn data cache back ON */ ! 106: } ! 107: ! 108: cp_hlt() ! 109: { ! 110: asm("movl $0xeeeeeeee,r0"); ! 111: asm("movl $0xeeeeeeee,r1"); ! 112: asm("movl $0xeeeeeeee,r2"); ! 113: asm("movl $0xeeeeeeee,r3"); ! 114: asm("movl $0xeeeeeeee,r4"); ! 115: asm("movl $0xeeeeeeee,r5"); ! 116: asm("movl $0xeeeeeeee,r6"); ! 117: asm("movl $0xeeeeeeee,r7"); ! 118: asm("movl $0xeeeeeeee,r8"); ! 119: asm("halt"); ! 120: } ! 121:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.