{ Odbiera transmisj© z ATARI przez zˆ¥cze LPT1 }
PROGRAM XE_PC;
USES CRT;
CONST LPT1=$378;
VAR I,Digit,Error:INTEGER;
    INDEX:WORD;
    Buffor:POINTER;
    KEY,Dana,Data,commend:BYTE;
    Atari:File Of Byte;
    Name:String[10];
    DTA:Array[0..60*1024] Of Byte;
LABEL Start,Loop,ENDE,Koniec;

PROCEDURE HideCursor;Assembler;Asm
  mov cx,1400h
  mov ah,1
  int 10h
END;

PROCEDURE SetColorRGB(c,r,g,b:Byte);Assembler;Asm
  mov dx,3c8h
  mov al,c
  out dx,al
  inc dx
  mov al,r
  out dx,al
  mov al,g
  out dx,al
  mov al,b
  out dx,al
END;

PROCEDURE GetByte;BEGIN;Asm
  mov KEY,0
  mov commend,10h
@test1:
  mov ah,06h
  mov dl,0ffh
  int 21h
  cmp al,27
  je  @exi
  mov cx,10
  mov dx,LPT1+1
  in  al,dx
  mov ah,al
  and al,8+16
  cmp al,11000b {Czy czasem nie padˆa komenda koäca transmisji ?}
  je  @koniec
  cmp al,10000b {Czy jaka˜ dana wystawiona przez ATARI na zˆ¥cze LPT1 ?}
  jne @test1    {Je˜li nie to powt¢rz p©tl©}
{Sprawd« czy napewno ATARI wysˆaˆo komend©?}
{To mo¾e by† pomyˆka....}
  mov cl,10
  sub ah,ah
@testA:
  in  al,dx
  and al,8+16
  add ah,al
  dec cl
  jnz @testA
  cmp ah,16*10 {10 komend musi da† wynik 160!}
  jne @test1   {Je˜li brak r¢wno˜ci to byˆa pomyˆka.}
@skip1:
{Test wiarygodno˜ci danych!}
  in  al,dx
  mov ah,al
  and ah,32+64  {Tylko bity z danymi}
  in  al,dx
  mov bl,al
  and bl,32+64  {Tylko bity z danymi}
  in  al,dx
  mov bh,al
  and bh,32+64  {Tylko bity z danymi}
  in  al,dx
  mov cl,al
  and cl,32+64  {Tylko bity z danymi}
  in  al,dx
  mov ch,al
  and ch,32+64  {Tylko bity z danymi}
  in  al,dx
  and al,32+64  {Tylko bity z danymi}
  cmp al,ah
  jne @skip1
  cmp bl,ah
  jne @skip1
  cmp bh,ah
  jne @skip1
  cmp cl,ah
  jne @skip1
  cmp ch,ah
  jne @skip1

  shr ah,5
  mov dana,ah   {Zapami©taj 2-bity danych}

  dec dx        {LPT1}
  in  al,dx
  and al,255-16 {Potwierd« odebranie danych}
  out dx,al
  inc dx        {LPT1+1}
@test2:
  in  al,dx
  and al,8+16
  cmp al,01000b {Czekaj na rozkaz od ATARI o zmianie linii z "Potwierdzeniem:}
  jne @test2
  dec dx        {LPT1}
  in  al,dx     {Anuluj potwierdzenie}
  or  al,16
  out dx,al
  jmp @exit
@koniec:
{Sprawd« czy napewno ATARI wysˆaˆo komend©?}
{To mo¾e by† pomyˆka....}
  mov cl,10
  sub ah,ah
@testB:
  in  al,dx
  and al,8+16
  add ah,al
  dec cl
  jnz @testB
  cmp ah,24*10 {10 komend musi da† wynik 240!}
  jne @test1   {Je˜li brak r¢wno˜ci to byˆa pomyˆka.}
  mov commend,00h
  jmp @skip1
@exi:
  mov KEY,27
@exit:END;
  IF KEY=27 THEN BEGIN
    TextMode(C80);
    WriteLn('Do zobaczenia...');
    Halt;
  END;
END;

FUNCTION GetKey:BYTE;BEGIN;Asm
  mov ah,06h
  mov dl,0ffh
  int 21h
  mov KEY,al
END;GetKey:=KEY;END;

BEGIN
  Asm
    mov dx,LPT1 {Zresetuj}
    mov al,255
    out dx,al
  End;
  TextMode(C80);
  HideCursor;
  INDEX:=0;commend:=$10;
  TextBackground(Blue);
  SetColorRGB(1,0,0,0);
  FOR I:=2 TO 24 DO BEGIN
    GotoXY(1,I);WRITE('                                                                                ');
  END;
  TextColor(White);
  GotoXY(13,2);WriteLn('ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»');
  TextColor(Yellow);
  GotoXY(15,3);WriteLn('Program odbioru transmisji z ATARI przez port LPT1 v1.0');
  TextColor(White);
  GotoXY(13,3);Write('º');GotoXY(71,3);Write('º');
  GotoXY(13,4);WriteLn('ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¼');
  GotoXY(1,22);TextBackground(Blue);TextColor(Red);
  Write('ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ');
  GotoXY(1,23);TextBackground(Brown);
  TextColor(Yellow);Write('                           Naci˜nij ');
  TextColor(LightGreen);Write('>>ESC<< ');
  TextColor(Yellow);Write('Aby Wyj˜†                              ');
  GotoXY(1,24);TextBackground(Black);TextColor(Red);
  Write('ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß');
  TextBackground(Blue);TextColor(White+Blink);
  GotoXY(17,12);WriteLn('Czekam na rozpocz©cie transmisji ze strony ATARI...');

  GetByte;

  {Rozpocz©cie transmisji}
{   GotoXY(1,23);TextBackground(Brown);
  TextColor(Yellow);Write('                    Naci˜nij ');
  TextColor(LightGreen);Write('>>ESC<< ');
  TextColor(Yellow);Write('Aby Przerwa† Transmisj©               ');}
  GotoXY(1,24);TextBackground(Black);TextColor(Red);
  TextBackground(Blue);TextColor(White+Blink);
  GotoXY(15,12);WriteLn('               Odbieram dane z ATARI...                    ');
  IF Commend=$00 THEN Goto ENDE;

  Repeat
    Data:=Dana;
    GetByte;IF Commend=$00 THEN Goto ENDE;Data:=Data+(Dana SHL 2);
    GetByte;IF Commend=$00 THEN Goto ENDE;Data:=Data+(Dana SHL 4);
    GetByte;IF Commend=$00 THEN Goto  ENDE;Data:=Data+(Dana SHL 6);
    DTA[INDEX]:=Data;INC(INDEX);
    SetColorRGB(0,Random(63),Random(63),Random(63));
    GetByte;
  Until commend=$00;

ENDE:
  TextBackground(Blue);TextColor(White);
  GotoXY(20,10);WriteLn('            Koniec transmisji!               ');
  GotoXY(20,12);WriteLn('          Odebraˆem bajt¢w: ',INDEX,'                 ');
  Name:='atari.000';

Loop:
  Assign(atari,Name);
  {$I-}Reset(atari);{$I+}
  IF IOResult=0 THEN BEGIN
    IF Name[9]<>'9' THEN NAME[9]:=CHR(ORD(NAME[9])+1) ELSE
    IF Name[8]<>'9' THEN BEGIN NAME[9]:='0';NAME[8]:=CHR(ORD(NAME[8])+1);END ELSE
    IF Name[7]<>'9' THEN BEGIN NAME[8]:='0';NAME[7]:=CHR(ORD(NAME[7])+1);END;
    Goto Loop;
  END;

  Rewrite(atari);
  For I:=0 To INDEX-1 DO BEGIN
    Write(atari,DTA[I]);
  End;
  Close(atari);
  GotoXY(20,15);WriteLn('      Plik zapisaˆem jako <',Name,'>       ');

  GotoXY(1,23);TextBackground(Brown);
  TextColor(Yellow);GotoXY(19,23);Write('      Naci˜nij Dowolny Klawisz Aby Wyj˜†');
  Repeat Until KeyPressed;
Koniec:
   TextMode(C80);
  WriteLn('Do zobaczenia...');
END.