#include #include #include #include #include #include #include #include "vidlib.h" /* video to video copy, 16 colors, planar */ int Vcopy16(unsigned dx, unsigned dy, unsigned sx, unsigned sy, unsigned sdx, unsigned sdy) { char *dest; char *src; unsigned yo; int oldWmode; /* check parameters */ if ( (dx+sdx > _screen_width) || (sx+sdx > _screen_width) || (dy+sdy > _memory_length) || (sy+sdy > _memory_length) || ((long)(sdx * sdy) > 0xFFFFL ) ) return(0); if ( vgadebug != NULL ) { sprintf(tdbg,"Vc16: dx=%u, dy=%u, sx=%u, sy=%u, sdx=%u, sdy=%u\n", dx, dy, sx, sy, sdx, sdy); fputs(tdbg,vgadebug); } oldWmode=What_Wmode(); Select_Wmode(1); dest=(char *)normalize(_screen_start + dy*_screen_width + dx); src=(char *)normalize(_screen_start + sy*_screen_width + sx); if ( vgadebug != NULL ) { sprintf(tdbg," : dest=%Fp, src=%Fp, m1=%u, m2=%u\n", dest, src, oldWmode, What_Wmode()); fputs(tdbg,vgadebug); } for (yo=0; yo < sdy; yo++) { /* must use a byte-at-a-time copy only here! */ memcpyb(dest, src, sdx); dest=(char *)normalize(dest + _screen_width); src=(char *)normalize(src + _screen_width); } Select_Wmode(oldWmode); return(1); } /* Memory to video copy, 16 color, planar memory to planar video */ int Vdisp16( unsigned dx, unsigned dy, char *s, unsigned sw, unsigned sl, unsigned sx, unsigned sy, unsigned sdx, unsigned sdy) { char far *dest; char far *src; unsigned yo; /* check parameters */ if ( ( dx+sdx > _screen_width) || (dy+sdy > _memory_length) || ( sx+sdx > sw) || (sy+sdy > sl) ) { printf("Invalid parameters to Vdisp16\n"); return(0); } dest=(char *)normalize(_screen_start + dy*_screen_width + dx); src=(char *)normalize(s + sy*sw*4 + sx); if ( vgadebug != NULL ) { sprintf(tdbg,"Vd16: dx=%u, dy=%u, s=%Fp, sw=%u, sl=%u, sx=%u\n" " sy=%u, sdx=%u, sdy=%u\n", dx, dy, s, sw, sl, sx, sy, sdx, sdy); fputs(tdbg,vgadebug); sprintf(tdbg," : dest=%Fp, src=%Fp\nGC[0]=%x, GC[1]=%x, GC[2]=%u" ", GC[3]=%u, GC[5]=%u, GC[8]=%x\n", dest, src, GCread_reg(0), GCread_reg(1), GCread_reg(2), GCread_reg(3), GCread_reg(5), GCread_reg(8)); fputs(tdbg,vgadebug); } Select_Wmode(0); for (yo=0; yo < sdy; yo++) { Select_WPlane(WPlane0); memcpy(dest,src,sdx); src=(char *)normalize(src + sw); Select_WPlane(WPlane1); memcpy(dest,src,sdx); src=(char *)normalize(src + sw); Select_WPlane(WPlane2); memcpy(dest,src,sdx); src=(char *)normalize(src + sw); Select_WPlane(WPlane3); memcpy(dest,src,sdx); dest=(char *)normalize(dest + _screen_width); src=(char *)normalize(src + sw); } Select_WPlane(WPlaneALL); return(1); } /* Video to Memory copy, 16 color, planar video to planar memory */ int Vcapt16( char far *d, unsigned dw, unsigned dl, unsigned dx, unsigned dy, unsigned sx, unsigned sy, unsigned sdx, unsigned sdy) { char far *dest; char far *src; unsigned yo; /* check parameters */ if ( ( sx+sdx > _screen_width) || (sy+sdy > _memory_length) || ( dx+sdx > dw) || (dy+sdy > dl) ) { printf("Invalid parameters to Vdisp16\n"); return(0); } src=(char *)normalize(_screen_start + sy*_screen_width + sx); dest=(char *)normalize(d + dy*dw*4 + dx); if ( vgadebug != NULL ) { sprintf(tdbg,"Vct16: d=%Fp, dw=%u, dl=%u, dx=%u, dy=%u\n" " sx=%u, sy=%u, sdx=%u, sdy=%u\n", d, dw, dl, dx, dy, sx, sy, sdx, sdy); fputs(tdbg,vgadebug); sprintf(tdbg," : dest=%Fp, src=%Fp\n", dest, src); fputs(tdbg,vgadebug); } for (yo=0; yo < sdy; yo++) { Select_RPlane(0); memcpy(dest, src, sdx); dest=(char *)normalize(dest + dw); Select_RPlane(1); memcpy(dest, src, sdx); dest=(char *)normalize(dest + dw); Select_RPlane(2); memcpy(dest, src, sdx); dest=(char *)normalize(dest + dw); Select_RPlane(3); memcpy(dest, src, sdx); src=(char *)normalize(src + _screen_width); dest=(char *)normalize(dest + dw); } return(1); }