;C02 stack module assembly language subroutines ;Requires external zero page variables ;STKLO, STKHI, DSTLO, DSTHI, SRCLO, SRCHI ;external variables ;STKSLO, STKSHI, STKELO, STKEHI, TEMP0, TEMP1, TEMP2, TEMP3 ;external routines ;MEMCPL, STKADD, STKDRN, STKPSA, STKRSP, STKSRC, STKSSP, STRLEN ;stkstr(n, &m) - Push String onto Stack ;Args: Y,X = Address of Source Array STKSTR: JSR STRLEN ;Get Length of String BEQ STKSTY ;If Length > 0 BMI STKSTY ; and < 128 INY ; Increment Length to TYA ; include null terminator STKSTY: LDY #0 ;Clear Y Index JMP STKPSA ;Push Bytes onto Stack ;stktop(&m) - Copy Top Entry off Stack ;Args: Y,X = Address of Source Array ;Uses: STKSLO, STKSHI = Stack Start Address ;Affects: C,N,Z ;Returns: A,Y = Number of Bytes in Entry ; 0 = Error: Stack Underflow STKTOP: JSR STKPOP ;Pop Top Entry Off Stack BEQ STKSWR ;If Underflow, Return 0 JMP STKRSP ;Else Restore Stack Pointer and Return ;stkdup(&m) - Duplicate Top Entry on Stack ;Uses: STKSLO, STKSHI = Stack Start Address ; STKELO, STKEHI = Stack End Address ;Updates: STKLO, STKHI = Stack Pointer ;Affects: C,N,Z ;Returns: A,Y = Number of Bytes in Entry ; 0 = Error: Stack Overflow or Underflow STKDUP: JSR STKDRP ;Deallocate Top Entry STKDUS: JSR STKSRC ;Set Source Pointer to Stack Pointer JSR STKRSP ;Restore Stack Pointer JMP STKSTY ;Push Top Entry onto Stack ;stkovr(&m) - Duplicate Second Entry on Stack ;Uses: STKSLO, STKSHI = Stack Start Address ; STKELO, STKEHI = Stack End Address ;Updates: STKLO, STKHI = Stack Pointer ;Affects: C,N,Z ;Returns: A,Y = Number of Bytes in Entry ; 0 = Error: Stack Overflow or Underflow STKOVR: JSR STKDRP ;Deallocate Top Entry JSR STKDRN ;Deallocate Second Entry JMP STKDUS ;Restore Pointer and Duplicate ;stkswp() - Swap Top Entry with Entry Below it ;Uses: STKSLO, STKSHI = Stack Start Address ; STKELO, STKEHI = Stack End Address ;Destroys: DSTLO,TEMP0,TEMP0,TEMP1,TEMP2,TEMP3 ;Affects: C,N,Z ;Returns: A,Y = Number of Bytes in Entry ; 0 = Error: Stack Overflow or Underflow STKSWP: JSR STKOVR ;Duplicate Second Entry BEQ STKSWR ;Exit if Error JSR STKDRN ;Deallocate Duplicate STA TEMP3 ;Save Size of Duplicate JSR STKSSP ;Save Pointer to Duplicate JSR STKDRN ;Deallocate Top Entry JSR STKSRC ;Set Source to Top Entry STA DSTLO ;Save Top Entry Size JSR STKDRN ;Deallocate Second Entry LDA DSTLO ;Retrieve Top Entry Size JSR STKSWC ;Copy Top Entry Down JSR RESSRC ;Set Duplicate as Source LDA TEMP3 ;Get Duplicate Length STKSWC: STA TEMP0 ;Save Number of Bytes JSR STKDST ;Set Destination to Stack Pointer LDY #0 ;Clear Index Register JSR MEMCPL ;Copy Bytes and Return STA (DSTLO),Y ;Store Number of Bytes after Entry SEC ;Add Number of Bytes plus 1 JSR STKADC ;to Stack Pointer TYA ;Return Number of Bytes STKSWR: RTS