;c02 library stddef.h02 assembly language subroutines
;Requires External Zero Page Variables 
;DSTLO, DSTHI, SRCLO, SRCHI
;External Variables 
;TEMP0, TEMP1, TEMP2

;Constant Definitions
TRUE    EQU $FF     ;Returned for Success or Failure
FALSE   EQU $00     ;by some Library Routines

;savdst() - Save Destination Pointer
SAVDST: JSR GETDST  ;Load Destination Pointer
        JMP SAVRXY  ;Save X & Y Registers

;savsrc() - Save Source Pointer
SAVSRC: JSR GETSRC  ;Load Destination Pointer
        JMP SAVRXY  ;Save X & Y Registers

;Save Registers
SAVREG: STA TEMP0   ;Save Accumulater
SAVRXY: STX TEMP1   ;Save X Index
        STY TEMP2   ;Save Y Index
        RTS

;Restore Registers
RESREG: LDA TEMP0   ;Load Accumlator
RESRXY: LDX TEMP1   ;Load X Index
        LDY TEMP2   ;Load Y Index
        RTS

;Set Destination Pointer to Source Pointer
SETDSS: JSR GETSRC  ;Get Destination Pointer
        JMP SETDST  ;Store in Source Pointer

;Restore Destination Pointer
RESDST: JSR RESRXY  ;Load Address and Drop into SETDST

;Initialize Destination Pointer
SETDST: STX DSTLO   ;Store Destination Pointer
        STY DSTHI
        RTS

;Restore Source Pointer
RESSRC: JSR RESRXY  ;Load Saved Address
        JMP SETSRC  ;Set Source Pointer

;Set Source Pointer to Destination Pointer
SETSRD: JSR GETDST  ;Get Destination Point and fall into SETSRC

;Initialize Source Pointer and Index
SETSRC: STX SRCLO   ;Store Source Pointer
        STY SRCHI
        LDY #$00    ;Initialize Index Into String
        RTS

;Retrieve Source String Pointer
GETDST: LDX DSTLO
        LDY DSTHI
        RTS

;Retrieve Source String Pointer
GETSRC: LDX SRCLO
        LDY SRCHI
        RTS

;Add Accumulator to Destination Address
ADDDSA: TAX             ;Move Accumulator to Argument LSB
        LDY #0          ;Clear Argument MSB

;Add to Destination Address
;Args: Y,X = MSB,LSB of Integer to Add
;Affects: A,Y,X
ADDDST: LDA #DSTLO      ;Set Index to Destination Pointer
        BNE ADDZPW      ;and Execute ADDZPW

;Add Accumulator to Source Address
ADDSRA: TAX             ;Move Accumulator to Argument LSB
        LDY #0          ;Clear Argument MSB

;Add to Source Address
;Args: Y,X = MSB,LSB of Integer to Add
;Affects: A,Y,X
ADDSRC: LDA #SRCLO       ;Set Index and Drop into ADDZPW

;Add to Zero Page Word
;Args: A = Address of Zero Page Word
;      Y,X = MSB,LSB of Integer to Add
;Affects: A
ADDZPW: STA TEMP3       ;Save Zero Page Address
        TXA             ;Move Argument LSB to Accumulator
        LDX TEMP3       ;Set Index to Zero Page Address
        CLC             ;Clear Carry
        ADC 0,X         ;Add Argument LSB to Target LSB
        STA 0,X         ;and Save Result
        TYA             ;Move Argument MSB to Accumulator
        ADC 1,X         ;Add Argument MSB to Target MSB
        STA 1,X         ;and Save Result
        RTS

