home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG099.ARC / HIRES1.DOC < prev    next >
Text File  |  1979-12-31  |  9KB  |  298 lines

  1.                                TURBO HIRES2
  2.  
  3.                               By Simon Carter
  4.  
  5.  
  6.  
  7. Man∙ oµ yo⌡ ou⌠ therσ ma∙ havσ beeε disappointeΣ b∙ Turbo'≤ lacδ oµ áHires▓ ì
  8. graphic≤ ároutines«  ╔ was¼ anΣ no≈ therσ i≤ ß probleφ n∩ more« á Ove≥ áthσ ì
  9. nex⌠ ácouplσ áoµ months¼ ╔ wil∞ bσ presentinτ routine≤ át∩ áutilisσ áHires▓ ì
  10. graphic≤ oε Premiuφ Bees.
  11.  
  12. First, some declarations for use by the program.
  13.  
  14. type
  15.   Operation = (ResDot,SetDot,InvDot);
  16.   Script = String[255];
  17.   FileSpec = String[80];
  18.  
  19. var
  20.   PCGRAM : Byte absolute $F800;
  21.  
  22.  
  23. HIRES2 procedure.
  24. Thi≤ áprocedurσ set≤ u≡ thσ 654╡ iε 64x1╢ mode¼ allocate≤ thσ bank≤ iε áthσ ì
  25. attributσ RAM¼ clear≤ thσ PCG≤ iε al∞ bank≤ anΣ fill≤ thσ screeε witΦ thesσ ì
  26. blanδ PCG≤ read∙ fo≥ use.
  27.  
  28.  
  29. Procedure HIRES2;
  30.  
  31. Procedure Set64_16;
  32.  
  33. Begin
  34.   Inline ($21/*+36/    {          LD      HL,DATA }
  35.           $C5/         {          PUSH    BC      }
  36.           $E5/         {          PUSH    HL      }
  37.           6/$10/       {          LD      B,16    }
  38.           $78/         { LOOP     LD      A,B     }
  39.           $3D/         {          DEC     A       }
  40.           $D3/$0C/     {          OUT     (0C),A  }
  41.           $7E/         {          LD      A,(HL)  }
  42.           $D3/$0D/     {          OUT     (0D),A  }
  43.           $2B/         {          DEC     HL      }
  44.           $10/$F6/     {          DJNZ    LOOP    }
  45.           6/$4B/       {          LD      B,75    }
  46.           $E1/         {          POP     HL      }
  47.           $C1/         {          POP     BC      }
  48.           $C9/         {          RET             }
  49.  
  50.           $6B/         {          DB      $6B     }
  51.           $40/         {          DB      $40     }
  52.           $51/         {          DB      $51     }
  53.           $37/         {          DB      $37     }
  54.           $12/         {          DB      $12     }
  55.           9/           {          DB      9       }
  56.           $10/         {          DB      16      }
  57.           $11/         {          DB      17      }
  58.           $48/         {          DB      $48     }
  59.           $0F/         {          DB      15      }è          $2F/         {          DB      $2F     }
  60.           $0F/         {          DB      15      }
  61.           0/           {          DB      0       }
  62.           0/           {          DB      0       }
  63.           0/           {          DB      0       }
  64.           0);          { DATA     DB      0       }
  65. End;
  66.  
  67.  
  68.  
  69. Begin
  70.   ClrScr;
  71.   Set64_16;
  72.  
  73.   Port[28] := 144;
  74.   for Bank := 0 to 7 do
  75.     for Character := 0 to 127 do
  76.       Mem[$F000 + (Bank * 128) + Character] := Bank;
  77.  
  78.   for Bank := 7 downto 0 do
  79.     begin
  80.     Port[28] := 128 + Bank;
  81.     FillChar(PCGRAM,2048,0);
  82.     end;
  83.  
  84.   for Bank := 0 to 7 do
  85.     for Character := 0 to 127 do
  86.       Mem[$F000 + (Bank * 128) + Character] := Character + 128;
  87. End;
  88.  
  89.  
  90. DOT procedure
  91. Thi≤ áprocedurσ set≤ ß do⌠ withiε ╪ range≤ 0..51▒ anΣ ┘ range≤ 0..255¼ áanΣ ì
  92. accordinτ át∩ thσ valuσ oµ F¼ i⌠ wil∞ reset¼ se⌠ o≥ inver⌠ pixe∞ a⌠ á(X,Y)«  ì
  93. Ou⌠ oµ rangσ value≤ arσ ignored.
  94.  
  95. To call it use the following statement :
  96.   DOT(X,  ( in [0..511] )
  97.       Y,  ( in [0..255] )
  98.       F); ( in [ResDot, SetDot, InvDot] )
  99.   eg. DOT(0,0,InvDot);  
  100.  
  101.  
  102.  
  103. Procedure Dot(X,Y : Integer; F : Operation);
  104.  
  105. var
  106.   PCG, Bit, Line : Byte;
  107.   Change : Integer;
  108.  
  109. Begin
  110.   if ((X<0) or (X>511) or (Y<0) or (Y>255)) then Exit;
  111.  
  112.   PCG := Mem[$F3C0 - (Y Div 16) * 64 + X Div 8];
  113.   Bit := 1 Shl (7 - (X Mod 8));
  114.   Line := 15 - Y Mod 16;
  115.   Port[28] := 135 - Y Div 32;
  116.   Change := PCG * 16 + $F000 + Line;
  117.   Case F ofè    ResDot : Mem[Change] := Mem[Change] and not Bit;
  118.     SetDot : Mem[Change] := Mem[Change] or Bit;
  119.     InvDot : Mem[Change] := Mem[Change] xor Bit;
  120.   end;
  121.   Port[28] := 128;
  122. End;
  123.  
  124.  
  125.  
  126. PLOT procedure
  127. Thi≤ áprocedurσ plot≤ ß linσ usinτ thσ do⌠ routinσ above«  T∩ cal∞ ái⌠ áusσ ì
  128. thσ followinτ statemen⌠ :
  129.   PLOT(X0,   ( in [0..511] )
  130.        Y0,   ( in [0..255] )
  131.        X1,   ( in [0..511] )
  132.        Y1,   ( in [0..255] )
  133.        F);   ( in [ResDot, SetDot, InvDot] )
  134.   eg. PLOT(0,0,511,255,SetDot);
  135.  
  136.  
  137.  
  138.  
  139. Procedure Plot(X0,Y0,X1,Y1 : Integer; F : Operation);
  140.  
  141. Var
  142.   Length, I : Integer;
  143.   X,Y,X_Increment,Y_Increment : Real;
  144.  
  145. Begin
  146.   Length := Abs(X1 - X0);
  147.   if Abs(Y1 - Y0) > Length then Length := Abs(Y1 - Y0);
  148.   if Length = 0 then Dot(X0,Y0,F)
  149. else
  150.   begin
  151.   X_Increment := (X1 - X0) / Length;
  152.   Y_Increment := (Y1 - Y0) / Length;
  153.   X := X0 + 0.5; Y := Y0 + 0.5;
  154.   for I := 1 to Length do
  155.     begin
  156.     Dot(trunc(X),trunc(Y),F);
  157.     X := X + X_Increment;
  158.     Y := Y + Y_Increment;
  159.     end;
  160.   end;
  161. End;
  162.  
  163.  
  164.  
  165. PLOTBOX procedure
  166. Thi≤ áprocedurσ plot≤ ß box¼ giveε thσ Bottoφ X¼ Bottoφ Y¼ To≡ ╪ anΣ To≡ á┘ ì
  167. c∩-ordinates«  ╞ specifie≤ whicΦ typσ oµ linσ i≤ t∩ bσ plotted« (Seσ above)
  168.  
  169.  
  170. Procedure PlotBox(BottomX,BottomY,TopX,TopY : Integer;
  171.                   F : Operation);
  172.  
  173. Begin
  174.   Plot(BottomX,BottomY,BottomX,TopY,F);
  175.   Plot(BottomX,TopY,TopX,TopY,F);è  Plot(TopX,TopY,TopX,BottomY,F);
  176.   Plot(TopX,BottomY,BottomX,BottomY,F);
  177. End;
  178.  
  179.  
  180.  
  181.  
  182. NORMAL procedure
  183. Thi≤ procedurσ put≤ thσ 654╡ bacδ iε 80x2┤ mode¼ reset≤ thσ banδ allocatioε ì
  184. iε attributσ RA═ anΣ invert≤ thσ PCG≤ iε al∞ banks« 
  185.  
  186. Procedure Normal;
  187.  
  188. Procedure Set80_24;
  189.  
  190. Begin
  191.   Inline ($21/*+36/    {          LD      HL,DATA }
  192.           $C5/         {          PUSH    BC      }
  193.           $E5/         {          PUSH    HL      }
  194.           6/$10/       {          LD      B,16    }
  195.           $78/         { LOOP     LD      A,B     }
  196.           $3D/         {          DEC     A       }
  197.           $D3/$0C/     {          OUT     (0C),A  }
  198.           $7E/         {          LD      A,(HL)  }
  199.           $D3/$0D/     {          OUT     (0D),A  }
  200.           $2B/         {          DEC     HL      }
  201.           $10/$F6/     {          DJNZ    LOOP    }
  202.           6/$4B/       {          LD      B,75    }
  203.           $E1/         {          POP     HL      }
  204.           $C1/         {          POP     BC      }
  205.           $C9/         {          RET             }
  206.  
  207.           $6B/         {          DB      $6B     }
  208.           $50/         {          DB      $50     }
  209.           $58/         {          DB      $58     }
  210.           $37/         {          DB      $37     }
  211.           $1B/         {          DB      $1B     }
  212.           5/           {          DB      5       }
  213.           $18/         {          DB      $18     }
  214.           $19/         {          DB      $19     }
  215.           $48/         {          DB      $48     }
  216.           10/          {          DB      10      }
  217.           $2A/         {          DB      $2A     }
  218.           10/          {          DB      10      }
  219.           $20/         {          DB      $20     }
  220.           0/           {          DB      0       }
  221.           0/           {          DB      0       }
  222.           0);          { DATA     DB      0       }
  223. End;
  224.  
  225. Procedure Inverse;
  226.  
  227. Begin
  228.   Inline($3E/1/       {       LD     A,1        }
  229.          $D3/$0B/     {       OUT    (11),A     }
  230.          $11/$F800/   {       LD     DE,0F800H  }
  231.          $21/$F000/   {       LD     HL,0F000H  }
  232.          1/$800/      {       LD     BC,00800H  }
  233.          $7E/         { LOOP  LD     A,(HL)     }è         $2F/         {       CPL               }
  234.          $12/         {       LD     (DE),A     }
  235.          $13/         {       INC    DE         }
  236.          $23/         {       INC    HL         }
  237.          $0B/         {       DEC    BC         }
  238.          $79/         {       LD     A,C        }
  239.          $B0/         {       OR     B          }
  240.          $20/$F6/     {       JR     NZ,LOOP    }
  241.          $AF/         {       XOR    A          }
  242.          $D3/$0B);    {       OUT    (11),A     }
  243. End;
  244.  
  245.  
  246. var
  247.   Count : Byte;
  248.   Screen : Integer;
  249.  
  250. Begin
  251.   ClrScr;
  252.   Set80_24;
  253.  
  254.   Port[28] := 144;
  255.     for Screen := 0 to 1919 do
  256.       Mem[$F000 + Screen] := 0;
  257.  
  258.   for Count := 135 downto 128 do
  259.     begin
  260.     Port[28] := Count;
  261.     Inverse;
  262.     end;
  263. End;
  264.  
  265.  
  266.  
  267. Here is a short demo of the above routines...
  268.  
  269.  
  270. BEGIN
  271.   Hires2;
  272.   PlotBox(0,0,511,255,SetDot);
  273.   Plot(0,0,511,255,SetDot);
  274.   Plot(0,255,511,0,SetDot);
  275.   
  276.   repeat
  277.     Dot(Random(511),Random(255),InvDot)
  278.   until KeyPressed;
  279.  
  280.   Normal;
  281. END.
  282.  
  283.  
  284.  
  285. Nex⌠ ámontΦ á╔ áwil∞ ápresen⌠ áß Machinσ Codσ áversioε áoµ áDo⌠ áanΣ áPlot¼ ì
  286. increasinτ áthei≥ áspeeΣ ádramatically« á(╔ actuall∙ áhavσ átimeΣ áthσ átw∩ ì
  287. differen⌠ routines¼ thσ olΣ tooδ 4▒ seconds¼ thσ ne≈ tooδ 12!)
  288.  
  289.  
  290. No time to type them in?
  291. èSend $5, a stamped, self - addressed envelope and 5.25" disk to
  292.               Simon Carter,
  293.             14 Canterbury Rd,
  294.             Heathmont, 3135.
  295.  
  296. anΣ ╔ wil∞ fil∞ you≥ disδ witΦ Hires▓ routine≤ anΣ anythinτ elsσ tha⌠á come≤ ì
  297. t∩ mind....
  298.