program dotspin; var inPort1:word; procedure waitRetrace;assembler;asm mov dx,inPort1; {find crt status reg (input port #1)} @L1: in al,dx; test al,8; jnz @L1; {wait for no v retrace} @L2: in al,dx; test al,8; jz @L2; {wait for v retrace} end; const tableWriteIndex=$3C8; tableDataRegister=$3C9; procedure setColor(color,r,g,b:byte);assembler;asm {set DAC color} mov dx,tableWriteIndex; mov al,color; out dx,al; inc dx; mov al,r; out dx,al; mov al,g; out dx,al; mov al,b;out dx,al; end; {write index now points to next color} {plot a pixel in mode $13} procedure plot(x,y:word);Inline( $5E/ { pop si ;y} $5F/ { pop di ;x} $B8/$00/$A0/ { mov ax,$A000} $8E/$C0/ { mov es,ax} $B8/$40/$01/ { mov ax,320} $F7/$E6/ { mul si} $01/$C7/ { add di,ax} $26/$F6/$15); {es: not byte[di]} procedure plot4(x,y:word);const f=60;begin plot(x+f,y); plot(199+f-x,199-y); plot(199+f-y,x); plot(y+f,199-x); end; procedure click;assembler;asm in al,$61; xor al,2; out $61,al; end; const nDots=21; var dot:array[0..nDots-1]of record x,y,sx,sy:integer; end; function colorFn(x:integer):byte;begin colorFn:=63-(abs(100-x)div 2); end; procedure moveDots;var i:word;begin for i:=0 to nDots-1 do with dot[i] do begin plot4(x,y); inc(x,sx);inc(y,sy); if(word(x)>200)then begin sx:=-sx;inc(x,sx);click; end; if(word(y)>199)then begin sy:=-sy;inc(y,sy);click; end; plot4(x,y); end; waitRetrace;waitRetrace;waitRetrace;{waitRetrace;} setcolor(255,colorFn(dot[0].x),colorFn(dot[3].x),colorFn(dot[6].x)); end; procedure drawdots;var i:word;begin for i:=0 to nDots-1 do with dot[i] do plot4(x,y); end; procedure initDots;var i,j,k:word;begin j:=1;k:=1; for i:=0 to nDots-1 do with dot[i] do begin x:=100;y:=99; sx:=j;sy:=k; inc(j);if j>=k then begin j:=1;inc(k); end; end; end; function readKey:char;Inline( $B4/$07/ {mov ah,7} $CD/$21); {int $21} function keyPressed:boolean;Inline( $B4/$0B/ {mov ah,$B} $CD/$21/ {int $21} $24/$FE); {and al,$FE} begin inPort1:=memw[$40:$63]+6; port[$61]:=port[$61]and (not 1); setcolor(255,60,60,63); initDots; asm mov ax,$13; int $10; end; drawDots; repeat moveDots until keypressed; readkey; drawDots; asm mov ax,3; int $10; end; end. * OLX 2.2 * Printers do it without wrinkling the sheets. --- Maximus 2.01wb * Origin: >>> Sun Mountain BBS <<< (303)-665-6922 (1:104/123)