home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug022.arc / GRAPHIC.PAS < prev    next >
Pascal/Delphi Source File  |  1979-12-31  |  18KB  |  409 lines

  1. {original code by
  2.  Eric Reaburn  6 November 1985  7:20 pm
  3.  modified for speed by D Breeze 20/may/86
  4. }
  5. {$A+}
  6. procedure RestorePCG;
  7. begin
  8.  
  9. inline ($3e/$01/           { ld  a,01    }
  10.         $d3/$0b/           { out (0b),a  }
  11.         $21/>$f000/        { ld hl,f000h }
  12.         $11/>$f800/        { ld de,f800h }
  13.         $7e/               { ld  a,(hl)  }
  14.         $2f/               { cpl         }
  15.         $12/               { ld (de),a   }
  16.         $13/               { inc de      }
  17.         $23/               { inc hl      }
  18.         $cb/$5c/           { bit 3,h     }
  19.         $28/<-9/           { jr z,*-9    }
  20.         $3e/$00/           { ld a,0      }
  21.         $d3/$0b);          { out (0b),a  }
  22.  
  23. end; {RestorePCG}
  24.  
  25. PROCEDURE LORES;
  26.  
  27. begin
  28.   inline($21/>$f800/        {     ld hl,f800h   }
  29.          $0e/$80/           {     ld  c,80h     }
  30.          $59/               { l1: ld  e,c       }
  31.          $16/$03/           {     ld  d,3       }
  32.          $af/               { l2: xor a         }
  33.          $cb/$43/           {     bit 0,e       }
  34.          $28/<+2/           {     jr  z,l3      }
  35.          $f6/$f0/           {     or  0f0h      }
  36.          $cb/$4b/           { l3: bit 1,e       }
  37.          $28/<+2/           {     jr  z,l4      }
  38.          $f6/$0f/           {     or  0fh       }
  39.          $c5/               { l4: push bc       }
  40.          $4f/               {     ld  c,a       }
  41.          $3e/01/            {     ld  a,1       }
  42.          $ba/               {     cp  d         }
  43.          $79/               {     ld  a,c       }
  44.          $c1/               {     pop  bc       }
  45.          $28/<+4/           {     jr  z,l5      }
  46.          $06/$04/           {     ld  b,4       }
  47.          $18/<+2/           {     jr  l6        }
  48.          $06/$07/           { l5: ld  b,7       }
  49.          $77/               { l6: ld (hl),a     }
  50.          $23/               {     inc hl        }
  51.          $10/<-4/           {     djnz l6       }
  52.          $cb/$0b/           {     rrc  e        }
  53.          $cb/$0b/           {     rrc  e        }
  54.          $15/               {     dec  d        }
  55.          $20/<-39/          {     jr  nz,l2     }
  56.          $77/               {     ld (hl),a     }
  57.          $23/               {     inc hl        }
  58.          $0c/               {     inc  c        }
  59.          $3e/$c0/           {     ld a,c0       }
  60.          $b9/               {     cp c          }
  61.          $20/<-50);         {     jr  nz,l1     }
  62.       end;
  63.  
  64. {____________________________________________________________________________}
  65.  
  66. PROCEDURE DOT(draw:boolean;X1,Y1:byte);
  67.  
  68. VAR
  69. X3,Y3:byte;
  70. a,B:BYTE;
  71. screenloc,I:INTEGER;
  72.  
  73. BEGIN
  74. {X3:=modd(X1,2)}
  75.   inline($06/08/                   {     ld  b,8     }
  76.          $3a/x1/                   {     ld  a,(x1)  }
  77.          $5f/                      {     ld  e,a     }
  78.          $3e/02/                   {     ld  a,2     }
  79.          $4f/                      {     ld  c,a     }
  80.          $af/                      {     xor  a      }
  81.          $cb/$13/                  { l1: rl  e       }
  82.          $17/                      {     rla         }
  83.          $91/                      {     sub c       }
  84.          $30/<+1/                  {     jr nc,l2    }
  85.          $81/                      {     add a,c     }
  86.          $10/<-9/                  { l2: djnz l1     }
  87.          $32/x3/                   {     ld (x3),a   }
  88. {Y3:=modd(Y1,3)}
  89.          $06/08/                   {     ld  b,8     }
  90.          $3a/y1/                   {     ld  a,(y1)  }
  91.          $5f/                      {     ld  e,a     }
  92.          $3e/03/                   {     ld  a,3     }
  93.          $4f/                      {     ld  c,a     }
  94.          $af/                      {     xor  a      }
  95.          $cb/$13/                  { l1: rl  e       }
  96.          $17/                      {     rla         }
  97.          $91/                      {     sub c       }
  98.          $30/<+1/                  {     jr nc,l2    }
  99.          $81/                      {     add a,c     }
  100.          $10/<-9/                  { l2: djnz l1     }
  101.          $32/y3/                   {     ld (y3),a   }
  102. {y1=y1/8}
  103.          $06/08/                   {     ld  b,8     }
  104.          $3a/x1/                   {     ld  a,(x1)  }
  105.          $5f/                      {     ld  e,a     }
  106.          $3e/02/                   {     ld  a,2     }
  107.          $4f/                      {     ld  c,a     }
  108.          $af/                      {     xor  a      }
  109.          $cb/$13/                  { l1: rl  e       }
  110.          $17/                      {     rla         }
  111.          $91/                      {     sub c       }
  112.          $30/<+1/                  {     jr nc,l2    }
  113.          $81/                      {     add a,c     }
  114.          $10/<-9/                  { l2: djnz l1     }
  115.          $7b/                      {     ld a,e      }
  116.          $17/                      {     rla         }
  117.          $2f/                      {     cpl         }
  118.          $32/x1/                   {     ld (x1),a   }
  119. {y1=y1/8}
  120.          $06/08/                   {     ld  b,8     }
  121.          $3a/y1/                   {     ld  a,(y1)  }
  122.          $5f/                      {     ld  e,a     }
  123.          $3e/03/                   {     ld  a,3     }
  124.          $4f/                      {     ld  c,a     }
  125.          $af/                      {     xor  a      }
  126.          $cb/$13/                  { l1: rl  e       }
  127.          $17/                      {     rla         }
  128.          $91/                      {     sub c       }
  129.          $30/<+1/                  {     jr nc,l2    }
  130.          $81/                      {     add a,c     }
  131.          $10/<-9/                  { l2: djnz l1     }
  132.          $7b/                      {     ld a,e      }
  133.          $17/                      {     rla         }
  134.          $2f/                      {     cpl         }
  135. {set dot}
  136.         $21/>$f000/           {    ld hl,f000  }
  137.         $47/                  {    ld  b,a     }
  138.         $04/                  {    inc b       }
  139.         $11/>$0050/           {    ld  de,0050 }
  140.         $18/<+1/              {    jr  lp2     }
  141.         $19/                  {lp1 add hl,de   }
  142.         $10/<-3/              {lp2 djnz lp1    }
  143.         $16/00/               {    ld   d,0    }
  144.         $3a/x1/               {    ld   a,(x1) }
  145.         $5f/                  {    ld   e,a    }
  146.         $19/                  {    add  hl,de  }
  147.         $22/screenloc/        {    ld  (hl),hl }
  148.         $7e/                  {    ld   a,(hl) }
  149.         $32/a/                {    ld   (a),a  }
  150.         $fe/128/              {    cp  128     }
  151.         $fa/>*+8/             {    jp  m,p1    }
  152.         $fe/128+63/           {    cp  128+63  }
  153.         $3e/<+4/              {    jr  c,p1    }
  154.         $18/<+5/              {    jr  l2      }
  155.         $3e/128/              { p1 ld  a,128   }
  156.         $32/a/                {    ld  (a),a   }
  157.         $3a/y3/               { p2 ld  a,(y3)  }
  158.         $47/                  {    ld  b,a     }
  159.         $04/                  {    inc b       }
  160.         $3a/x3/               {    ld  a,(x3)  }
  161.         $3c/                  {    inc a       }
  162.         $18/<+4/              {    jr  l2      }
  163.         $cb/$27/              { l1 sla a       }
  164.         $cb/$27/              {    sla a       }
  165.         $10/<-6/              { l2 djnz l1     }
  166.         $32/b/                {    ld (b),a    }
  167.         $3a/draw/             {    ld a,(draw) }
  168.         $fe/$01/              {    cp 1        }
  169.         $28/<+11/             {    jr z,lor    }
  170.         $3a/b/                {    ld a,(b)    }
  171.         $2f/                  {    cpl         }
  172.         $47/                  {    ld b,a      }
  173.         $3a/a/                {    ld a,(a)    }
  174.         $a0/                  {    and b       }
  175.         $18/<+8/              {    jr fin      }
  176.         $3a/b/                {lor ld a,(b)    }
  177.         $47/                  {    ld b,a      }
  178.         $3a/a/                {    ld a,(a)    }
  179.         $b0/                  {    or b        }
  180.         $2a/screenloc/        {fin ld hl,(hl)  }
  181.         $77);                 {    ld  (hl),a  }
  182. END;
  183.  
  184. (*IF draw THEN A:=(A OR B) ELSE A:=(A AND (255-B));*)
  185. {____________________________________________________________________________}
  186.  
  187. function point(x1,y1:byte):boolean;
  188.  
  189. VAR
  190.  
  191. temp:boolean;
  192. a,b,X3,Y3:byte;
  193.  
  194. begin
  195.   {X3:=modd(X1,2)}
  196.   inline($06/08/                   {     ld  b,8     }
  197.          $3a/x1/                   {     ld  a,(x1)  }
  198.          $5f/                      {     ld  e,a     }
  199.          $3e/02/                   {     ld  a,2     }
  200.          $4f/                      {     ld  c,a     }
  201.          $af/                      {     xor  a      }
  202.          $cb/$13/                  { l1: rl  e       }
  203.          $17/                      {     rla         }
  204.          $91/                      {     sub c       }
  205.          $30/<+1/                  {     jr nc,l2    }
  206.          $81/                      {     add a,c     }
  207.          $10/<-9/                  { l2: djnz l1     }
  208.          $32/x3/                   {     ld (x3),a   }
  209. {Y3:=modd(Y1,3)}
  210.          $06/08/                   {     ld  b,8     }
  211.          $3a/y1/                   {     ld  a,(y1)  }
  212.          $5f/                      {     ld  e,a     }
  213.          $3e/03/                   {     ld  a,3     }
  214.          $4f/                      {     ld  c,a     }
  215.          $af/                      {     xor  a      }
  216.          $cb/$13/                  { l1: rl  e       }
  217.          $17/                      {     rla         }
  218.          $91/                      {     sub c       }
  219.          $30/<+1/                  {     jr nc,l2    }
  220.          $81/                      {     add a,c     }
  221.          $10/<-9/                  { l2: djnz l1     }
  222.          $32/y3/                   {     ld (y3),a   }
  223.  
  224.  
  225. {y1=y1/8}
  226.          $06/08/                   {     ld  b,8     }
  227.          $3a/x1/                   {     ld  a,(x1)  }
  228.          $5f/                      {     ld  e,a     }
  229.          $3e/02/                   {     ld  a,2     }
  230.          $4f/                      {     ld  c,a     }
  231.          $af/                      {     xor  a      }
  232.          $cb/$13/                  { l1: rl  e       }
  233.          $17/                      {     rla         }
  234.          $91/                      {     sub c       }
  235.          $30/<+1/                  {     jr nc,l2    }
  236.          $81/                      {     add a,c     }
  237.          $10/<-9/                  { l2: djnz l1     }
  238.          $7b/                      {     ld a,e      }
  239.          $17/                      {     rla         }
  240.          $2f/                      {     cpl         }
  241.          $32/x1/                   {     ld (x1),a   }
  242. {y1=y1/8}
  243.          $06/08/                   {     ld  b,8     }
  244.          $3a/y1/                   {     ld  a,(y1)  }
  245.          $5f/                      {     ld  e,a     }
  246.          $3e/03/                   {     ld  a,3     }
  247.          $4f/                      {     ld  c,a     }
  248.          $af/                      {     xor  a      }
  249.          $cb/$13/                  { l1: rl  e       }
  250.          $17/                      {     rla         }
  251.          $91/                      {     sub c       }
  252.          $30/<+1/                  {     jr nc,l2    }
  253.          $81/                      {     add a,c     }
  254.          $10/<-9/                  { l2: djnz l1     }
  255.          $7b/                      {     ld a,e      }
  256.          $17/                      {     rla         }
  257.          $2f/                      {     cpl         }
  258. {set dot}
  259.  
  260.         $21/>$f000/           {    ld hl,f000  }
  261.         $47/                  {    ld  b,a     }
  262.         $04/                  {    inc b       }
  263.         $11/>$0050/           {    ld  de,0050 }
  264.         $18/<+1/              {    jr  lp2     }
  265.         $19/                  {lp1 add hl,de   }
  266.         $10/<-3/              {lp2 djnz lp1    }
  267.         $16/00/               {    ld   d,0    }
  268.         $3a/x1/               {    ld   a,(x1) }
  269.         $5f/                  {    ld   e,a    }
  270.         $19/                  {    add  hl,de  }
  271.         $7e/                  {    ld   a,(hl) }
  272.         $32/a/                {    ld   (a),a  }
  273.         $fe/128/              {    cp  128     }
  274.         $fa/>*+8/             {    jp  m,p1    }
  275.         $fe/128+63/           {    cp  128+63  }
  276.         $3e/<+4/              {    jr  c,p1    }
  277.         $18/<+5/              {    jr  l2      }
  278.         $3e/128/              { p1 ld  a,128   }
  279.         $32/a/                {    ld  (a),a   }
  280.         $3a/y3/               { p2 ld  a,(y3)  }
  281.         $47/                  {    ld  b,a     }
  282.         $04/                  {    inc b       }
  283.         $3a/x3/               {    ld  a,(x3)  }
  284.         $3c/                  {    inc a       }
  285.         $18/<+4/              {    jr  l2      }
  286.         $cb/$27/              { l1 sla a       }
  287.         $cb/$27/              {    sla a       }
  288.         $10/<-6/              { l2 djnz l1     }
  289.         $32/b);               {    ld (b),a    }
  290.  
  291.         if (a and b)=0 then point:=false else point:=true;
  292.  
  293. END;
  294.  
  295. {____________________________________________________________________________}
  296.  
  297. procedure Swap (var a,b:byte);
  298.  
  299. var
  300.   temp:byte;
  301. begin
  302. temp := a; a := b; b := temp;
  303. end; {Swap}
  304. {____________________________________________________________________________}
  305. procedure Line (draw:boolean; x1,y1,x2,y2:byte);
  306. {If "draw" is true, then draw a line from (x1,y1) to (x2,y2); else erase a
  307.  line from (x1,y1) to (x2,y2).}
  308. var
  309.   x,y:byte;
  310.   xreal,yreal,incx,incy:real;
  311.   lx,ly:integer;
  312.   equiv:boolean;
  313. begin
  314. lx := x2 - x1; ly := y2 - y1; {length horizontal; length vertical}
  315. if (lx <> 0) or (ly <> 0)
  316.   then begin                      {only if BOTH lx AND ly aren't zero}
  317.        if (lx <> 0) xor (ly <> 0)
  318.          then begin               {only if EITHER lx OR ly is zero}
  319.               if lx = 0
  320.                 then begin               {vertical line}
  321.                      if ly < 0
  322.                        then Swap(y1,y2);
  323.                      for y:=y1 to y2 do
  324.                        dot(draw,x1,y);
  325.                      end
  326.                 else begin               {horizontal line}
  327.                      if lx < 0
  328.                        then Swap(x1,x2);
  329.                      for x:=x1 to x2 do
  330.                        dot(draw,x,y1);
  331.                      end;
  332.               end
  333.          else begin                    {NEITHER ly NOR lx are zero}
  334.               if ((lx < 0) and (ly < 0)) or ((lx > 0) and (ly > 0))
  335.                 then equiv := true {if equivalent in sign, i.e. diagonal sloping from top left to bottom right}
  336.                 else equiv := false; {else it's a diagonal sloping from bottom left to top right}
  337.               if abs(lx) >= abs(ly)
  338.                 then begin {horizontal length => vertical length}
  339.                      incy := abs(ly / lx);
  340.                      if lx < 0
  341.                        then begin        {swap coordinates}
  342.                             Swap(x1,x2); Swap(y1,y2);
  343.                             end;
  344.                      yreal := y1;
  345.                      for x:=x1 to x2 do
  346.                        begin
  347.                        dot(draw,x,round(yreal));
  348.                        if equiv then yreal := yreal + incy
  349.                                 else yreal := yreal - incy;
  350.                        end;
  351.                      end
  352.                 else begin {vertical length > horizontal length}
  353.                      incx := abs(lx / ly);
  354.                      if ly < 0
  355.                        then begin
  356.                             Swap(x1,x2); Swap(y1,y2);
  357.                             end;
  358.                      xreal := x1;
  359.                      for y:=y1 to y2 do
  360.                        begin
  361.                        dot(draw,round(xreal),y);
  362.                        if equiv then xreal := xreal + incx
  363.                                 else xreal := xreal - incx;
  364.                        end;
  365.                      end;
  366.               end;
  367.        end
  368.   else dot(draw,x1,y1);
  369. end; {Line}
  370. {____________________________________________________________________________}
  371.  
  372. {____________________________________________________________________________}
  373. procedure Arc (draw:boolean; centrex,centrey:integer; xradius,yradius:byte;
  374.                startangle,finishangle:real);
  375.  
  376. var
  377.   theta,inc:real;
  378.   x,y:integer;
  379. begin
  380. if (startangle >= 0) and (finishangle > startangle)
  381.   then begin
  382.        inc := 1 / ((xradius shl 1) + yradius);
  383.        theta := startangle;
  384.        repeat
  385.          y := round(sin(theta) * yradius); x := round(cos(theta) * xradius);
  386.          dot(draw,centrex+x,centrey-y);
  387.          theta := theta + inc;
  388.        until theta > finishangle;
  389.        end;
  390. end; {Arc}
  391. {____________________________________________________________________________}
  392. procedure Box (draw:boolean; x,y,lx,ly:byte);
  393. {If "draw" is true draw a box, else erase it. (x,y) are coordinates of the
  394.  upper left corner of the box, "lx" is width of the box, "ly" is height of the
  395.  box.}
  396. begin
  397. line(draw,x,y,x+lx,y);
  398. line(draw,x,y,x,y+ly);
  399. line(draw,x+lx,y,x+lx,y+ly);
  400. line(draw,x,y+ly,x+lx,y+ly);
  401. end; {Box}
  402. {____________________________________________________________________________}
  403. function Rad (degrees:integer) :real;
  404. {Convert "degrees" to radians.}
  405. begin
  406. Rad := (degrees / 180) * pi;
  407. end; {Rad}
  408.  
  409.