.define Exg
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text

! This subroutine exchanges two groups of bytes on the top of the
! stack. The groups may consist of atmost 255 bytes.
! This number is in register Y.
! The exchange is from ADDR, ADDR+1 to ADDR+2, ADDR+3


Exg:
	lda SP+1
	ldx SP+2
	stx ADDR	! address of first group (lowbyte)
	sta ADDR+1	! address of first group (highbyte)
	sty Ytmp	! save number of bytes to be exchanged
	clc
	lda SP+2
	adc Ytmp
	sta ADDR+2	! address of second group (lowbyte)
	lda SP+1
	adc #0
	sta ADDR+3	! address of second group (highbyte)
    1:	dey
    	lda (ADDR),y	! get byte from first group
	pha		! temporary save
	lda (ADDR+2),y	! get byte from second group
	sta (ADDR),y	! store in first group
	pla		! get temporary saved byte
	sta (ADDR+2),y	! store in second group
	tya
	bne 1b		! perform n times
	rts


