home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / MISC / MAG10.ZIP / MODE13H.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-09-08  |  12.3 KB  |  507 lines

  1. Unit Mode13h;
  2.  
  3. { Version 1.3 }
  4.  
  5. Interface
  6.  
  7. Const VGA=$A000;
  8.       Npages=2;
  9.       TableElements=360;
  10.  
  11. Type RgbItem=Record
  12.                    R,G,B:Byte;
  13.              End;
  14.      RgbList=Array[0..255] of RgbItem;
  15.      Table=Array[0..TableElements] Of Real;
  16.      PTable=^Table;
  17.  
  18. Var Sines:Ptable;
  19.     Cosines:Ptable;
  20.     Virt:Array[1..Npages] Of Pointer;
  21.     VP:Array[1..Npages] Of Word;
  22.     PCXPal:RgbList;
  23.  
  24. Procedure Initgraph;
  25. Procedure Closegraph;
  26. Procedure PutPixel(X,Y:word;Col:Byte;Where:Word);
  27. Procedure PutClippedPixel(X,Y:word;Col:Byte;Where:Word);
  28. Function GetPixel(X,Y:word;Where:Word):Byte;
  29. Procedure Cls(Col:Byte;Where:Word);
  30. Procedure WaitVBL;
  31. Procedure GetColor(Col:Byte;Var R,G,B:Byte);
  32. Procedure SetColor(Col,R,G,B:Byte);
  33. Procedure GetPalette(Var Pal:RgbList);
  34. Procedure SetPalette(Pal:RgbList);
  35. Procedure RotatePal(Var Pal:RgbList;First,Last:Byte);
  36. Procedure Fade(Target:RgbList);
  37. Procedure Circle(X,Y,R:Integer;Col:Byte;Where:Word);
  38. Function Sgn(A:Real):Integer;
  39. Procedure Line(X1,Y1,X2,Y2,Col:Integer;Where:Word);
  40. Procedure LineC(X1,Y1,X2,Y2,Col:Integer;Where:Word);
  41. Procedure Poly(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Word;Color:Byte;Where:Word);
  42. Procedure FPoly(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Word;Color:Byte;Where:Word);
  43. Procedure Ellipse(X,Y,RH,RV:Integer;Col:Byte;Where:Word);
  44. Procedure Arc(X,Y,RH,RV:Integer;SAngle,EAngle:Integer;Col:Byte;Where:Word);
  45. Procedure FEllipse(X,Y,RH,RV:Integer;Col:Byte;Where:Word);
  46. Procedure InitTables;
  47. Procedure ClearTables;
  48. Procedure InitVirt;
  49. Procedure CloseVirt;
  50. Procedure CopyPage(From,Too:Word);
  51. Procedure LoadPCX(Filename:String;Where:Word);
  52. Procedure LoadPal(Filename:String;Var Pal:RgbList);
  53.  
  54. Implementation
  55.  
  56. Procedure Initgraph; Assembler;
  57. Asm
  58.    mov ah,0
  59.    mov al,13h
  60.    int 10h
  61. End;
  62.  
  63. Procedure Closegraph; Assembler;
  64. Asm
  65.    mov ah,0
  66.    mov al,03h
  67.    int 10h
  68. End;
  69.  
  70. Procedure PutPixel(X,Y:word;Col:Byte;Where:Word);
  71. Begin
  72.      Mem[Where:(y*320)+x]:=Col;
  73. End;
  74.  
  75. Procedure PutClippedPixel(X,Y:word;Col:Byte;Where:Word);
  76. Begin
  77.      If (X<0) Or (X>319) Then Exit;
  78.      If (Y<0) Or (Y>199) Then Exit;
  79.      Mem[Where:(y*320)+x]:=Col;
  80. End;
  81.  
  82. Function GetPixel(X,Y:word;Where:Word):Byte;
  83. Begin
  84.      GetPixel:=Mem[Where:(y*320)+x];
  85. End;
  86.  
  87. Procedure Cls(Col:Byte;Where:Word);
  88. Begin
  89.      Fillchar(Mem[Where:0000],64000,Col);
  90. End;
  91.  
  92. Procedure WaitVBL; Assembler;
  93. Label A1,A2;
  94. Asm
  95.    Mov DX,3DAh
  96.    A1:
  97.       In AL,DX
  98.       And AL,08h
  99.       Jnz A1
  100.    A2:
  101.       In AL,DX
  102.       And AL,08h
  103.       Jz A2
  104. End;
  105.  
  106. Procedure GetColor(Col:Byte;Var R,G,B:Byte);
  107. Begin
  108.      Port[$3C7]:=Col;
  109.      R:=Port[$3C9];
  110.      G:=Port[$3C9];
  111.      B:=Port[$3C9];
  112. End;
  113.  
  114. Procedure SetColor(Col,R,G,B:Byte);
  115. Begin
  116.      Port[$3C8]:=Col;
  117.      Port[$3C9]:=R;
  118.      Port[$3C9]:=G;
  119.      Port[$3C9]:=B;
  120. End;
  121.  
  122. Procedure GetPalette(Var Pal:RgbList);
  123. Var A:Byte;
  124. Begin
  125.      For A:=0 To 255 do GetColor(A,Pal[A].R,Pal[A].G,Pal[A].B);
  126. End;
  127.  
  128. Procedure SetPalette(Pal:RgbList);
  129. Var A:Byte;
  130. Begin
  131.      WaitVBL;
  132.      For A:=0 To 255 do SetColor(A,Pal[A].R,Pal[A].G,Pal[A].B);
  133. End;
  134.  
  135. Procedure RotatePal(Var Pal:RgbList;First,Last:Byte);
  136. Var Temp:RgbItem;
  137.     A:Byte;
  138. Begin
  139.      Temp:=Pal[Last];
  140.      For A:=Last-1 DownTo First Do Pal[A+1]:=Pal[A];
  141.      Pal[First]:=Temp;
  142. End;
  143.  
  144. Procedure Fade(Target:RgbList);
  145. Var Tmp:RgbList;
  146.     Flag:Boolean;
  147.     Loop:Integer;
  148. Begin
  149.      Repeat
  150.            Flag:=True;
  151.            GetPalette(Tmp);
  152.            For Loop:=0 To 255 Do
  153.            Begin
  154.                 If Tmp[Loop].R>Target[Loop].R Then
  155.                 Begin
  156.                      Dec(Tmp[Loop].R);
  157.                      Flag:=False;
  158.                 End;
  159.                 If Tmp[Loop].G>Target[Loop].G Then
  160.                 Begin
  161.                      Dec(Tmp[Loop].G);
  162.                      Flag:=False;
  163.                 End;
  164.                 If Tmp[Loop].B>Target[Loop].B Then
  165.                 Begin
  166.                      Dec(Tmp[Loop].B);
  167.                      Flag:=False;
  168.                 End;
  169.                 If Tmp[Loop].R<Target[Loop].R Then
  170.                 Begin
  171.                      Inc(Tmp[Loop].R);
  172.                      Flag:=False;
  173.                 End;
  174.                 If Tmp[Loop].G<Target[Loop].G Then
  175.                 Begin
  176.                      Inc(Tmp[Loop].G);
  177.                      Flag:=False;
  178.                 End;
  179.                 If Tmp[Loop].B<Target[Loop].B Then
  180.                 Begin
  181.                      Inc(Tmp[Loop].B);
  182.                      Flag:=False;
  183.                 End;
  184.            End;
  185.            SetPalette(Tmp);
  186.      Until Flag;
  187. End;
  188.  
  189. Procedure Circle(X,Y,R:Integer;Col:Byte;Where:Word);
  190. Var Px,Py:Integer;
  191.     Deg:Word;
  192. Begin
  193.      For Deg:=0 to TableElements Do
  194.      Begin
  195.           Px:=Trunc(R*Sines^[Deg]+X);
  196.           Py:=Trunc(R*Cosines^[Deg]+Y);
  197.           PutPixel(Px,Py,Col,Where);
  198.      End;
  199. End;
  200.  
  201. Function Sgn(A:Real):Integer;
  202. Begin
  203.      If A<0 then Sgn:=-1;
  204.      If A=0 then Sgn:=0;
  205.      If A>0 then Sgn:=+1;
  206. End;
  207.  
  208. Procedure Line(X1,Y1,X2,Y2,Col:Integer;Where:Word);
  209. Var Deltax,S,Deltay,Dx1,Dy1,Dx2,Dy2,S1,S2:Real;
  210.     I:Integer;
  211. Begin
  212.      Deltax:=X2-X1;
  213.      Deltay:=Y2-Y1;
  214.      Dx1:=Sgn(Deltax);
  215.      Dy1:=Sgn(Deltay);
  216.      Dx2:=Sgn(Deltax);
  217.      Dy2:= 0;
  218.      S1:=Abs(Deltax);
  219.      S2:=Abs(Deltay);
  220.      If Not (S1>S2) Then
  221.      Begin
  222.           Dx2:=0;
  223.           Dy2:=Sgn(Deltay);
  224.           S1:=Abs(Deltay);
  225.           S2:=Abs(Deltax);
  226.      End;
  227.      S:=Int(S1/2);
  228.      For I:=0 To Round(S1) Do
  229.      Begin
  230.           PutPixel(X1,Y1,Col,Where);
  231.           S:=S+S2;
  232.           If Not (S<S1) Then
  233.           Begin
  234.                S:=S-S1;
  235.                X1:=X1+Round(Dx1);
  236.                Y1:=Y1+Round(Dy1);
  237.           End
  238.           Else
  239.           Begin
  240.                X1:=X1+Round(dx2);
  241.                Y1:=Y1+Round(Dy2);
  242.           End;
  243.      End;
  244. End;
  245.  
  246. Procedure LineC(X1,Y1,X2,Y2,Col:Integer;Where:Word);
  247. Var Deltax,S,Deltay,Dx1,Dy1,Dx2,Dy2,S1,S2:Real;
  248.     I:Integer;
  249. Begin
  250.      Deltax:=X2-X1;
  251.      Deltay:=Y2-Y1;
  252.      Dx1:=Sgn(Deltax);
  253.      Dy1:=Sgn(Deltay);
  254.      Dx2:=Sgn(Deltax);
  255.      Dy2:= 0;
  256.      S1:=Abs(Deltax);
  257.      S2:=Abs(Deltay);
  258.      If Not (S1>S2) Then
  259.      Begin
  260.           Dx2:=0;
  261.           Dy2:=Sgn(Deltay);
  262.           S1:=Abs(Deltay);
  263.           S2:=Abs(Deltax);
  264.      End;
  265.      S:=Int(S1/2);
  266.      For I:=0 To Round(S1) Do
  267.      Begin
  268.           If (X1>=0) And (Y1>=0) And (X1<=319) And (Y1<=199) Then
  269.             PutPixel(X1,Y1,Col,Where);
  270.           S:=S+S2;
  271.           If Not (S<S1) Then
  272.           Begin
  273.                S:=S-S1;
  274.                X1:=X1+Round(Dx1);
  275.                Y1:=Y1+Round(Dy1);
  276.           End
  277.           Else
  278.           Begin
  279.                X1:=X1+Round(dx2);
  280.                Y1:=Y1+Round(Dy2);
  281.           End;
  282.      End;
  283. End;
  284.  
  285. Procedure Poly(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Word;Color:Byte;Where:Word);
  286. Begin
  287.      Line(X1,Y1,X2,Y2,Color,Where);
  288.      Line(X2,Y2,X3,Y3,Color,Where);
  289.      Line(X3,Y3,X4,Y4,Color,Where);
  290.      Line(X4,Y4,X1,Y1,Color,Where);
  291. End;
  292.  
  293. Procedure FPoly(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Word;Color:Byte;Where:Word);
  294. Var MnY,MxY:Word;
  295.     DeltaX1,DeltaX2,DeltaX3,DeltaX4:Integer;
  296.     DeltaY1,DeltaY2,DeltaY3,DeltaY4:Integer;
  297.     Y:Word;
  298.     MnX,MxX:Integer;
  299.     X:Integer;
  300. Begin
  301.      MnY:=Y1;
  302.      MxY:=Y1;
  303.      If MnY>Y2 Then MnY:=Y2;
  304.      If MnY>Y3 Then MnY:=Y3;
  305.      If MnY>Y4 Then MnY:=Y4;
  306.      If MxY<Y2 Then MxY:=Y2;
  307.      If MxY<Y3 Then MxY:=Y3;
  308.      If MxY<Y4 Then MxY:=Y4;
  309.      If MnY<0 Then MnY:=0;
  310.      If MxY>199 Then MxY:=199;
  311.      If MnY>199 Then Exit;
  312.      If MxY<0 Then Exit;
  313.      DeltaX1:=(X1-X4); DeltaY1:=(Y1-Y4);
  314.      DeltaX2:=(X2-X1); DeltaY2:=(Y2-Y1);
  315.      DeltaX3:=(X3-X2); DeltaY3:=(Y3-Y2);
  316.      DeltaX4:=(X4-X3); DeltaY4:=(Y4-Y3);
  317.      For Y:=MnY To MnX Do
  318.      Begin
  319.           MnX:=319;
  320.           MxX:=-1;
  321.           If (Y>=Y1) Or (Y>=Y2) Then
  322.             If (Y<=Y1) Or (Y<=Y2) Then
  323.               If Not(Y1=Y2) Then
  324.               Begin
  325.                    X:=(Y-Y1)*DeltaX2 Div DeltaY2 + X1;
  326.                    If X<MnX Then MnX:=X;
  327.                    If X>MxX Then MxX:=X;
  328.               End;
  329.           If (Y>=Y2) Or (Y>=Y3) Then
  330.             If (Y<=Y2) Or (Y<=Y3) Then
  331.               If Not(Y2=Y3) Then
  332.               Begin
  333.                    X:=(Y-Y2)*DeltaX3 Div DeltaY3 + X2;
  334.                    If X<MnX Then MnX:=X;
  335.                    If X>MxX Then MxX:=X;
  336.               End;
  337.           If (Y>=Y3) Or (Y>=Y4) Then
  338.             If (Y<=Y3) Or (Y<=Y4) Then
  339.               If Not(Y3=Y4) Then
  340.               Begin
  341.                    X:=(Y-Y3)*DeltaX4 Div DeltaY4 + X3;
  342.                    If X<MnX Then MnX:=X;
  343.                    If X>MxX Then MxX:=X;
  344.               End;
  345.           If (Y>=Y4) Or (Y>=Y1) Then
  346.             If (Y<=Y4) Or (Y<=Y1) Then
  347.               If Not(Y4=Y1) Then
  348.               Begin
  349.                    X:=(Y-Y4)*DeltaX1 Div DeltaY1 + X4;
  350.                    If X<MnX Then MnX:=X;
  351.                    If X>MxX Then MxX:=X;
  352.               End;
  353.           If MnX<0 Then MnX:=0;
  354.           If MxX>319 Then MxX:=319;
  355.           If MnX<MxX Then Line(MnX,Y,MxX,Y,Color,Where);
  356.      End;
  357. End;
  358.  
  359. Procedure Ellipse(X,Y,RH,RV:Integer;Col:Byte;Where:Word);
  360. Var Px,Py:Integer;
  361.     Deg:Word;
  362. Begin
  363.      For Deg:=0 to TableElements Do
  364.      Begin
  365.           Px:=Trunc(RH*Sines^[Deg]+X);
  366.           Py:=Trunc(RV*Cosines^[Deg]+Y);
  367.           PutPixel(Px,Py,Col,Where);
  368.      End;
  369. End;
  370.  
  371. Procedure Arc(X,Y,RH,RV:Integer;SAngle,EAngle:Integer;Col:Byte;Where:Word);
  372. Var Px,Py:Integer;
  373.     Deg:Word;
  374. Begin
  375.      SAngle:=Trunc(TableElements/360 * SAngle);
  376.      EAngle:=Trunc(TableElements/360 * EAngle);
  377.      For Deg:=SAngle to EAngle Do
  378.      Begin
  379.           Px:=Trunc(RH*Sines^[Deg]+X);
  380.           Py:=Trunc(RV*Cosines^[Deg]+Y);
  381.           PutPixel(Px,Py,Col,Where);
  382.      End;
  383. End;
  384.  
  385. Procedure FEllipse(X,Y,RH,RV:Integer;Col:Byte;Where:Word);
  386. Var Px1,Px2,Py:Integer;
  387.     Delta:Integer;
  388.     Deg:Word;
  389. Begin
  390.      For Deg:=0 to (TableElements Div 2) Do
  391.      Begin
  392.           Delta:=Trunc(RH*Sines^[Deg]);
  393.           Px1:=Delta+X;
  394.           Px2:=X-Delta;
  395.           Py:=Trunc(RV*Cosines^[Deg]+Y);
  396.           Line(Px1,Py,Px2,Py,Col,Where);
  397.      End;
  398. End;
  399.  
  400. Procedure InitTables;
  401. Var A:Word;
  402.     B:Real;
  403.     Increment:Real;
  404. Begin
  405.      Getmem(Sines,Sizeof(Sines^));
  406.      Getmem(Cosines,Sizeof(Cosines^));
  407.      B:=0;
  408.      Increment:=2*PI/TableElements;
  409.      For A:=0 To TableElements Do
  410.      Begin
  411.           Sines^[A]:=Sin(B);
  412.           Cosines^[A]:=Cos(B);
  413.           B:=B+Increment;
  414.      End;
  415. End;
  416.  
  417. Procedure ClearTables;
  418. Begin
  419.      Freemem(Sines,Sizeof(Sines^));
  420.      Freemem(Cosines,Sizeof(Cosines^));
  421. End;
  422.  
  423. Procedure InitVirt;
  424. Var A:Byte;
  425. Begin
  426.      For A:=1 To Npages Do
  427.      Begin
  428.           GetMem(Virt[A],64000);
  429.           VP[A]:=Seg(Virt[A]^);
  430.      End;
  431. End;
  432.  
  433. Procedure CloseVirt;
  434. Var A:Byte;
  435. Begin
  436.      For A:=1 To Npages Do
  437.      Begin
  438.           Freemem(Virt[A],64000);
  439.           Virt[A]:=NIL;
  440.           VP[A]:=$A000;
  441.      End;
  442. End;
  443.  
  444. Procedure CopyPage(From,Too:Word);
  445. Begin
  446.      WaitVbl;
  447.      Move(Mem[From:0],Mem[Too:0],64000);
  448. End;
  449.  
  450. Procedure LoadPCX(Filename:String;Where:Word);
  451. Var Fil:File;
  452.     Dx,Dy:Word;
  453.     J,M:Byte;
  454.     Ph:Word;
  455.     Buff:Array[0..127] of byte;
  456. Begin
  457.      Assign(Fil,Filename);
  458.      Reset(Fil,1);
  459.      Blockread(Fil,Buff,128);
  460.      Dy:=0;
  461.      Repeat
  462.            Dx:=0;
  463.            Repeat
  464.                  BlockRead(Fil,J,1);
  465.                  If J>192 Then
  466.                  Begin
  467.                       BlockRead(Fil,M,1);
  468.                       Dec(J,192);
  469.                       For Ph:=1 To J Do
  470.                       Begin
  471.                            PutPixel(Dx,Dy,M,Where);
  472.                            Inc(Dx);
  473.                       End;
  474.                  End
  475.                  Else
  476.                  Begin
  477.                       PutPixel(Dx,Dy,J,Where);
  478.                       Inc(Dx);
  479.                  End;
  480.            Until Dx>=320;
  481.            Inc(Dy);
  482.      Until Dy=200;
  483.      BlockRead(Fil,M,1);
  484.      If M=12 Then
  485.      Begin
  486.           BlockRead(Fil,PCXPal,768);
  487.           For M:=0 To 255 Do
  488.           Begin
  489.                PCXPal[M].R:=PCXPal[M].R Div 4;
  490.                PCXPal[M].G:=PCXPal[M].G Div 4;
  491.                PCXPal[M].B:=PCXPal[M].B Div 4;
  492.           End;
  493.      End;
  494.      Close(Fil);
  495. End;
  496.  
  497. Procedure LoadPal(Filename:String;Var Pal:RgbList);
  498. Var F:File;
  499. Begin
  500.      Assign(F,Filename);
  501.      Reset(F,1);
  502.      Blockread(F,Pal,768);
  503.      Close(F);
  504. End;
  505.  
  506. Begin
  507. End.