; C02 library memory.h02 assembly language subroutines
; Requires external routines SETSRC and SETDST
; Requires the following RAM locations be defined
; external zero page byte pairs SRCLO,SRCHI and DSTLO,DSTHI
; and external bytes TEMP0 and TEMP1

;memchr(c, n) - Find Character in Destination Array
;Args: A = Character to look for
;      Y = Number of Elements to Search
;Uses: DSTLO,DSTHI = Pointer to Destination Array 
;Sets: TEMP1 = Character being searched for
;      TEMP0 = Number of bytes
;Affects: N,Z
;Returns: A = Position in Array, C=1 if found
;         A = $FF, C=0 if not found
;         Y = Position of last character scanned
MEMCHR: STA TEMP1       ;Save Search Character
        STY TEMP0       ;Save Count
        BEQ MEMCLC      ;If 0, Return Not Found
        LDY #$00        ;Initialize Index
MEMCHL: LDA (DSTLO),Y   ;Get Next Character
        CMP TEMP1       ;Compare Character
        BEQ MEMCLX      ;If Found, Return Index
        INY             ;Increment Counter
        CPY TEMP0       ;If < Count, Loop
        BCC MEMCHL      ;Else
MEMCLC: CLC             ;Clear Carry
        LDA #$FF        ;Load -1 into Accumulater
        RTS             ;and Return
MEMCLX: TYA             ;Return Index into String
        RTS

;memdst(&r) - Set Destination Array 
;             Called before strcat(), memcmp(), memcpy(), strstr()
;Args: X,Y = Pointer to destination Array
;Sets: DSTLO,DSTHI = Pointer to destination Array
;Affects: N,Z
MEMDST  EQU SETDST      ;Aliased to System Header function

;Set Source Address and Number of Bytes
;Args: X,Y = Pointer to Source Array
;Sets: SCRLO,SRCHI = Pointer to destination Array
;      TEMP0 - Number of Bytes
;Affects: A,N,Z
MEMSRC: JSR SETSRC      ;Initialize Source Array and Index
MEMSRA: STA TEMP0       ;Store Number Of Character
        ORA #0          ;If Number of Bytes
        BNE MEMSRX      ;  Equals 0
        PLA             ;  Pull Return Address off Stack
        PLA             ;  Aborting Calling Routine
MEMSRX: RTS             ;Return

;memcmp(n, &r) - Compare Array (to Destination Array)
;Requires: DSTLO, DSTHI - Pointer to destination Array
;Args: A = Number of Bytes to Compare
;      X,Y = Pointer to source Array
;Sets: TEMP0 = Number of Bytes to Compare
;Affects N
;Returns A=$01 and C=1 if Destination > Source  
;        A=$00 and Z=1 if Destination = Source  
;        A=$FF and C=0 if Destination < Source
;        Y=Position of first character that differs
MEMCMP: JSR MEMSRC      ;Initialize Source, Index, and Count
MEMCML: LDA (DSTLO),Y   ;Load Destination Character
        CMP (SRCLO),Y   ;Compare Against Source Character
        BNE MEMCMX      ;If Equal
        INY             ;  Increment Offset
        CPY TEMP0       ;  If < Count  
        BCC MEMCML      ;    Loop
MEMCMZ: LDA #$00        ;  Else 
        RTS             ;    Return 0
MEMCMX: BCC MEMCLC      ;If Source < Destination Return -1
        LDA #$01        ;Else Return 1
MEMCMR: RTS             ;  

;memcpy(n, &r) - Copy Array (to Destination Array)
;Requires: DSTLO, DSTHI - Pointer to destination Array
;Args: A = Number of bytes to copy
;      X,Y = Pointer to source Array
;Sets: TEMP0 = Number of bytes to copy
;Affects: A,Y,C,N,Z
;Returns: A=Number of Bytes Copied
MEMCPY: JSR MEMSRC      ;Initialize Source, Index, and Count
MEMCPL: LDA (SRCLO),Y   ;Get Character from Source Array
        STA (DSTLO),Y   ;Copy to Destination Array
        INY             ;  Increment Index
        CPY TEMP0       ;If < Count
        BCC MEMCPL      ;  Loop 
        TYA             ;Copy Index to Accumulater
        RTS             ;Else Return

MEMCLR: JSR SETDST      ;Set Destination Address
        TAY             ;Transer Count to Y 
        LDA #0          ;Set Fill Character to Null
                        ;and Fall into MEMSET

;memset(c, n) - Fill Destination Array
;Args: A = Character to fill with
;      Y = Number of bytes to fill
;Uses: DSTLO,DSTHI = Pointer to Destination Array 
;Sets: TEMP0 = Number of bytes
;Affects: N,Z
MEMSET: STY TEMP0       ;Save Count
        CPY #0          ;If 0
        BEQ MEMSEX      ;  Return 
        LDY #$00        ;Initialize Index
MEMSEL: STA (DSTLO),Y   ;Store Character at Index
        INY             ;Increment Counter
        CPY TEMP0       ;If < Count, Loop
        BCC MEMSEL      ;Else
MEMSEX: RTS

;memswp(n, &r) - Swap Array (with Destination Array)
;Requires: DSTLO, DSTHI - Pointer to destination Array
;Args: A = Number of bytes to swap
;      X,Y = Pointer to source array
;Sets: TEMP0 = Number of bytes to swap
;Affects: A,X,Y,C,N,Z
MEMSWP: JSR MEMSRC      ;Initialize Source, Index, and Count
MEMSWL: LDA (DSTLO),Y   ;Get Character from Destination Array
        TAX             ;Save in X Register
        LDA (SRCLO),Y   ;Get Character from Source Array
        STA (DSTLO),Y   ;Copy to Destination Array
        TXA             ;Restore Saved Character
        STA (SRCLO),Y   ;Copy to Source Array        
        INY             ;  Increment Index
        CPY TEMP0       ;If < Count
        BCC MEMSWL      ;  Loop 
        RTS             ;Else Return

