This is the end of the archive, and one of my favorites. Nothing is new, but I figured out I could use the classic bouncing lines screensaver to make a nice plasma target, so it brings a few earlier tricks together nicely.
Being able to go through all this old code and see it running again has been quite a trip. I hope someone finds it interesting, whether to inspire their own version, or to learn more about these coding techniques (I barely scratch the surface), or even just to look at the visuals.
Thanks for visiting!
A bouncing line whose color comes from a 256-entry rolling history buffer. The index encodes when a segment was drawn, not where it is, so a wave of color travels along the scribble in the order it was laid down. You are watching the drawing's own history play back through the palette.
It is the same idea as PLASMA's walker from thirteen months
earlier, pointed at something better suited to it.
Toggling to the .BAK version's greyscale take is worth a peek for a more metallic look.
The palette loop writes register 256, which wraps to 0, so the newest color lands on the background. And 1024 port writes will not fit in one vertical blank, so on the hardware it was written for the palette update tore. Neither is fixed here; both are what the file does.
SAVER001.EXE was compiled on 1996-08-08 at 05:33, from the
.BAK. The .PAS beside it is dated 2 September
1996, three and a half weeks later, one line changed, never
recompiled. That is the last thing that happens in this archive.
1996-09-02 10:19 · 1,287 bytes · The last Pascal file in the archive.
uses jmodex,crt;var p:array[1..2]of integer;q:array[1..2]of integer; d:array[1..256]of record r,g,b:byte;end; s,t,u,x,c:integer;f:array[1..4]of shortint;a:byte; begin if set_vga_modex(7,360,480,1)=0 then halt(0);clear_vga_screen(0); randomize;for x:=1to 2do begin p[x]:=random(360);q[x]:=random(480); f[x]:=random(2)+1;f[x+2]:=f[x];end;c:=0; for x:=0to 127do begin set_dac_register(x,x div 2,0,0); set_dac_register(x+128,63-(x div 2),0,0);end; for x:=1to 256do begin d[x].r:=0;d[x].g:=0;d[x].b:=0;end; s:=1;t:=1;u:=1; repeat for x:=1to 2do begin if (p[x]>=(359-f[x]))then f[x]:=random(2)-3 else if (p[x]<=(1-f[x]))then f[x]:=random(2)+1; if (q[x]>=(479-f[x+2]))then f[x+2]:=random(2)-3 else if (q[x]<=(1-f[x+2]))then f[x+2]:=random(2)+1; inc(p[x],f[x]);inc(q[x],f[x+2]);end; inc(c);draw_line(p[1],q[1],p[2],q[2],c); repeat until(port[$3da]and 8)=0;repeat until(port[$3da]and 8)<>0; for x:=1to 256do set_dac_register(x,d[x].r,d[x].g,d[x].b); for x:=1to 255do d[x]:=d[x+1]; with d[256]do begin r:=d[255].r+s;g:=d[255].g+t;b:=d[255].b+u; if(r>(random(33)+30-abs(s)))or(r<abs(s))then s:=-s; if(g>(random(33)+30-abs(t)))or(g<abs(t))then t:=-t; if(b>(random(33)+30-abs(u)))or(b<abs(u))then u:=-u;end; until keypressed;asm mov ah,0;mov al,3;int 16;end;end.
1996-08-08 05:32 · 1,254 bytes · Grayscale-locked, and the version that was compiled.
uses jmodex,crt;var p:array[1..2]of integer;q:array[1..2]of integer; d:array[1..256]of record r,g,b:byte;end; s,t,u,x,c:integer;f:array[1..4]of shortint;a:byte; begin if set_vga_modex(7,360,480,1)=0 then halt(0);clear_vga_screen(0); randomize;for x:=1to 2do begin p[x]:=random(360);q[x]:=random(480); f[x]:=random(2)+1;f[x+2]:=f[x];end;c:=0; for x:=0to 127do begin set_dac_register(x,x div 2,0,0); set_dac_register(x+128,63-(x div 2),0,0);end; for x:=1to 256do begin d[x].r:=0;d[x].g:=0;d[x].b:=0;end; s:=1;t:=1;u:=1; repeat for x:=1to 2do begin if (p[x]>=(359-f[x]))then f[x]:=random(2)-3 else if (p[x]<=(1-f[x]))then f[x]:=random(2)+1; if (q[x]>=(479-f[x+2]))then f[x+2]:=random(2)-3 else if (q[x]<=(1-f[x+2]))then f[x+2]:=random(2)+1; inc(p[x],f[x]);inc(q[x],f[x+2]);end; inc(c);draw_line(p[1],q[1],p[2],q[2],c); repeat until(port[$3da]and 8)=0;repeat until(port[$3da]and 8)<>0; for x:=1to 256do set_dac_register(x,d[x].r,d[x].g,d[x].b); for x:=1to 255do d[x]:=d[x+1]; with d[256]do begin r:=d[255].r+s;g:=d[255].g+t;b:=d[255].b+u; if(r>(63-abs(s)))or(r<abs(s))then s:=-s; if(g>(63-abs(t)))or(g<abs(t))then t:=-t; if(b>(63-abs(u)))or(b<abs(u))then u:=-u;end; until keypressed;asm mov ah,0;mov al,3;int 16;end;end.