|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 2775 (0xad7) Types: TextFile Notes: UNIX file Names: »drect.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦2d53db1df⟧ UNIX Filesystem └─ ⟦this⟧ »hr/src/desk/drect.c«
#include "desk.h" BITMAP dskBitmap = { SEG0, DIS_WIDTH, XMIN, YMIN, XMAX, YMAX }; RECT dskClip = { XMIN, YMIN, XMAX, YMAX }; static uint Mask[BPW+1] = { 0xffff, 0x7fff, 0x3fff, 0x1fff, 0x0fff, 0x07ff, 0x03ff, 0x01ff, 0x00ff, 0x007f, 0x003f, 0x001f, 0x000f, 0x0007, 0x0003, 0x0001, 0x0000 }; static rectNDST(vp, lmask, rmask, nwd, dy) register uint lmask, rmask, *vp; register int nwd; int dy; { register int n; extern uint *addptr(); while ( dy-- ) { *vp = (~*vp & lmask) + (*vp & ~lmask); for ( n=nwd ; n>0 ; n-- ) { vp = addptr(vp, sizeof(int)); *vp = ~*vp; } if ( nwd >= 0 ) { vp = addptr(vp, sizeof(int)); *vp = (~*vp & rmask) + (*vp & ~rmask); } vp = addptr(vp, (DIS_WIDTH/BPW - nwd - 1) << 1); } } static rectCLR(vp, lmask, rmask, nwd, dy) register uint lmask, rmask, *vp; register int nwd; int dy; { register int n; extern uint *addptr(); while ( dy-- ) { *vp |= lmask; for ( n=nwd ; n>0 ; n-- ) *++vp = 0xffff; if ( nwd >= 0 ) *++vp |= rmask; vp = addptr(vp, (DIS_WIDTH/BPW - nwd - 1) << 1); } } /* ** Blit the rectangular area given by the rectangle *r, ** in physical coordinates. */ D_Rect(r, op) RECT *r; int op; { RECT rect; uint lmask, rmask; register uint *vp; register int nwd, ny; rect = R_Intersection(*r, dskBitmap.rect); if ( R_null(rect) ) return; ny = rect.corner.y - rect.origin.y; lmask = Mask[(BPW-1) & rect.origin.x]; rmask = ~Mask[((BPW - 1) & (rect.corner.x - 1)) + 1]; nwd = ((rect.corner.x - 1) >> SBPW) - (rect.origin.x >> SBPW) - 1; if ( rect.origin.y >= YSPLIT ) vp = SEG1 + (rect.origin.y-YSPLIT)*(DIS_WIDTH/BPW); else vp = SEG0 + rect.origin.y*(DIS_WIDTH/BPW); vp += rect.origin.x >> SBPW; if ( nwd == -1 ) lmask &= rmask; ioctl(myfd, CIOMSEOFF); (*( op == L_NDST ? rectNDST : rectCLR ))(vp, lmask, rmask, nwd, ny); ioctl(myfd, CIOMSEON); } /* ** Frame the rectangle with a thickness of "n" */ D_Frame(r, n) register RECT *r; register unsigned n; { RECT rect; if ( R_null(*r) ) return; if ( n > 8 ) n = 8; if ( n >= r->corner.x - r->origin.x || n >= r->corner.y - r->origin.y ) { InvertRect(r); return; } rect.origin.x = r->origin.x; rect.origin.y = r->origin.y; rect.corner.x = r->corner.x; rect.corner.y = r->origin.y + n; InvertRect(&rect); rect.origin.x = r->origin.x; rect.origin.y = r->corner.y - n; rect.corner.x = r->corner.x; rect.corner.y = r->corner.y; InvertRect(&rect); rect.origin.x = r->origin.x; rect.origin.y = r->origin.y + n; rect.corner.x = r->origin.x + n; rect.corner.y = r->corner.y -n; InvertRect(&rect); rect.origin.x = r->corner.x - n; rect.origin.y = r->origin.y + n; rect.corner.x = r->corner.x; rect.corner.y = r->corner.y - n; InvertRect(&rect); }