* *``````````````````````````````* * 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 *