home *** CD-ROM | disk | FTP | other *** search
- /* ChipMunch - Move the first 512K of chip memory after the rest - Bryan Ford */
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <exec/execbase.h>
- #include <dos/dosextens.h>
- #include <workbench/startup.h>
- #include <proto/exec.h>
- #include <bry/macros.h>
-
- struct ExecBase *SysBase;
-
- struct Process *proc;
-
- int __saveds entry(void)
- {
- struct MemHeader *mh, *nmh;
- struct MemChunk *mc, *nmc;
- struct WBStartup *wbs = 0L;
- int ret = 10;
-
- SysBase = *((struct ExecBase**)4);
- proc = FindTask(0L);
-
- if(!(proc->pr_CLI))
- {
- WaitPort(&proc->pr_MsgPort);
- wbs = GetMsg(&proc->pr_MsgPort);
- }
-
- Forbid();
- for(mh = SysBase->MemList.lh_Head;;mh = mh->mh_Node.ln_Succ)
- {
- if(!(mh->mh_Node.ln_Succ))
- break;
- if((mh->mh_Lower < (void*)0x40000) && (mh->mh_Upper > (void*)0x80000) && (mh->mh_Attributes & MEMF_CHIP))
- {
- if(!(nmh = AllocAbs(sizeof(*nmh),(void*)0x80000)))
- break;
- memset(nmh,0,sizeof(*nmh));
- nmh->mh_Node.ln_Type = NT_MEMORY;
- nmh->mh_Node.ln_Pri = mh->mh_Node.ln_Pri+1;
- nmh->mh_Attributes = mh->mh_Attributes;
- for(mc = mh->mh_First;;mc = nmc)
- {
- if(!mc)
- break;
- if((long)(nmc = mc->mc_Next) > (long)nmh)
- {
- mc->mc_Next = 0L;
- nmh->mh_First = nmc;
- nmh->mh_Upper = mh->mh_Upper;
- mh->mh_Upper = nmh;
- nmh->mh_Lower = nmh+1;
- for(mc = nmc;mc;mc = mc->mc_Next)
- {
- mh->mh_Free -= mc->mc_Bytes;
- nmh->mh_Free += mc->mc_Bytes;
- }
- Insert(&SysBase->MemList,nmh,mh->mh_Node.ln_Pred->ln_Pred ? mh->mh_Node.ln_Pred : 0L);
- ret = 0;
- break;
- }
- }
- break;
- }
- }
- Permit();
-
- if(wbs)
- {
- Forbid();
- ReplyMsg(wbs);
- }
- return(ret);
- }
-
-