|
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 - metrics - download
Length: 2698 (0xa8a) Types: TextFile Notes: UNIX file Names: »dopen.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦2d53db1df⟧ UNIX Filesystem └─⟦this⟧ »hr/src/desk/dopen.c«
#include "desk.h" uint dskHptop; /* 1st free word of heap */ uint dskHeap[HEAP]; /* the heap itself */ /* ** D_Open(r) - ** ** Open a "window" on the screen within the given physical rectangle. ** The underlying bitmap is saved on the heap and the rectangle is cleared. ** Nothing is opened if the heap is too full. ** ** Exit: -1, if bad, else old top-of-heap marker */ int D_Open(r) RECT *r; { register uint *sip, *dip; register uint trx; register uint rx, ry; uint sx, n; sx = words_between(XMIN, XMAX); rx = words_between(r->origin.x, r->corner.x); ry = r->corner.y - r->origin.y; n = rx*ry; if ( !n ) return dskHptop; if ( HEAP - dskHptop < n ) { printf("OUT OF HEAP\n"); return -1; } /* Turn mouse off */ #ifdef DEBUG printf("D_OPEN:\trect (%d,%d)(%d,%d), dskHptop %d, wwide %d, wdown %d\n",*r, dskHptop, rx, ry); #endif ioctl(myfd, CIOMSEOFF); /* * Save the bitmap */ dip = &dskHeap[dskHptop]; if ( r->origin.y >= YSPLIT ) sip = addptr(SEG1, (r->origin.y - YSPLIT) * sx * sizeof(int)); else sip = addptr(SEG0, r->origin.y * sx * sizeof(int)); sip = addptr(sip, r->origin.x >> SBPW << 1); while ( ry-- ) { #ifdef DEBUG printf("\tscr 0x%lx, hp 0x%lx\n", sip, dip); #endif for ( trx=rx ; trx ; trx-- ) { *dip++ = *sip; sip = addptr(sip, sizeof(int)); } sip = addptr(sip, (sx - rx) * sizeof(int)); } ClearRect(r); /* Turn the mouse back on */ ioctl(myfd, CIOMSEON); /* * Adjust new top of heap marker. * Return old marker. */ trx = dskHptop; dskHptop += n; return (trx); } /* ** D_Close(r, oheap) - ** ** Restore the old bitmap to rectangle *r. The old bitmap is ** saved at index "oheap" on the heap. The heap is pooped to ** this level afterward. */ D_Close(r, oheap) RECT *r; int oheap; { register int *sip, *dip; register int trx; register int dx, rx, ry; dskHptop = oheap; dx = words_between(XMIN, XMAX); rx = words_between(r->origin.x, r->corner.x); ry = r->corner.y - r->origin.y; if ( !rx || !ry ) return; /* Turn mouse off */ #ifdef DEBUG printf("D_CLOSE:\trect (%d,%d)(%d,%d), oheap %d\n", *r, oheap); #endif ioctl(myfd, CIOMSEOFF, NULL); /* * Restore the bitmap */ sip = &dskHeap[dskHptop]; if ( r->origin.y >= YSPLIT ) dip = addptr(SEG1, (r->origin.y - YSPLIT) * dx * sizeof(int)); else dip = addptr(SEG0, r->origin.y * dx * sizeof(int)); dip = addptr(dip, r->origin.x >> SBPW << 1); while ( ry-- ) { #ifdef DEBUG printf("\tscr 0x%lx, hp 0x%lx\n", dip, sip); #endif for ( trx=rx ; trx ; trx-- ) { *dip = *sip++; dip = addptr(dip, sizeof(int)); } dip = addptr(dip, (dx - rx) * sizeof(int)); } /* Turn the mouse back on */ ioctl(myfd, CIOMSEON, NULL); }