Newsgroup: it.comp.lang.pascal
Titolo: Plasma...

giochicchiando ho fatto questo... sotto dos/prompt (possibilmente
a schermo intero) lanciatelo (se lavorate a piu' di 25 righe potete
usare il numero che desiderate come parametro) e poi boh...
magari lanciate un altro prog in modalita' testo, tipo il TP :-)
[ ! provando a lanciare un altro prog compilato col TP ottengo
 un bel blocco del pc... boh... se volete provare... ]
E' un tsr, ma per ora l'unico modo per chiuderlo e' chiudere il prompt...
il codice e' un po' assurdo ma l'ho ricostruito unendo pezzi di piu'
units e ho mantenuto "l'ordine".
La unit crt non e' usata ma serve !! [ provate a toglierla :-) ]
<< inizio pplasma.pas >>
{$M 8192,0,4096}
uses dos,crt;
{ gestione mem video }
 type
  CrtCell = record Ch,At: byte; end;
  CrtMap  = array [1..50,1..80] of CrtCell;
 var
  CrtMem : CrtMap absolute $B800:$0000;
{ gestione timer... oscena ma funziona }
 const
  OldTimerInt = 103;
 var
  FTmr : record
          Freq,
          Counter : Word;
         end;
 Procedure SetTimer(Rout : Pointer; Freq : Word);
  var
   ICnt: Word;
   OldV: Pointer;
  begin
   Inline($FA);                 { CLI, interrupts off }
   ICnt:=1193180 Div Freq;      { calculate basic counter }
   Port[$43]:=$36;              { set mode }
   Port[$40]:=Lo(ICnt);         { write LSB }
   Port[$40]:=Hi(ICnt);         { write MSB }
   GetIntVec(8,OldV);           { old int vector }
   SetIntVec(OldTimerInt,OldV); { int 8 now Int OldT }
   SetIntVec(8,Rout);           { new int handler }
   Inline($FB);                 { STI, interrupts on }
  end;
 Procedure HandleTimer; far;
  var
   R : Registers;
  begin
   Dec(FTmr.Counter);
   If FTmr.Counter = 0 Then
    Begin
     Intr(OldTimerInt,R);
     FTmr.Counter:= FTmr.Freq div 18;
    End
   Else Port[$20]:=$20;
  end;
{ palette (cambiatela, fa schifo) }
 const
  col : array[0..15] of
   byte = ( 9, 1, 8, 7,15,14,12, 4, 5,13, 1, 9, 2,10 ,11, 3);
{ procedura di refresh video }
 var
  g   : integer;
  x,y : longint;
  z,a,b,c,d: real;
  maxrighe : byte;
 procedure Refresh; interrupt;
  begin
   inc (g);
   for y := 1 to maxrighe do
    for x := 1 to 80 do
     begin
      a := 6 * cos(g/250);
      b := 5 * sin(g/270);
      c := 22 * cos( x/35 + a/3 - 10 * sin(b/10) / cos(b/10) );
      d := 25 * cos( y/45 + b );
      z  := a*(b+c+d) + b*(a+c+d) + c*(a+b+d) + d*(a+b+c);
      z  := z/20 + x + y + g/2;
      z  := z/10;
      CrtMem[y,x].at := col[ trunc(z) and 15 ]
          + (CrtMem[y,x].at and 240);
{ cosi' mantiene il colore di sfondo, eliminando la seconda
  parte della riga lo sovrascrive }
     end;
   HandleTimer;
  end;
 begin
  if ParamCount > 0 then Val(ParamStr(1),maxrighe,g);
  if not (maxrighe in [1..50]) then maxrighe := 25;
  FTmr.Counter := 1;
  SetTimer(@Refresh,38);
  (**) Keep(0); (**)
 end.
<< fine pplasma.pas>
--
Dreadnaut
(Life would be easier if I had the source code)

boh.. a me non parte neanche!
non da errori, ma appena fai Run, esce subito.
boh..
ciao, Augusto
"Dreadnaut" <Drea...@liberoDALLASPAM.it> ha scritto nel messaggio
news:lwTe8.32539$fa5.1...@twister2.libero.it...


esatto :-)  poi lancia un altro prog dos !
Ma deve rimanere in memoria, quindi se sei sotto win devi
aprire un prompt, poi metterlo a tutto schermo (<Alt-Invio>) e poi
lancia ad esempio il tp, l'effetto e' simpatico :-)


 lancia ad esempio il tp, l'effetto e' simpatico :-)
ops... dopo il tutto schermo devi anche lanciare il plasma :-)


 La unit crt non e' usata ma serve !! [ provate a toglierla :-) ]
confermo...
una volta lanciato si vede l'effetto (rallenta un po' eh?? :)
per uscire, il classico EXIT dal prompt non funziona.
però se ritorni con il prompt a finestra Alt+Enter e fai di nuovo EXIT
esce normalmente.
Ti posso chiedere una cosetta?
Come si fa a creare un tsr?
Ciao, Augusto

 una volta lanciato si vede l'effetto (rallenta un po' eh?? :)
pero' usare il dos cosi' e' un'altra cosa :-)))
