//-------------------------------
// Snakes of Atari Island
//
// Author: Jakub "JKR" Krzak
// Katowice, April 2012
//-------------------------------

.macro PRINT_AT
; :1 - column
; :2 - row
    ldy #:2
    lda _scr_lo,y
    clc
    adc #:1
    sta _arr
    lda _scr_hi,y
    adc #0
    sta _arr+1
    jsr _std_print_adr
.endm

.macro mvza
    mva #0 :1
.endm

.macro mwza
    mwa #0 :1
.endm


.macro setArrAt
; :1 - array name
; :2 - X
; :3 - Y
; :4 - value
   ldy :3
   lda :1_lo,y
   sta _arr
   lda :1_hi,y
   sta _arr+1
   ldy :2
   lda :4
   sta (_arr),y
.endm

.macro getArrAt
; :1 - array name
; :2 - X
; :3 - Y
   ldy :3
   lda :1_lo,y
   sta _arr
   lda :1_hi,y
   sta _arr+1
   ldy :2
   lda (_arr),y
.endm

    
.macro setScrAt
	setArrAt _scr :1 :2 :3
.endm

.macro getScrAt
	getArrAt _scr :1 :2
.endm


.macro setFldW
	setArrAt arrSnakeFldW :1 :2 :3
.endm

.macro getFldW
	getArrAt arrSnakeFldW :1 :2
.endm


.macro setFldB
	setArrAt arrSnakeFldB :1 :2 :3
.endm

.macro getFldB
	getArrAt arrSnakeFldB :1 :2
.endm


.macro getColor
	getArrAt ColorSchemes :1 :2
.endm

    
.macro putArrOnScr
; :1 - X
; :2 - Y
; :3 - width
; :4 - height
; :5 - array name
	mvza __x
	#while .byte __x <= #:3-1
		mvza __y
		#while .byte __y <= #:4-1
			mva __x __a
			adb __a #:1
			mva __y __b
			adb __b #:2
			
			ldy __y
			lda :5_lo,y
			sta _arr
			lda :5_hi,y
			sta _arr+1
			ldy __x
			lda (_arr),y
			sta __c
			setScrAt __a __b __c
			
			inc __y
		#end
		inc __x
	#end
.endm


.macro clearArray
; :1 - X
; :2 - Y
; :3 - width
; :4 - height
; :5 - array name
	mvza __x
	#while .byte __x <= #:3-1
		mvza __y
		#while .byte __y <= #:4-1
			mva __x __a
			adb __a #:1
			mva __y __b
			adb __b #:2
			
			setArrAt :5 __a __b #0
			
			inc __y
		#end
		inc __x
	#end
.endm

.macro clearFldW
	fillMemory arrSnakeFldW arrSnakeFldW_End 0
.endm

.macro clearFldB
	fillMemory arrSnakeFldB arrSnakeFldB_End 0
.endm

.macro IncW
	clc
	lda :1
	adc #1
	sta :1
	lda :1+1
	adc #0
	sta :1+1
.endm

.macro fillMemory
; :1 - targetAddr
; :2 - targetAddrEnd
; :3 - value
	mwa #:1 __a
	#while .word __a <> #:2
		ldy #0
		lda #:3
		sta (__a),y
		IncW __a
	#end
.endm

.macro exchangeMemory
; :1 - Addr1
; :2 - Addr1End
; :3 - Addr2
; :4 - procChange
	mwa #:1 __a
	mwa #:3 __x
	#while .word __a <> #:2
		ldy #0
		lda (__x),y
		pha
		lda (__a),y
		jsr :4
		jcc l1
		ldy #0
		sta (__x),y
l1
		pla
		jsr :4
		jcc l1
		ldy #0
		sta (__a),y
l2
		IncW __a 
		IncW __x 
	#end
.endm

.macro changeMemory
; :1 - Addr1
; :2 - Addr1End
; :3 - procChange
	mwa #:1 __a
	#while .word __a <> #:2
		ldy #0
		lda (__a),y
		jsr :3
		jcc l1
		ldy #0
		sta (__a),y
l1
		IncW __a
	#end
.endm

.macro checkFlag
	lda :1
	and #:2
	clc
	beq l1
	sec
l1
.endm

.macro setFlag
	lda :1
	ora #:2
	sta :1
.endm

.macro clearFlag
	lda :1
	and #(~:2)
	sta :1
.endm

.macro m_GetStickState
; :1 - SnW_Dir / SnB_Dir
; :2 - STICK0 / STICK1
	#if .byte :1 = #cRight
		lda :2 
		ora #8
		sta __a
	#else
	#if .byte :1 = #cUp
		lda :2 
		ora #1
		sta __a
	#else
	#if .byte :1 = #cLeft
		lda :2
		ora #4
		sta __a
	#else
		lda :2
		ora #2
		sta __a
	#end
	#end
	#end
.endm

.macro m_SetDirection 
; :1 - SnB_Dir / SnW_Dir
; :2 - SnB_tmpDir / SnW_tmpDir 
	#if .byte __a = #cRight .or .byte __a = #cLeft 
		#if .byte :1 = #cUp .or .byte :1 = #cDown
			mva __a :2 
		#end
	#else
	#if .byte __a = #cUp .or .byte __a = #cDown
		#if .byte :1 = #cRight .or .byte :1 = #cLeft
			mva __a :2
		#end
	#end
	#end
.endm

