{
{TITLE: Plasma  FROM: Kaare Boeegh  DATE: Sun Apr 17 1994 08:25 pm}
{$A+,B-,D-,E-,F+,G+,I-,L-,N-,O-,R-,S-,V-,X-}
PROGRAM plasma;

CONST ys : BYTE = 0;
      yt : BYTE = 255;

VAR ft   : ARRAY [0..512] OF BYTE;
    sint : ARRAY [0..256] OF BYTE;
    i1,a,b,d,c,od,color,e,y : BYTE;
    x,k,i                   : WORD;

PROCEDURE do_tables;
  VAR i : WORD;
  BEGIN
    FOR i := 0 TO 512 DO   FT [i] := ROUND(64+63*SIN(i/40.74));
    FOR i := 0 TO 256 DO SINT [i] := ROUND(128+127*SIN(i/40.74))-1;
  END;

PROCEDURE do_palette;
  VAR i : WORD;
  BEGIN
    PORT[$3C8] := 0;
    FOR i := 0 TO 255 DO
      BEGIN
        PORT[$3C9] := i DIV 4;
        PORT[$3C9] := i DIV 6;
        PORT[$3C9] := i DIV 8;
      END;
  END;

BEGIN
  ASM
    mov al,ys
    mov y,al
    mov ax,0013h;
    int 10h;      {Set Mode $13}

    mov dx,3d4h   {Go into Double Height Pixel Mode}
    mov al,9
    out dx,al
    inc dx
    in al,dx
    and al,0e0h
    add al,3
    out dx,al

    call do_palette;
    call do_tables;

@3: inc i1  {Main Loop}                                          {Grid Counter}
    sub c,2
    inc od
    mov al,od
    mov d,al

    mov al,ys                          {Alternate Starting Position every pass}
    mov ah,yt
    xchg al,ah
    mov ys,al
    mov ah,yt
    mov y,al

  @2: mov al,y                 {Calculate Offset and add one every second line}
      mov bx,320
      mul bx
      mov bx,ax
      mov al,y
      mov ah,0
      and al,1
      add ax,bx
      mov k,ax

      mov al,i1                   {move grid one pixel down every second frame}
      mov ah,0
      and al,1
      mov ah,0
      mov bx,320
      mul bx

      mov bx,k
      sub bx,ax
      mov k,bx

      mov al,d
      add al,2
      mov d,al

      mov al,c           {[(c}
      add al,y           {+y)}
      and ax,255         {and 255]}
      mov di,offset sint {get sint mem location}
      add di,ax          {[c+y] and 255}
      mov al,ds:[di]     {sint[(c+y) and 255]}
      mov a,al

      mov di,offset sint
      mov al,d
      and al,255
      add di,ax
      mov al,ds:[di]
      mov b,al

      mov ax,0
      mov bx,0
      mov cx,0

    @1: mov di,offset ft    {get ft mem location}
        mov al,a            {a}
        add al,b            {+b}
        add di,ax           {[a+b]}
        mov al,ds:[di]      {ft[a+b]}
        mov bx,ax           {Store}
        inc bx              {+1}
        mov di,offset ft    {get ft mem location}
        mov al,y            {y}
        add al,b            {+b}
        add di,ax           {[y+b]}
        mov ax,ds:[di]      {ft[y+b]}
        add ax,bx           {+}
        mov color,al        {color:=}

        mov bx,0a000h       {screen memory location}
        mov es,bx           {mov it to es}
        mov di,k            {k is screen offset}


        mov es:[di+80],al      {plot color to screen}
                 { ^^ center}
        mov al,b
        add al,2
        mov b,al

        mov ax,k {Ofs of Plasma Pixel, Increased by 2 to Create the Grid}
        add ax,2
        mov k,ax

        mov ah,0                                  {INC(a,1+color SHR 7);}
        mov al,color
        shr al,7
        add al,1
        mov ah,0
        mov bl,al
        mov al,a
        add al,bl
        mov a,al

        inc cx
        cmp cx,80  {160}
        jnz @1     {inner loop}

      inc y
      cmp y,101
      jnz @2     {outer loop, number of lines}

    mov ah,01h
    int 16h
    jz @3      {get keypress}

    mov ax,03h {mode 3}
    int 10h
  END;
END.
-----------------------------------------------------------------------------
Shipley
--- Synchronet
 * Origin: The Brook Forest Inn [714] 951-5282 (1:103/950)
                              