incdir "tests"
include "dsp_base.inc"

test_main:
; Test registers used by LRS and SRS
	LRI $CR, #0x0000
	CALL clear_regs
	CALL store_mem_sr

	; Write with SR, read with LR
	LRI $AR0, #0xA00A
	CALL create_pattern
	CALL store_mem_sr
	CALL send_back
	CALL clear_regs
	CALL read_mem_lr
	CALL send_back

	; Write with SR, read with LRS
	LRI $AR0, #0xB00B
	CALL create_pattern
	CALL store_mem_sr
	CALL send_back
	CALL clear_regs
	CALL read_mem_lrs
	CALL send_back

	; Write with SRS, read with LR
	LRI $AR0, #0xC00C
	CALL create_pattern
	CALL store_mem_srs
	CALL send_back
	CALL clear_regs
	CALL read_mem_lr
	CALL send_back

	; Write with SR, read with LRS
	LRI $AR0, #0xD00D
	CALL create_pattern
	CALL store_mem_srs
	CALL send_back
	CALL clear_regs
	CALL read_mem_lrs
	CALL send_back

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

create_pattern:
	LRI $IX0, #0x0110
	MRR $AX0.L, $AR0
	ADDARN $AR0, $IX0
	MRR $AX1.L, $AR0
	ADDARN $AR0, $IX0
	MRR $AX0.H, $AR0
	ADDARN $AR0, $IX0
	MRR $AX1.H, $AR0
	ADDARN $AR0, $IX0
	MRR $AC0.L, $AR0
	ADDARN $AR0, $IX0
	MRR $AC1.L, $AR0
	ADDARN $AR0, $IX0
	MRR $AC0.M, $AR0
	ADDARN $AR0, $IX0
	MRR $AC1.M, $AR0
	ADDARN $AR0, $IX0
	; AC0.H and AC1.H have odd results since they're 8-bit sign-extended, but that's fine.
	MRR $AC0.H, $AR0
	ADDARN $AR0, $IX0
	MRR $AC1.H, $AR0
	RET

clear_regs:
	LRI $AX0.L, #0x0000
	LRI $AX1.L, #0x0000
	LRI $AX0.H, #0x0000
	LRI $AX1.H, #0x0000
	LRI $AC0.L, #0x0000
	LRI $AC1.L, #0x0000
	LRI $AC0.M, #0x0000
	LRI $AC1.M, #0x0000
	LRI $AC0.H, #0x0000
	LRI $AC1.H, #0x0000
	RET

read_mem_lr:
	LR $AX0.L, @0x0000
	LR $AX1.L, @0x0001
	LR $AX0.H, @0x0002
	LR $AX1.H, @0x0003
	LR $AC0.L, @0x0004
	LR $AC1.L, @0x0005
	LR $AC0.M, @0x0006
	LR $AC1.M, @0x0007
	RET

read_mem_lrs:
	LRS $AX0.L, @0x00
	LRS $AX1.L, @0x01
	LRS $AX0.H, @0x02
	LRS $AX1.H, @0x03
	LRS $AC0.L, @0x04
	LRS $AC1.L, @0x05
	LRS $AC0.M, @0x06
	LRS $AC1.M, @0x07
	RET

store_mem_sr:
	SR @0x0000, $AX0.L
	SR @0x0001, $AX1.L
	SR @0x0002, $AX0.H
	SR @0x0003, $AX1.H
	SR @0x0004, $AC0.L
	SR @0x0005, $AC1.L
	SR @0x0006, $AC0.M
	SR @0x0007, $AC1.M
	RET

store_mem_srs:
	; For future compatibility these have been changed to cw.
	; The way the instructions were originally encoded is commented,
	; but this does not match their behavior.
	cw 0x2800 ; SRS @0x00, $AX0.L - actually SRSH @0x00, $AC0.H
	cw 0x2901 ; SRS @0x01, $AX1.L - actually SRSH @0x01, $AC1.H
	cw 0x2A02 ; SRS @0x02, $AX0.H - actually unknown, no store performed
	cw 0x2B03 ; SRS @0x03, $AX1.H - actually unknown, no store performed
	cw 0x2C04 ; SRS @0x04, $AC0.L
	cw 0x2D05 ; SRS @0x05, $AC1.L
	cw 0x2E06 ; SRS @0x06, $AC0.M
	cw 0x2F07 ; SRS @0x07, $AC1.M
	RET