; This test checks the effect of the index looping registers (R8-R11)
incdir  "tests"
include "dsp_base.inc"

; First theories, fitting tests with nice masks in the loop registers
; IR THEORY: if ((ar & lp) == lp)  ar &= ~lp;
; DR THEORY: if ((ar & lp) == 0) ar |= lp;
; These were proven FALSE though by the following:

; Tests done using AR1 = 0x0010, IX1 = 0
; WR1 = 0
;   10, 11, 11, 11, 11......
; WR1 = 1
;   10, 11, 10, 11, 10......
; WR1 = 2
;   10, 11, 12, 13, 11, 12, 13, 11, 12, 13 ......
; WR1 = 3
;   10, 11, 12, 13, 10, 11, 12, 13, 10, 11, 12, 13.......
; WR1 = 4
;   10, 11, 12, 13, 14, 15, 16, 17, 13, 14, 15, 16, 17, 13, 14, 15 ......
; WR1 = 5
;   10, 11, 12, 13, 14, 15, 16, 17, 12, 13, 14, 15 ...
; WR1 = 6
;   10, 11, 12, 13, 14, 15, 16, 17, 11, 12, 13, 14...
; WR1 = 7
;   10, 11, 12, 13, 14, 15, 16, 17, 10, 11, ....
; WR1 = 8
;   10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1a, 1b, 1c, 1d, 1e, 1f, 17, 18, 19, 1a, 1b.....


; I really don't know how the above could possibly be efficiently implemented in hardware.
; And thus it's tricky to implement in software too :p
test_main:
; test using indexing register 1 - 0 is used in send_back
lri $AR1, #16
lri $IX1, #32
lri $WR1, #0

call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1

lri $AR1, #16
lri $WR1, #1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1

lri $AR1, #16
lri $WR1, #2
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1

lri $AR1, #16
lri $WR1, #3

call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1

lri $AR1, #16
lri $WR1, #4

call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1

lri $AR1, #16
lri $WR1, #5

call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1

lri $AR1, #16
lri $WR1, #6

call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1

lri $AR1, #16
lri $WR1, #7

call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1

lri $AR1, #16
lri $WR1, #8

call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1
nx'ir  : $AR1
call send_back  ; 1


lri $WR1, #0xFFFF

; We're done, DO NOT DELETE THIS LINE
jmp end_of_test
