/****************************************************************************** ******************************************************************************* W E G A - Quelle KERN 3.2 Modul: break.c Bearbeiter: O. Lehmann Datum: 30.05.08 Version: 1.0 ******************************************************************************* ******************************************************************************/ char breakwstr[] = "@[$]break.c Rev : 4.1 08/27/83 11:54:02"; #include #include #include #include #include #include #include #include #include #include #include #include sbreak() { register int l,r; register unsigned i; struct a { saddr_t segaddr; } *uap; uap = (struct a *)u.u_ap; r = lbtoc((long)uap->segaddr.right); if(u.u_segmented) { if(!uap->segaddr.l) { for(i=0;isegaddr.left >> 8; for(i=0;ipar1; for(i=0;ipar2); if(a) { break_handler(j,b+a,i); if(u.u_error) return; } u.u_r.r_val1 = uap->par1<<8; u.u_r.r_val2 = b<<8; } break_handler(l,r,i) register int l; register unsigned r; register int i; { register int foo1,foo2,b; int size; struct proc *p; p = u.u_procp; if(r > 0x100) { u.u_error = ENOMEM; return; } if(u.u_segmented) { if(!u.u_segmts[i].sg_limit && u.u_segmts[i].sg_attr&0x14) b=r; else b=r-(u.u_segmts[i].sg_limit+1); if((u.u_tsize + USIZE + u.u_dsize + u.u_ssize + b) > umemory) { u.u_error = ENOMEM; return; } size = p->p_addr + p->p_size; if(!u.u_segmts[i].sg_limit && u.u_segmts[i].sg_attr&0x14) size -= u.u_segmts[i].sg_base; else size -= u.u_segmts[i].sg_base+u.u_segmts[i].sg_limit+1; sestabur(r,u.u_segno[i],i,0); if(u.u_error) return; u.u_dsize += b; shufflecore(p->p_size+b,p->p_size,size); } else { b = r - u.u_dsize; if(estabur(u.u_tsize,r,u.u_ssize,1)) return; u.u_dsize = r; shufflecore(p->p_size+b,p->p_size,u.u_ssize); } } shufflecore(a,b,c) register a,b,c; { register d,e; e=a-b; if(e>0) { expand(a); d=u.u_procp->p_addr+a; while(c--) { d--; copyseg(d-e,d); } while(e--){ d--; clearseg(d); } } else { if(e<0) { while(c--) { copyseg((u.u_procp->p_addr+b-1)-c,(u.u_procp->p_addr+a-1)-c); } expand(a); } } if(!u.u_segmented) return; invsdrs(); segureg(); }