*
*``````````````````````````````*
* MEMFILL ::   FILL MEMORY LOC *
*-                            -*
* FILLS A BLOCK OF MEMORY WITH *
* THE SPECIFIED VALUE; USED    *
* OFTEN TO CLEAR LARGE BLOCKS. *
*-                            -*
* CLOBBERS:                    *
*                              *
* FLAGS:  ????----  REG: AXYM  *
*-                            -*
* CYCLES: ???                  *
* SIZE:                        *
*-                            -*
* USAGE:                       *
*                              *
*  LDA  #>$6A00                *
*  PHA                         *
*  LDA  #<$6A00                *
*  PHA                         *
*  LDA  #>1024                 *
*  PHA                         *
*  LDA  #<1024                 *
*  PHA                         *
*  LDA  #0                     *
*  PHA                         *
*  JSR  MEMFILL                *
*-                            -*
* ENTRY                        *
*                              *
* TOP OF STACK                 *
*                              *
* LOW BYTE OF RETURN ADDRESS   *
* HI BYTE OF RETURN ADDRESS    *
* FILL VALUE FOR MEMORY        *
* ARRAY SIZE                   *
* LOW BYTE OF STARTING POINT   *
* HIGH BYTE OF STARTING POINT  *
*-                            -*
* EXIT                         *
*                              *
* TOP OF STACK                 *
*                              *
* LOW BYTE OF RETURN ADDRESS   *
* HI BYTE OF RETURN ADDRESS    *
*                              *
* Y = COUNTER; TRASH           *
* X = COUNTER; TRASH           *
* A = LOW BYTE OF RET ADDR     *
*-                            -*
* ADAPTED FROM LEVANTHAL AND   *
* WINTHROP'S /6502 ASSEMBLY    *
* LANGUAGE ROUTINES/.          *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
MEMFILL
*
** SAVE RETURN ADDRESS
*
         PLA
         STA   RETADR
         PLA
         STA   RETADR+1
*
** GET PARAMETERS
*
         PLA
         STA   :VALUE
         PLA
         STA   :ARYSZ
         PLA
         STA   :ARYSZ+1
         PLA
         STA   ADDR1      ; ZERO PAGE POINTER
         PLA              ; DEFINED IN
         STA   ADDR1+1    ; DECS
*
** FILL WHOLE PAGES FIRST
*
         LDA   :VALUE     ; GET VAL FOR FILL
         LDX   :ARYSZ+1   ; X=# OF PAGES TO DO
         BEQ   :PARTPG    ; BRANCH IF HIGHBYTE OF SZ = 0
         LDY   #0
:FULLPG
         STA   (ADDR1),Y
         INY              ; INC TO NEXT BYTE
         BNE   :FULLPG    ; BRANCH IF NOT DONE W/ PAGE
         INC   ADDR1+1    ; ADVANCE TO NEXT PAGE
         DEX
         BNE   :FULLPG    ; BRANCH IF NOT DONE W/ PAGES
*
** DO THE REMAINING PARTIAL PAGE
** REGISTER A STILL CONTAINS VALUE
*
:PARTPG
         LDX   :ARYSZ     ;GET # OF BYTES IN FINAL PAGE
         BEQ   :EXIT      ; BRANCH IF LOW BYTE = 0
         LDY   #0
:PARTLP
         STA   (ADDR1),Y  ; STORE VAL
         INY              ; INCREMENT INDEX
         DEX              ; DECREMENT COUNTER
         BNE   :PARTLP    ; BRANCH IF NOT DONE
:EXIT
*
** RESTORE RETURN ADDRESS
*
         LDA   RETADR+1
         PHA
         LDA   RETADR
         PHA
         RTS
*
** DATA
*
:VALUE   DS    1          ; FILL VALUE
:ARYSZ   DS    2          ; ARRAY SIZE
*
