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 / MBUG094.ARC / HIRES5C.I < prev    next >
Text File  |  1979-12-31  |  12KB  |  249 lines

  1. function HiDot (X, Y, F : Integer) : Boolean;
  2.  
  3. {Modified by R.K.Hallworth of Donvale Christian School for the
  4.  Premium using 64x16 screen
  5.  Function to alter a pixel anywhere on the screen.  Returns TRUE if
  6.  successful and FALSE if there is an illegal parameter or if all PCGs have
  7.  been used.  HiRes must be called prior to the first call to HiDot }
  8.  
  9. var
  10.   Scratch : array [0..15] of Byte;  {Scratch for desired PCG}
  11.   Temp,Bank,                             {Temporary storage}
  12.   Memory,
  13.   Video   : Integer;                {Address in screen RAM of PCG to be
  14.                                      changed}
  15.   PCGAddr :Integer;                  {address of PCG}
  16.   Line,                             {Line of PCG to be changed}
  17.   PCG,PCGByte,                      {PCG at Mem[Video]}
  18.   Mask    : Byte;                   {Mask to be applied to Scratch[Line]
  19.                                      to alter the correct dot}
  20.   H       : Boolean;                {Result of HiDot}
  21. Type
  22.   MaskArray=array[0..7] of byte;
  23. const
  24.   Masks:MaskArray=(1,2,4,8,16,32,64,128);
  25.  
  26. begin
  27.  
  28.   Inline(
  29.  
  30.  {First, check that all parameters are legal}
  31.           $A7/                 {          AND    A              }
  32.           $ED/$5B/X/           {          LD     DE, (X)        }
  33.           $21/511/             {          LD     HL, 511        }
  34.           $ED/$52/             {          SBC    HL, DE         }
  35.           $DA/*+25/            {          JP     C, FALSE       }
  36.           $ED/$5B/Y/           {          LD     DE, (Y)        }
  37.           $21/>255/             {          LD     HL, 255        }
  38.           $ED/$52/             {          SBC    HL, DE         }
  39.           $DA/*+13/            {          JP     C, FALSE       }
  40.           $3A/F/               {          LD     A, (F)         }
  41.           $D6/3/               {          SUB    3              }
  42.           $D2/*+5/             {          JP     NC, FALSE      }
  43.           $C3/*+6/             {          JP     NEXT1          }
  44.           $97/                 { FALSE    SUB    A              }
  45.           $C3/*+237/           {          JP     FINISH         }
  46.  
  47.     {Mask to be applied to Scratch[Line]}
  48.  
  49.             $2A/X/           { NEXT1    LD     HL, (X)        }
  50.             $7D/             {          LD     A, L           }
  51.             $0E/7/           {          LD     C, 00000111B   }
  52.             $A1/             {          AND    C              }
  53.             $A9/             {          XOR    C              }
  54.             $E5/             {          PUSH   HL             }
  55.             $5F/             {          LD     E,A            }
  56.             $16/0/           {          LD     D,0            }
  57.             $21/MASKS/       {          LD     HL,MASKS       }
  58.             $19/             {          ADD    HL,DE          }
  59.             $7E/             {          LD     A,(HL)         }
  60.             $E1/             {          POP    HL             }
  61.             $32/Mask/        { SAVE     LD     (Mask), A      }
  62.  
  63.             {Calculate X DIV 8 and save on the stack}
  64.  
  65.             $06/$03/         {          LD     B, 3           }
  66.             $CB/$3D/         { XDIV     SRL    L              }
  67.             $CB/$3C/         {          SRL    H              }
  68.             $D2/*+4/         {          JP     NC, NOCARRY    }
  69.             $CB/$FD/         {          SET    7, L           }
  70.             $10/$F5/         { NOCARRY  DJNZ   XDIV           }
  71.             $E5/             {          PUSH   HL             }
  72.  
  73.  
  74.             {Calculate Line in PCG}
  75.  
  76.             $2A/Y/           {          LD     HL, (Y)        }
  77.             $3E/15/          {          LD     A,15          * }
  78.             $A5/             {          AND    A,L           * }
  79.             $67/             {          LD     H,A           * }
  80.             $3E/15/          {          LD     A, 15          }
  81.             $94/             {          SUB    H              }
  82.             $32/Line/        {          LD     (Line), A      }
  83.  
  84.             {Invert quotient and "multiply by 64" only X4}
  85.  
  86.             $2A/Y/           {          LD     HL, (Y)       * }
  87.             $7D/             {          LD     A,L           * }
  88.             $16/240/         {          LD     D,11110000B   * }
  89.             $A2/             {          AND    A,D           * }
  90.             $AA/             {          XOR    A,D           * }
  91.             $6F/             {          LD     L,A           * }
  92.             $06/0/           {          LD     B,0           * }
  93.             $29/             {          ADD    HL, HL         }
  94.             $29/             {          ADD    HL, HL         }
  95.  
  96.             {POP X DIV 8 off stack, add it, add $F000 and save Video address}
  97.  
  98.             $D1/             {          POP    DE             }
  99.             $19/             {          ADD    HL, DE         }
  100.             $E5/             {          PUSH   HL             }
  101.             $11/$F000/       {          LD     DE, $F000      }
  102.             $19/             {          ADD    HL, DE         }
  103.             $22/Video/       {          LD     (Video), HL    }
  104.  
  105.           {Port[ROMLatch] := ScreenRAM;}
  106.  
  107.             $97/             {          SUB     A             }
  108.             $D3/11/          {          OUT     (11), A       }
  109.  
  110.           {PCG := Mem[Video]; }
  111.  
  112.             $7E/             {          LD     A, (HL)        }
  113.             $32/PCG/         {          LD     (PCG), A       }
  114.  
  115.      {TEST If PCG < 127 }
  116.           $6F/               {          LD     L,A   SAVE PCG#}
  117.           $D6/127/           {          SUB    127            }
  118.           $FA/*+21/          {          JP     M,NONGRAPHIC   }
  119.  
  120.  
  121.       {Do IF PCG>127}        {Set PCG RAM}
  122.  
  123.           $F1/               {      POP  AF CLEAR STACK     }
  124.           $CB/$BD/           {      RES  L,7                }
  125.           $E5/               {      PUSH HL SAVE PCG NO.   }
  126.           $3E/144/           {      LD   A,144 }
  127.           $D3/28/            {      OUT  (28),A}
  128.           $2A/VIDEO/         {      LD   HL,(VIDEO)}
  129.           $7E/               {      LD   A,(HL)}
  130.           $C6/$80/           {      ADD  A,128}
  131.           $D3/$1C/           {      OUT  (28),A}
  132.           $C3/*+39/          {      JP   GRAPHIC}
  133.  
  134.        {Do IF PCG < 128}      {Find PCG Bank No. }
  135.  
  136.           $D1/          {NONGRAPHIC POP DE}
  137.           $D5/               {      PUSH DE}
  138.           $CB/$22/           {      SLA D}
  139.           $CB/$7B/           {      BIT 7,E}
  140.           $CA/*+4/           {      JP Z,CONT}
  141.           $CB/$C2/           {      SET 0,D}
  142.                              {            ;D=Bank No.}
  143.  
  144.  
  145.              {Set attribute RAM}
  146.  
  147.           $3E/144/           {CONT: LD A,144 50}
  148.           $D3/28/            {      OUT (28),A}
  149.           $2A/VIDEO/         {      LD HL,(VIDEO)}
  150.           $7A/               {      LD A,D}
  151.           $77/               {      LD (HL),A}
  152.  
  153.     {Set PCG RAM}
  154.  
  155.           $C6/$80/           {      ADD A,128}
  156.           $D3/$1C/           {      OUT (28),A}
  157.  
  158.     {Calculate PCG_No}
  159.  
  160.           $E1/                {         POP   HL        }
  161.           $7D/                {         LD    A, L      }
  162.           $E6/127/            {         AND   127       }
  163.           $6F/                {         LD    L, A      }
  164.           $E5/                {         PUSH  HL        }
  165.  
  166.       {Mem[Video]:= PCG_No}
  167.  
  168.             $7D/             {          LD      A, L          }
  169.             $C6/128/         {          ADD     A, 128         }
  170.             $2A/Video/       {          LD      HL, (VIDEO)    }
  171.             $77/             {          LD      (HL), A        }
  172.  
  173.  
  174.     {Save  PCG address }
  175.  
  176.             $E1/             {Graphic   POP     HL             }
  177.             $26/0/           {          LD      H, 0           }
  178.             $29/             {          ADD     HL, HL         }
  179.             $29/             {          ADD     HL, HL         }
  180.             $29/             {          ADD     HL, HL         }
  181.             $29/             {          ADD     HL, HL         }
  182.             $11/$F800/       {          LD      DE, $F800      }
  183.             $19/             {          ADD     HL, DE         }
  184.             $22/PCGAddr/     {          LD      (PCGAddr),HL   }
  185.  
  186.           {If PCG < 128 }
  187.  
  188.           $3A/PCG/           {          LD     A,(PCG)        }
  189.           $6F/               {          LD     L,A            }
  190.           $60/               {          LD     H,B            }
  191.           $D6/127/           {          SUB    127            }
  192.           $F2/*+22/          {          JP     P,NEXT2        }
  193.  
  194.           {Port[ROMLatch] := StandardSet;}
  195.  
  196.             $3E/1/           {          LD     A, 1           }
  197.             $D3/11/          {          OUT    (11), A        }
  198.  
  199.           {Copy the present character into PCG RAM}
  200.             $29/             {          ADD     HL, HL        }
  201.             $29/             {          ADD     HL, HL        }
  202.             $29/             {          ADD     HL, HL        }
  203.             $29/             {          ADD     HL, HL        }
  204.             $11/$F000/       {          LD      DE, $F000     }
  205.             $19/             {          ADD     HL, DE        }
  206.             $ED/$5B/PCGAddr/ {          LD      DE, (PCGAddr) }
  207.             $0E/16/          {          LD      C, 16         }
  208.             $ED/$B0/         {          LDIR                  }
  209.  
  210.           {Port[ROMLatch] := ScreenRAM;}
  211.  
  212.             $97/             {          SUB     A             }
  213.             $D3/11/          {          OUT     (11), A       }
  214.  
  215.  
  216.  
  217.              { 114}
  218.             {Change Scratch[Line] using Mask.  Test to see if it has changed.}
  219.             $2A/PCGAddr/     {NEXT2     LD      HL, (PCGAddr) }
  220.             $ED/$5B/Line/    {          LD      DE, (Line)    }
  221.             $16/0/           {          LD      D, 0          }
  222.             $19/             {          ADD     HL, DE        }
  223.             $46/             {          LD      B, (HL)       }
  224.             $3A/Mask/        {          LD      A, (Mask)     }
  225.             $4F/             {          LD      C, A          }
  226.             $3A/F/           {          LD      A, (F)        }
  227.             $FE/0/           {          CP      0             }
  228.             $CA/*+12/        {          JP      Z, ANDMASK    }
  229.             $FE/1/           {          CP      1             }
  230.             $CA/*+13/        {          JP      Z, ORMASK     }
  231.             $78/             {          LD      A, B          }
  232.             $A9/             {          XOR     C             }
  233.             $C3/*+14/        {          JP      CHANGE        }
  234.             $79/             { ANDMASK  LD      A, C          }
  235.             $2F/             {          CPL                   }
  236.             $A0/             {          AND     B             }
  237.             $C3/*+4/         {          JP      CHANGED       }
  238.             $78/             { ORMASK   LD      A, B          }
  239.             $B1/             {          OR      C             }
  240.             $B8/             { CHANGED  CP      B             }
  241.             $CA/*+3/         {          JP      Z, DONE       }
  242.             $77/             { CHANGE   LD      (HL), A       }
  243.             $3E/1/           { DONE     LD      A, 1           }
  244.             $32/H/           { FINISH   LD      (H), A         }
  245.             $3E/128/         {          LD      A,128          }
  246.             $D3/28);         {          OUT     (28),A  Set to bank 0 }
  247.       HiDot := H
  248. end;
  249.