;*********************************************************************	
; includes
;*********************************************************************	

	.incdir	"F:\git\goldmomo_endlos\assembler_files\ucore\"
	.include "include\ucore_ctrl.i"

;*********************************************************************	
; sd header is placed here
;*********************************************************************	

	.include "boot_level_sdHeader.s"

;*********************************************************************
;* start at address 32 here
;*********************************************************************

start	
	;setup irq vector
	
	movei	r0,irq
	nop
	moveih	r0,>irq
	nop
	setssr	r0,2

	;setup video (720x450)
	
	gpci	r7,2		;next 4 + X
	br	setupVideo
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;clear screen
	
	movei	r2,$00	;destination 
	movei	r3,$00
	moveih	r2,$00
	moveih	r3,$f0	;p(0,0) = f000 0000
	
	gpci	r7,2	;next 4 + X
	br	memset
	movei	r1,$33	; count		delay slot	
	movei	r0,$00	; value		delay slot
	moveih	r1,$9e	; count		delay slot
	nop		;		delay slot
	
	;draw header
	
	gpci	r7,2		;next 4 + X
	br	drawTextFormated
	movei	r0,textHeader	;delay slot
	movei	r1,0		;delay slot
	moveih	r0,>textHeader	;delay slot
	movei	r2,0		;delay slot
	
	;setup audio
	
	gpci	r7,2		;next 4 + X
	br	initAudio
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;draw result
	
	push	r0
	
	gpci	r7,2		;next 4 + X
	br	drawTextFormated
	movei	r0,audioSetupResult	;delay slot
	movei	r1,0			;delay slot
	moveih	r0,>audioSetupResult	;delay slot
	movei	r2,1			;delay slot
	
	rqpop
	nop
	nop
	nop
	
	;setup audio irq
	
	movei	r0,UcIrqMsk
	movei	r1,$4			;enable audio irq
	moveih	r0,>UcIrqMsk
	nop
	st	r0,r1			;
	
	;enable irqs
	
	sei
	
	;
		
end	;push leds off
	
	movei	r0,UcRSwichtWLedG
	movei	r1,$0
	moveih	r0,>UcRSwichtWLedG
	nop
	st	r0,r1	

	br	end
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	

	
;***********************************************************************
;* irq code start
;***********************************************************************
	
irq
	cli
	
	;save all register
	
	push	r0
	push	r1
	push	r2
	push	r3
	push	r4
	push	r5
	push	r6
	push	r7
	
	;clear irq memory
	
	movei	r7,UcIrqMemory
	movei	r0,0	;
	moveih	r7,>UcIrqMemory	
	nop
	st	r7,r0
	
	;irq begin
	
	;push leds on
	
	movei	r0,UcRSwichtWLedG
	movei	r1,$ff
	moveih	r0,>UcRSwichtWLedG
	moveih	r1,$ff
	nop
	st	r0,r1	
	
	;push dac data
	
	movei	r3,0			;sintable offset
	movei	r4,sinTable32
	movei	r6,UcAudioDACBase
	moveih	r4,>sinTable32
	movei	r5,127			;128 push ins
	moveih	r6,>UcAudioDACBase
	
fillDACBuffer	
	
	;get sin value
	
	add	r0,r4,r3	
	nop
	rqldi	r0,0
	nop
	movei	r0,0
	ld	r1
	nop
	
	or	r7,r6,r6
	nop
	
	st	r7,r1	;dac left high = sin
	addi	r7,1
	nop
	
	st	r7,r0	;dac left low = 0
	addi	r7,1
	nop
	
	st	r7,r1	;dac right high = sin
	addi	r7,1
	nop
	
	st	r7,r0	;dac right low = 0
	addi	r7,1
	nop
	
	movei	r1,$1
	nop
	moveih	r1,$1
	nop
	
	st	r7,r1	;dac address/ctrl = $0101	;ctrl = enable audio
	addi	r7,1
	nop
	
	;next sin address & $1f
	
	addi	r3,1
	movei	r0,$1f
	nop
	and	r3,r3,r0

	;
	
	subi	r5,1
	brts	fillDACBuffer
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;restore all used register and go back
	
	rqpop		
	rqpop	
	rqpop	
	pop	r7
	pop	r6
	pop	r5
	
	rqpop		
	rqpop	
	rqpop	
	pop	r4
	pop	r3
	pop	r2
	
	rqpop		
	rqpop	
	rti
	pop	r1	;delay slot
	pop	r0	;delay slot
	nop		;delay slot
	sei		;delay slot

	
sinTable32

;ramp
	; word	-32768
	; word	-30720
	; word	-28672
	; word	-26624
	; word	-24576
	; word	-22528
	; word	-20480
	; word	-18432
	; word	-16384
	; word	-14336
	; word	-12288
	; word	-10240
	; word	-8192
	; word	-6144
	; word	-4096
	; word	-2048
	; word	-1
	; word	2047
	; word	4095
	; word	6143
	; word	8191
	; word	10239
	; word	12287
	; word	14335
	; word	16383
	; word	18431
	; word	20479
	; word	22527
	; word	24575
	; word	26623
	; word	28671
	; word	30719



;sin

	word	0
	word	6392
	word	12539
	word	18204
	word	23170
	word	27245
	word	30273
	word	32138
	word	32767
	word	32138
	word	30274
	word	27246
	word	23172
	word	18207
	word	12542
	word	6395
	word	3
	word	-6389
	word	-12536
	word	-18202
	word	-23167
	word	-27243
	word	-30272
	word	-32137
	word	-32767
	word	-32139
	word	-30275
	word	-27248
	word	-23174
	word	-18209
	word	-12545
	word	-6398

	

		
;*********************************************************************
;* functions
;*********************************************************************

	.include	"components\i2c.s"
	.include	"components\drawText.s"

;******************************
;*
;* initAudio
;*
;* return
;*
;* r0 = 0 (PASS)
;*

initAudio	

	push	r7
	
	movei	r6,audioDefault
	movei	r1,8			;9 address
	moveih	r6,>audioDefault
	
	movei	r2,0			;start address
	
initAudioI2CWriteLoop
	
	rqldi	r6,0
	nop
	nop
	ld	r3		;data
	
	gpci	r7,2		;next 4 + X
	br	i2cWM8731WriteWord
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	cmpeqi	r0,0		;0 = PASS
	brtc	initAudioFail	
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	subi	r1,1
	brts	initAudioI2CWriteLoop
	addi	r6,1		;next lut address	delay slot
	addi	r2,1		;next i2c address	delay slot
	nop			;delay slot
	nop			;delay slot

	movei	r0,0
	
initAudioFail	
	
	rqpop
	nop
	nop
	pop	r7
	nop
	
	jmpi	r7,0
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
;******************************
;*
;* i2cWM8731WriteWord
;*
;* r2 = address
;* r3 = data
;* 
;* return:
;*
;* r0 = result
;*

i2cWM8731WriteWord

	push	r1
	push	r6
	push	r7
	
	;start
	
	gpci	r7,2	;next 4 + X
	br	i2cSendStart
	movei	r6,UcI2CSoftPortBCtrl		;delay slot
	nop					;delay slot
	moveih	r6,>UcI2CSoftPortBCtrl		;I2C ports b	;delay slot
	nop					;delay slot
	
	;write id
	
	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	movei	r1,$34		;WRITE			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	cmpeqi	r0,0
	brtc	i2cSend8WACKFailsWr
	movei	r0,$ff		;delay slot
	nop			;delay slot
	moveih	r0,$01		;delay slot
	nop			;delay slot
	
	;write address
	
	add	r1,r2,r2	;adr*2
	extri	r3,8
	addtqi	r1,r1,0		;+ bit8 of data
	
	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	cmpeqi	r0,0
	brtc	i2cSend8WACKFailsWr
	movei	r0,$ff		;delay slot
	nop			;delay slot
	moveih	r0,$02		;delay slot
	nop			;delay slot
		
	;write data low

	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	or	r1,r3,r3	;WRITE		;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	cmpeqi	r0,0
	brtc	i2cSend8WACKFailsWr
	movei	r0,$ff		;delay slot
	nop			;delay slot
	moveih	r0,$04		;delay slot
	nop			;delay slot
	
	;finished without fail
	
	movei	r0,0		;all fine
	
	;stop
	
i2cSend8WACKFailsWr

	gpci	r7,2	;next 4 + X
	br	i2cSendStop
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	rqpop
	rqpop
	rqpop
	pop	r7
	pop	r6
	pop	r1

	jmpi	r7,0
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot	

;******************************
;*
;* drawChar
;* 
;* r0 	 	value
;* r1		x 	
;* r2		y
;*
;* trash r0

drawChar	

	push	r1
	push	r2
	push	r3
	push	r4
	push	r5
	push	r6
	
	;destination base (sram base 0)
	
	muli	r1,8
	
	movei	r4,$00	;destination 
	movei	r5,$00
	moveih	r4,$00
	moveih	r5,$f0	;p(0,0) = f000 0000
	
	add	r4,r4,r1
	addtqi	r5,r5,0
	
	movei	r1,$00
	nop
	moveih	r1,$2d	;720*16
	nop
	
	mul	r1,r1,r2;*y
	gmulhi	r2
	
	add	r4,r4,r1
	addt	r5,r5,r2
		
	;font source
	
	movei	r2,$68	;source 
	movei	r3,$01
	moveih	r2,$50
	moveih	r3,$e0	;p(0,0) = e001 5068
	
	muli	r0,8		;value * 8
	nop
	add	r2,r2,r0	;source 
	addtqi	r3,r3,0		;

	;

	movei	r0,15		;16 [y]
dcYloop	
	
	movei	r1,7		;8 [x]
dcXloop
	esadr	r3,r2
	erqldi	0
	eld	r6
	nop
	
	extri	r6,15
	brts	dcNoTransp
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	movei	r6,0
	
dcNoTransp	
	
		
	esadr	r5,r4
	est	r6,0
	
	subi	r1,1		;x-
	brts	dcXloop
	addi	r4,1		;delay slot
	addtqi	r5,r5,0		;delay slot
	addi	r2,1		;delay slot
	addtqi	r3,r3,0		;delay slot
	
	;
		
	movei	r1,$c8
	nop
	moveih	r1,$2		;r1 = 720-8
	nop
	
	add	r4,r4,r1	;dest + 720-8
	addtqi	r5,r5,0		;
	
	movei	r1,$e8
	nop
	moveih	r1,$2		;r1 = 752-8
	nop	
	
	subi	r0,1		;y-
	brts	dcYloop
	add	r2,r2,r1	;source + 752-8		delay slot
	addtqi	r3,r3,0		;			delay slot
	nop			;delay slot
	nop			;delay slot
	
	;
	
	rqpop
	rqpop
	rqpop
	pop	r6
	pop	r5
	pop	r4
	
	rqpop
	nop
	nop
	pop	r3
	
	
	rqpop
	rqpop
	jmpi	r7,0
	pop	r2	;delay slot
	pop	r1	;delay slot
	nop		;delay slot
	nop		;delay slot

;******************************
;*
;* r0 	 	value
;* r1		count-1 (8 words))
;* r3:r2	dest
;
memset

clearLoop

	esadr	r3,r2
	est	r0,0
	est	r0,1
	est	r0,2
	est	r0,3
	est	r0,4
	est	r0,5
	est	r0,6
	est	r0,7
	subi	r1,1
	brts	clearLoop
	addi	r2,8	;delay slot
	addtqi	r3,r3,0	;delay slot
	nop		;delay slot
	nop		;delay slot
	
	jmpi	r7,0
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
;******************************
;*
;* setupVideo
;*

setupVideo

	
	movei	r0,videoDefault		;source
	movei	r1,$0f			;dest-1
	moveih	r0,>videoDefault
	moveih	r1,$20			
	movei	r2,26			;27-1
	
setupVideoLoop

	rqldi	r0,0
	addi	r0,1
	addi	r1,1
	ld	r3
	subi	r2,1
	brts	setupVideoLoop
	st	r1,r3	;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
		
	jmpi	r7,0
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot	
	
;*********************************************************************
;* data
;*********************************************************************
	
videoDefault		;AD NAME					NEW				DEFAULT
	
	word	$0001	;10 VIDEO_ON					1				1 (ON)
	word	$0097	;11 HSYNC (D = 11 .. 0)				152-1				152-1
	word	$017f	;12 HSTART (D = 11 .. 0)			384-1				384-1
	word	$017d	;13 HMEMSTART (D = 11 .. 0)			382-1				382-1
	word	$071f	;14 HSTOP (D = 11 .. 0)				1824-1				1824-1
	word	$076f	;15 HTOTAL (D = 11 .. 0)			1904-1				1904-1
	word	$0002	;16 VSYNC (D = 10 .. 0)				3-1				3-1
	word	$001e	;17 VSTART (D = 10 .. 0)			31-1				31-1
	word	$03a2	;18 VSTOP  (D = 10 .. 0)			931-1				931-1
	word	$03a3	;19 VTOTAL  (D = 10 .. 0)			932-1				932-1
	word	$0000	;1a LC ADDER LOW				$0000				$0000
	word	$0080	;1b LC ADDER HIGH				$0080				$0040	
	word	$0000	;1c LC ADDER LATCH				X				X
	word	$0000	;1d LC START (10 .. 0) Pixeloffset		$0000				$0000	
	word	$0000	;1e						X				X
	word	$0000	;1f						X				X
	word	$0008	;20 HLOADSTART 					8				8
	word	$0170	;21 HLOADSTOP					360+8				180+8
	word	$001e	;22 VLOADSTART 					31-1				31-1
	word	$03a2	;23 VLOADSTOP 					931-1				931-1
	word	$0002	;24 VLOADNEXT					2				4
	word	$0000	;25 MEM_STARTADR_store low			$0000				$0000
	word	$f000	;26 MEM_STARTADR_store high			$f000				$f000
	word	$0000	;27 MEM_LINEOFFSET_store low			$0000				$0000
	word	$0000	;28 MEM_LINEOFFSET_store high			$0000				$0000
	word	$0002	;29 MEM_MODE_store 				2				2 (X1R5G5B5X1R5G5B5)
	word	$0000	;2a LATCH MEM_STARTADR/LINEOFFSET/MODE		X				X
	

audioDefault
	
			;             8 7654 3210
	word	$0097	;0 = $0097  = 0 1001 0111
	word	$0097	;1 = $0097  = 0 1001 0111
	word	$0079	;2 = $0079  = 0 0111 1001
	word	$0079	;3 = $0079  = 0 0111 1001
	word	$0010	;4 = $0010  = 0 0001 0000	(DAC to line out)
	word	$0000	;5 = $0100  = 0 0000 0000	(DAC soft Mute off)
	word	$0067	;6 = $0067  = 0 0110 0111 	(DAC Power, Output Power, Device Power on)
	word	$000f	;7 = $000f  = 0 0000 1111 	(format = DSP (11), data bit length = 32, lrp = 0 (first clk,data), slave mode, no swap)
	word	$001e	;8 = $001e  = 0 0001 1110 	(BOSR = 1 SR = 0111 Normal Mode) fs = 96/96KHz clk = 18.432MHz fs = 192 filter = 2
	word    $0001	;9 = $0001  = 0 000000001 	(activate interface)
	
textHeader	

	.string		"I2C Sound push sinus test"
	word	0

audioSetupResult	
	.string		"Result = %x"
	word	0

textReaded
	.space	32