2018-01-28 18:30:49 +00:00
|
|
|
; 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
|
|
|
|
|
2018-07-25 23:00:46 +00:00
|
|
|
;Set Source Address and Number of Bytes
|
2018-01-28 18:30:49 +00:00
|
|
|
;Args: X,Y = Pointer to Source Array
|
2018-07-25 23:00:46 +00:00
|
|
|
;Sets: SCRLO,SRCHI = Pointer to destination Array
|
|
|
|
; TEMP0 - Number of Bytes
|
2018-01-28 18:30:49 +00:00
|
|
|
;Affects: A,N,Z
|
|
|
|
MEMSRC: JSR SETSRC ;Initialize Source Array and Index
|
|
|
|
MEMSRA: STA TEMP0 ;Store Number Of Character
|
2018-07-25 23:00:46 +00:00
|
|
|
ORA #0 ;If Number of Bytes
|
2018-01-28 18:30:49 +00:00
|
|
|
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
|
2018-07-25 23:00:46 +00:00
|
|
|
;Returns: A=Number of Bytes Copied
|
2018-01-28 18:30:49 +00:00
|
|
|
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
|
2018-07-25 23:00:46 +00:00
|
|
|
TYA ;Copy Index to Accumulater
|
2018-01-28 18:30:49 +00:00
|
|
|
RTS ;Else Return
|
|
|
|
|
2018-07-30 21:20:16 +00:00
|
|
|
MEMCLR: JSR SETDST ;Set Destination Address
|
|
|
|
TAY ;Transer Count to Y
|
|
|
|
LDA #0 ;Set Fill Character to Null
|
|
|
|
;and Fall into MEMSET
|
|
|
|
|
2018-01-28 18:30:49 +00:00
|
|
|
;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
|
2018-07-27 17:55:10 +00:00
|
|
|
MEMSWL: LDA (DSTLO),Y ;Get Character from Destination Array
|
2018-01-28 18:30:49 +00:00
|
|
|
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
|
|
|
|
|