static void CGA4_CopyRow(Bit8u cleft,Bit8u cright,Bit8u rold,Bit8u rnew,PhysPt base) { Bit8u cheight = real_readb(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT); PhysPt dest=base+((CurMode->twidth*rnew)*(cheight/2)+cleft)*2; PhysPt src=base+((CurMode->twidth*rold)*(cheight/2)+cleft)*2; Bitu copy=(Bitu)(cright-cleft)*2u;Bitu nextline=(Bitu)CurMode->twidth*2u; for (Bitu i=0;i<cheight/2U;i++) { MEM_BlockCopy(dest,src,copy); MEM_BlockCopy(dest+8*1024,src+8*1024,copy); dest+=nextline;src+=nextline; } }
static void PC98_CopyRow(Bit8u cleft,Bit8u cright,Bit8u rold,Bit8u rnew,PhysPt base) { PhysPt src,dest; /* character data */ src=base+(rold*CurMode->twidth+cleft)*2; dest=base+(rnew*CurMode->twidth+cleft)*2; MEM_BlockCopy(dest,src,(Bitu)(cright-cleft)*2u); /* attribute data */ MEM_BlockCopy(dest+0x2000,src+0x2000,(Bitu)(cright-cleft)*2u); }
void DOS_PSP::SetCommandTail(RealPt src) { if (src) { // valid source MEM_BlockCopy(pt+offsetof(sPSP,cmdtail),Real2Phys(src),CTBUF+1); } else { // empty sSave(sPSP,cmdtail.count,0x00); mem_writeb(pt+offsetof(sPSP,cmdtail.buffer),0x0d); }; }
static void TANDY16_CopyRow(Bit8u cleft,Bit8u cright,Bit8u rold,Bit8u rnew,PhysPt base) { Bit8u cheight = real_readb(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT); Bit8u banks=CurMode->twidth/10; PhysPt dest=base+((CurMode->twidth*rnew)*(cheight/banks)+cleft)*4; PhysPt src=base+((CurMode->twidth*rold)*(cheight/banks)+cleft)*4; Bitu copy=(Bitu)(cright-cleft)*4u;Bitu nextline=(Bitu)CurMode->twidth*4u; for (Bitu i=0;i<static_cast<Bitu>(cheight/banks);i++) { for (Bitu b=0;b<banks;b++) MEM_BlockCopy(dest+b*8*1024,src+b*8*1024,copy); dest+=nextline;src+=nextline; } }
static void MCGA2_CopyRow(Bit8u cleft,Bit8u cright,Bit8u rold,Bit8u rnew,PhysPt base) { Bit8u cheight = real_readb(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT); PhysPt dest=base+((CurMode->twidth*rnew)*cheight+cleft); PhysPt src=base+((CurMode->twidth*rold)*cheight+cleft); Bitu copy=(Bitu)(cright-cleft); Bitu nextline=CurMode->twidth; for (Bitu i=0;i<cheight;i++) { MEM_BlockCopy(dest,src,copy); dest+=nextline;src+=nextline; } }
static bool MakeEnv(char * name,Bit16u * segment) { /* If segment to copy environment is 0 copy the caller's environment */ DOS_PSP psp(dos.psp()); PhysPt envread,envwrite; Bit16u envsize=1; bool parentenv=true; if (*segment==0) { if (!psp.GetEnvironment()) parentenv=false; //environment seg=0 envread=PhysMake(psp.GetEnvironment(),0); } else { if (!*segment) parentenv=false; //environment seg=0 envread=PhysMake(*segment,0); } if (parentenv) { for (envsize=0; ;envsize++) { if (envsize>=MAXENV - ENV_KEEPFREE) { DOS_SetError(DOSERR_ENVIRONMENT_INVALID); return false; } if (mem_readw(envread+envsize)==0) break; } envsize += 2; /* account for trailing \0\0 */ } Bit16u size=long2para(envsize+ENV_KEEPFREE); if (!DOS_AllocateMemory(segment,&size)) return false; envwrite=PhysMake(*segment,0); if (parentenv) { MEM_BlockCopy(envwrite,envread,envsize); // mem_memcpy(envwrite,envread,envsize); envwrite+=envsize; } else { mem_writeb(envwrite++,0); } mem_writew(envwrite,1); envwrite+=2; char namebuf[DOS_PATHLENGTH]; if (DOS_Canonicalize(name,namebuf)) { MEM_BlockWrite(envwrite,namebuf,strlen(namebuf)+1); return true; } else return false; }
bool MEM_ReAllocatePages(MemHandle & handle,Bitu pages,bool sequence) { if (handle<=0) { if (!pages) return true; handle=MEM_AllocatePages(pages,sequence); return (handle>0); } if (!pages) { MEM_ReleasePages(handle); handle=-1; return true; } MemHandle index=handle; MemHandle last;Bitu old_pages=0; while (index>0) { old_pages++; last=index; index=memory.mhandles[index]; } if (old_pages == pages) return true; if (old_pages > pages) { /* Decrease size */ pages--;index=handle;old_pages--; while (pages) { index=memory.mhandles[index]; pages--;old_pages--; } MemHandle next=memory.mhandles[index]; memory.mhandles[index]=-1; index=next; while (old_pages) { next=memory.mhandles[index]; memory.mhandles[index]=0; index=next; old_pages--; } return true; } else { /* Increase size, check for enough free space */ Bitu need=pages-old_pages; if (sequence) { index=last+1; Bitu free=0; while ((index<(MemHandle)memory.pages) && !memory.mhandles[index]) { index++;free++; } if (free>=need) { /* Enough space allocate more pages */ index=last; while (need) { memory.mhandles[index]=index+1; need--;index++; } memory.mhandles[index]=-1; return true; } else { /* Not Enough space allocate new block and copy */ MemHandle newhandle=MEM_AllocatePages(pages,true); if (!newhandle) return false; MEM_BlockCopy(newhandle*4096,handle*4096,old_pages*4096); MEM_ReleasePages(handle); handle=newhandle; return true; } } else { MemHandle rem=MEM_AllocatePages(need,false); if (!rem) return false; memory.mhandles[last]=rem; return true; } } return 0; }
void DOS_PSP::SetFCB2(RealPt src) { if (src) MEM_BlockCopy(PhysMake(seg,offsetof(sPSP,fcb2)),Real2Phys(src),16); }
static void TEXT_CopyRow(Bit8u cleft,Bit8u cright,Bit8u rold,Bit8u rnew,PhysPt base) { PhysPt src,dest; src=base+(rold*CurMode->twidth+cleft)*2u; dest=base+(rnew*CurMode->twidth+cleft)*2u; MEM_BlockCopy(dest,src,(Bitu)(cright-cleft)*2u); }