|
|
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: 1162 (0x48a)
Types: TextFile
Notes: UNIX file
Names: »subr.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »hrtty/src/subr.c«
#include "../h/rico.h"
#include "../h/machine.h"
#include "../h/display.h"
#include "../h/subr.h"
char texttab[MAXLINE];
struct scanline scantab[YMAX];
slecompute()
{
register int y;
for(y=0; y<MAXLINE; y++)
texttab[y] = (ERASED | SCROLLABLE);
for(y=0; y<YMAX; y++){
scantab[y].sc_nword = 0;
scantab[y].sc_off = 0;
}
}
slcompute( li)
uint li;
{
uint y,
ylim;
if ((li)
and (li < MAXLINE)
and (not (texttab[li]&SCROLLABLE))) {
y = li * YSCROLL;
ylim = y + YSCROLL;
for (; y<ylim; ++y)
scompute( y);
texttab[li] |= SCROLLABLE;
}
}
scompute( y)
uint y;
{
uint *p,
*ep,
*q,
*eq;
if (y < YSPLIT) {
p = (uint *)SEG0 + y*WPERSL;
q = (uint *)SEG0 + (y-YSCROLL)*WPERSL;
}
else if (y-YSCROLL >= YSPLIT) {
p = (uint *)SEG1 + (y-YSPLIT)*WPERSL;
q = p - YSCROLL * WPERSL;
}
else {
p = (uint *)SEG1 + (y - YSPLIT)*WPERSL;
q = (uint *)SEG0 + (y-YSCROLL)*WPERSL;
}
ep = p + WPERSL;
eq = q + WPERSL;
loop {
if (*p != *q)
break;
if (++p == ep) {
scantab[y].sc_nword = 0;
return;
}
++q;
}
scantab[y].sc_off = p - ep + WPERSL;
while (*--ep == *--eq)
;
++ep;
scantab[y].sc_nword = ep - p;
}