.define And

! This subroutine performs the logical and on two groups of
! atmost 254 bytes. The number of bytes is in register Y.
! The two groups are on the stack.
! First the value of the stackpointer is saved in zeropage
! locations ADDR, ADDR+1. Then an offset of Y is added
! and stored in ADDR+2, ADDR+3.
! The result is pushed back on the stack.


And:
	lda SP+1
	sta ADDR+1	! address of first group (lowbyte)
	lda SP+2
	sta ADDR	! address of first group (highbyte)
	clc
	tya
	adc SP+2
	sta SP+2	! new stackpointer (lowbyte)
	sta ADDR+2	! stackpointer + Y (lowbyte)
	lda #0
	adc SP+1
	sta SP+1	! new stackpointer (highbyte)
	sta ADDR+3	! stackpointer + Y (highbyte)
    1:  dey
	lda (ADDR),y	! get byte first group
	and (ADDR+2),y	! perform logical and with second group
	sta (ADDR+2),y	! push result on real_stack
	tya
	bne 1b		! do it n times
	rts