;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*- ;; Sets memory in 'A'-registry to all addresses from 'A_start' until 'A_start' + 'length' ;; Modifies A, X and A_start .proc memset .include "mem.inc" ;; big_set sets the memory in $ff chunks. ;; skipp if length >= $ff LDX length +1 BNE big_set JMP small_set big_set: ;sets $ff of memory ;; Y value do not matter, will go through all anyway! .repeat $ff STA (A_start), Y DEY .endrepeat STA (A_start), Y ; dont forget Y =0 big_set_end: ;;set all hole $ff memory chunks! INC A_start + 1 DEX ;; length +1 -- BEQ small_set JMP big_set small_set: STA data_to_write LDA length STA length_copy ;; calculate rts-position LDX #$00 STX length + 1 ;; 3 bytes = STA DEY NOP = seting 1 byte of memory. ;; So we need to calculate: length*3 Mult_16 A, length + 1 ; A= length ADC length_copy TAY LDA length + 1 ADC #$00 STA length + 1 ;; Now RTS_pointer + Y = length*3 + big_set_label LDA #big_set ADC length + 1 STA RTS_pointer + 1 ;; read data we will change to RTS STY Y_copy LDA (RTS_pointer), Y TAX ;; set RTS in big_set LDA #$60 STA (RTS_pointer), Y ;; JSR to modified big_set LDY length_copy DEY ; because we want to count to Y=0 :) LDA data_to_write JSR big_set ;; revert changes LDY Y_copy TXA STA (RTS_pointer), Y RTS .endproc