if (DISK_DELAY) { extern int disk_interrupt_delay; if (disk_interrupt_delay) { if (--disk_interrupt_delay == 0) { disk_throw_interrupt(); }}} if (trace_pt && p0_pc == trace_pt && trace == 0 && prom_enabled_flag == 0) { if (trace_pt_count) { if (--trace_pt_count == 0) trace = 1; } else { trace = 1; } if (trace) printf("trace on\n"); } /* * map virtual address to physical address, * possibly returning l1 mapping * possibly returning offset into page */ inline unsigned int map_vtop(unsigned int virt, int *pl1_map, int *poffset) { int l1_index, l2_index, l1; unsigned int l2; /* 24 bit address */ virt &= 077777777; /* frame buffer */ if ((virt & 077700000) == 077000000) { /* 077000000, size = 210560(8) */ if (virt >= 077051757 && virt <= 077051763) { traceio("disk run light\n"); } else { if (0) traceio("tv: frame buffer %o\n", virt); } if (poffset) *poffset = virt & 0377; return (1 << 22) | (1 << 23) | 036000; } /* color */ if ((virt & 077700000) == 077200000) { if (poffset) *poffset = virt & 0377; return (1 << 22) | (1 << 23) | 036000; } /* this should be move below - I'm not sure it has to happen anymore */ if ((virt & 077777400) == 077377400) { if (0) traceio("forcing xbus mapping for disk\n"); if (poffset) *poffset = virt & 0377; return (1 << 22) | (1 << 23) | 036777; } /* 764000-7641777 i/o board 764140 chaos (77772060) */ /* 11 bit l1 index */ l1_index = (virt >> 13) & 03777; l1 = l1_map[l1_index] & 037; if (pl1_map) *pl1_map = l1; /* 10 bit l2 index */ l2_index = (l1 << 5) | ((virt >> 8) & 037); l2 = l2_map[l2_index]; if (poffset) *poffset = virt & 0377; last_virt = virt & 0xffffff00; last_l1 = l1; last_l2 = l2; if ((virt & 0077777000) == 0076776000) { printf("vtop: pdl? %011o l1 %d %011o l2 %d %011o\n", virt, l1_index, l1, l2_index, l2); } return l2; }