home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / MISC / MAG09.ZIP / MODE13H.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  2010-12-05  |  7.3 KB  |  336 lines

  1. Unit Mode13h;
  2.  
  3. { Version 1.2 }
  4.  
  5. Interface
  6.  
  7. Const VGA=$A000;
  8.       Npages=1;
  9.  
  10. Type RgbItem=Record
  11.                    R,G,B:Byte;
  12.              End;
  13.      RgbList=Array[0..255] of RgbItem;
  14.      Table=Array[0..1799] Of Real;
  15.      PTable=^Table;
  16.  
  17. Var Sines:Ptable;
  18.     Cosines:Ptable;
  19.     Virt:Array[1..Npages] Of Pointer;
  20.     VP:Array[1..Npages] Of Word;
  21.     PCXPal:RgbList;
  22.  
  23. Procedure Initgraph;
  24. Procedure Closegraph;
  25. Procedure PutPixel(X,Y:word;Col:Byte;Where:Word);
  26. Function GetPixel(X,Y:word;Where:Word):Byte;
  27. Procedure Cls(Col:Byte;Where:Word);
  28. Procedure WaitVBL;
  29. Procedure GetColor(Col:Byte;Var R,G,B:Byte);
  30. Procedure SetColor(Col,R,G,B:Byte);
  31. Procedure GetPalette(Var Pal:RgbList);
  32. Procedure SetPalette(Pal:RgbList);
  33. Procedure RotatePal(Var Pal:RgbList;First,Last:Byte);
  34. Procedure Fade(Target:RgbList);
  35. Procedure Circle(X,Y,R:Integer;Col:Byte;Where:Word);
  36. Function Sgn(A:Real):Integer;
  37. Procedure Line(X1,Y1,X2,Y2,Col:Integer;Where:Word);
  38. Procedure InitTables;
  39. Procedure ClearTables;
  40. Procedure InitVirt;
  41. Procedure CloseVirt;
  42. Procedure CopyPage(From,Too:Word);
  43. Procedure LoadPCX(Filename:String;Where:Word);
  44. Procedure LoadPal(Filename:String;Var Pal:RgbList);
  45.  
  46. Implementation
  47.  
  48. Procedure Initgraph; Assembler;
  49. Asm
  50.    mov ah,0
  51.    mov al,13h
  52.    int 10h
  53. End;
  54.  
  55. Procedure Closegraph; Assembler;
  56. Asm
  57.    mov ah,0
  58.    mov al,03h
  59.    int 10h
  60. End;
  61.  
  62. Procedure PutPixel(X,Y:word;Col:Byte;Where:Word);
  63. Begin
  64.      Mem[Where:(y*320)+x]:=Col;
  65. End;
  66.  
  67. Function GetPixel(X,Y:word;Where:Word):Byte;
  68. Begin
  69.      GetPixel:=Mem[Where:(y*320)+x];
  70. End;
  71.  
  72.  
  73. Procedure Cls(Col:Byte;Where:Word);
  74. Begin
  75.      Fillchar(Mem[Where:0000],64000,Col);
  76. End;
  77.  
  78. Procedure WaitVBL; Assembler;
  79. Label A1,A2;
  80. Asm
  81.    Mov DX,3DAh
  82.    A1:
  83.       In AL,DX
  84.       And AL,08h
  85.       Jnz A1
  86.    A2:
  87.       In AL,DX
  88.       And AL,08h
  89.       Jz A2
  90. End;
  91.  
  92. Procedure GetColor(Col:Byte;Var R,G,B:Byte);
  93. Begin
  94.      Port[$3C7]:=Col;
  95.      R:=Port[$3C9];
  96.      G:=Port[$3C9];
  97.      B:=Port[$3C9];
  98. End;
  99.  
  100. Procedure SetColor(Col,R,G,B:Byte);
  101. Begin
  102.      Port[$3C8]:=Col;
  103.      Port[$3C9]:=R;
  104.      Port[$3C9]:=G;
  105.      Port[$3C9]:=B;
  106. End;
  107.  
  108. Procedure GetPalette(Var Pal:RgbList);
  109. Var A:Byte;
  110. Begin
  111.      For A:=0 To 255 do GetColor(A,Pal[A].R,Pal[A].G,Pal[A].B);
  112. End;
  113.  
  114. Procedure SetPalette(Pal:RgbList);
  115. Var A:Byte;
  116. Begin
  117.      WaitVBL;
  118.      For A:=0 To 255 do SetColor(A,Pal[A].R,Pal[A].G,Pal[A].B);
  119. End;
  120.  
  121. Procedure RotatePal(Var Pal:RgbList;First,Last:Byte);
  122. Var Temp:RgbItem;
  123.     A:Byte;
  124. Begin
  125.      Temp:=Pal[Last];
  126.      For A:=Last-1 DownTo First Do Pal[A+1]:=Pal[A];
  127.      Pal[First]:=Temp;
  128. End;
  129.  
  130. Procedure Fade(Target:RgbList);
  131. Var Tmp:RgbList;
  132.     Flag:Boolean;
  133.     Loop:Integer;
  134. Begin
  135.      Repeat
  136.            Flag:=True;
  137.            GetPalette(Tmp);
  138.            For Loop:=0 To 255 Do
  139.            Begin
  140.                 If Tmp[Loop].R>Target[Loop].R Then
  141.                 Begin
  142.                      Dec(Tmp[Loop].R);
  143.                      Flag:=False;
  144.                 End;
  145.                 If Tmp[Loop].G>Target[Loop].G Then
  146.                 Begin
  147.                      Dec(Tmp[Loop].G);
  148.                      Flag:=False;
  149.                 End;
  150.                 If Tmp[Loop].B>Target[Loop].B Then
  151.                 Begin
  152.                      Dec(Tmp[Loop].B);
  153.                      Flag:=False;
  154.                 End;
  155.                 If Tmp[Loop].R<Target[Loop].R Then
  156.                 Begin
  157.                      Inc(Tmp[Loop].R);
  158.                      Flag:=False;
  159.                 End;
  160.                 If Tmp[Loop].G<Target[Loop].G Then
  161.                 Begin
  162.                      Inc(Tmp[Loop].G);
  163.                      Flag:=False;
  164.                 End;
  165.                 If Tmp[Loop].B<Target[Loop].B Then
  166.                 Begin
  167.                      Inc(Tmp[Loop].B);
  168.                      Flag:=False;
  169.                 End;
  170.            End;
  171.            SetPalette(Tmp);
  172.      Until Flag;
  173. End;
  174.  
  175. Procedure Circle(X,Y,R:Integer;Col:Byte;Where:Word);
  176. Var Px,Py:Integer;
  177.     Deg:Word;
  178. Begin
  179.      For Deg:=0 to 1799 Do
  180.      Begin
  181.           Px:=Trunc(R*Sines^[Deg]+X);
  182.           Py:=Trunc(R*Cosines^[Deg]+Y);
  183.           PutPixel(Px,Py,Col,Where);
  184.      End;
  185. End;
  186.  
  187. Function Sgn(A:Real):Integer;
  188. Begin
  189.      If A<0 then Sgn:=-1;
  190.      If A=0 then Sgn:=0;
  191.      If A>0 then Sgn:=+1;
  192. End;
  193.  
  194. Procedure Line(X1,Y1,X2,Y2,Col:Integer;Where:Word);
  195. Var Deltax,S,Deltay,Dx1,Dy1,Dx2,Dy2,S1,S2:Real;
  196.     I:Integer;
  197. Begin
  198.      Deltax:=X2-X1;
  199.      Deltay:=Y2-Y1;
  200.      Dx1:=Sgn(Deltax);
  201.      Dy1:=Sgn(Deltay);
  202.      Dx2:=Sgn(Deltax);
  203.      Dy2:= 0;
  204.      S1:=Abs(Deltax);
  205.      S2:=Abs(Deltay);
  206.      If Not (S1>S2) Then
  207.      Begin
  208.           Dx2:=0;
  209.           Dy2:=Sgn(Deltay);
  210.           S1:=Abs(Deltay);
  211.           S2:=Abs(Deltax);
  212.      End;
  213.      S:=Int(S1/2);
  214.      For I:=0 To Round(S1) Do
  215.      Begin
  216.           PutPixel(X1,Y1,Col,Where);
  217.           S:=S+S2;
  218.           If Not (S<S1) Then
  219.           Begin
  220.                S:=S-S1;
  221.                X1:=X1+Round(Dx1);
  222.                Y1:=Y1+Round(Dy1);
  223.           End
  224.           Else
  225.           Begin
  226.                X1:=X1+Round(dx2);
  227.                Y1:=Y1+Round(Dy2);
  228.           End;
  229.      End;
  230. End;
  231.  
  232. Procedure InitTables;
  233. Var A:Word;
  234.     B:Real;
  235. Begin
  236.      Getmem(Sines,Sizeof(Sines^));
  237.      Getmem(Cosines,Sizeof(Cosines^));
  238.      B:=0;
  239.      For A:=0 To 1799 Do
  240.      Begin
  241.           Sines^[A]:=Sin(B);
  242.           Cosines^[A]:=Cos(B);
  243.           B:=B+0.005;
  244.      End;
  245. End;
  246.  
  247. Procedure ClearTables;
  248. Begin
  249.      Freemem(Sines,Sizeof(Sines^));
  250.      Freemem(Cosines,Sizeof(Cosines^));
  251. End;
  252.  
  253. Procedure InitVirt;
  254. Var A:Byte;
  255. Begin
  256.      For A:=1 To Npages Do
  257.      Begin
  258.           GetMem(Virt[A],64000);
  259.           VP[A]:=Seg(Virt[A]^);
  260.      End;
  261. End;
  262.  
  263. Procedure CloseVirt;
  264. Var A:Byte;
  265. Begin
  266.      For A:=1 To Npages Do
  267.      Begin
  268.           Freemem(Virt[A],64000);
  269.           VP[A]:=$A000;
  270.      End;
  271. End;
  272.  
  273. Procedure CopyPage(From,Too:Word);
  274. Begin
  275.      WaitVbl;
  276.      Move(Mem[From:0],Mem[Too:0],64000);
  277. End;
  278.  
  279. Procedure LoadPCX(Filename:String;Where:Word);
  280. Var Fil:File;
  281.     Dx,Dy:Word;
  282.     J,M:Byte;
  283.     Ph:Word;
  284.     Buff:Array[0..127] of byte;
  285. Begin
  286.      Assign(Fil,Filename);
  287.      Reset(Fil,1);
  288.      Blockread(Fil,Buff,128);
  289.      Dy:=0;
  290.      Repeat
  291.            Dx:=0;
  292.            Repeat
  293.                  BlockRead(Fil,J,1);
  294.                  If J>192 Then
  295.                  Begin
  296.                       BlockRead(Fil,M,1);
  297.                       Dec(J,192);
  298.                       For Ph:=1 To J Do
  299.                       Begin
  300.                            PutPixel(Dx,Dy,M,Where);
  301.                            Inc(Dx);
  302.                       End;
  303.                  End
  304.                  Else
  305.                  Begin
  306.                       PutPixel(Dx,Dy,J,Where);
  307.                       Inc(Dx);
  308.                  End;
  309.            Until Dx>=320;
  310.            Inc(Dy);
  311.      Until Dy=200;
  312.      BlockRead(Fil,M,1);
  313.      If M=12 Then
  314.      Begin
  315.           BlockRead(Fil,PCXPal,768);
  316.           For M:=0 To 255 Do
  317.           Begin
  318.                PCXPal[M].R:=PCXPal[M].R Div 4;
  319.                PCXPal[M].G:=PCXPal[M].G Div 4;
  320.                PCXPal[M].B:=PCXPal[M].B Div 4;
  321.           End;
  322.      End;
  323.      Close(Fil);
  324. End;
  325.  
  326. Procedure LoadPal(Filename:String;Var Pal:RgbList);
  327. Var F:File;
  328. Begin
  329.      Assign(F,Filename);
  330.      Reset(F,1);
  331.      Blockread(F,Pal,768);
  332.      Close(F);
  333. End;
  334.  
  335. Begin
  336. End.