;*********************************************************************	
; 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 video (720x450)
	
	gpci	r7,2		;next 4 + X
	br	setupVideo
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot q
	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,10		;delay slot
	moveih	r0,>textHeader	;delay slot
	movei	r2,0		;delay slot
	
	;
	
	nop
	
	;write eeprom
	
	movei	r2,0		;adr
	movei	r3,255		;cnt

wloop	

	push	r2
	push	r3
	
	gpci	r7,2		;next 4 + X
	br	i2cEEPROMWriteByte
	addqi	r3,r2,7	;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot

	cmpeqi	r0,0
	brts	writeOk
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	push	r2		;push adr
	push	r0		;result
	
	
	gpci	r7,2			;next 4 + X
	br	drawTextFormated
	movei	r0,textWriteFail	;text	delay slot	
	movei	r1,0		;x      delay slot
	moveih	r0,>textWriteFail	;       delay slot
	movei	r2,1		;y
	
	
	;game over
	.stop

writeOk	
	
	rqpop
	rqpop
	nop
	pop	r3
	pop	r2
	
	subi	r3,1
	brts	wloop
	addi	r2,1		;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;read back
	
	movei	r2,0		;adr
	movei	r3,15		;cnt
loop	
	push	r2
	push	r3

	
	nop
	gpci	r7,2		;next 4 + X
	br	i2cEEPROMReadByte
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;print rsult
	
	push	r0
	
	gpci	r7,2	;next 4 + X
	br	drawTextFormated
	movei	r0,textResult	;text	delay slot	
	movei	r1,0		;x      delay slot
	moveih	r0,>textResult	;       delay slot
	nop	;movei	r2,1		;y
	
	rqpop
	rqpop
	rqpop
	pop	r0
	pop	r3
	pop	r2
	
	nop
	addi	r2,1
	
	subi	r3,1
	brts	loop
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
		
end	br	end
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	
textReaded

	.space	32
		
;*********************************************************************
;* functions
;*********************************************************************

;******************************
;*
;* i2cSend8WACK
;*
;* r1 = data
;* r6 =  UcI2CSoftPortA/BCtrl
;* 
;* return:
;*
;* r0 = 0 (OK) else other
;*

i2cSend8WACK

	

	push	r1
	push	r7
	push	r5

	;76543210
	;      

	; clk down
	
	movei	r5,7	;8 times

i2cSend8WACKPushLoop	

	;DIR OUT, CLK 0,  set data
	
	movei	r0,$4	
	extri	r1,7
	addtqi	r0,r0,0	;set r0 bit 0 = 1 if bit 7 in r1 = 1
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r0,$7		;delay slot
	nop			;delay slot
	st	r6,r0		;PUSH	;delay slot
	nop			;delay slot
	
	;DIR OUT, CLK = 1 hold data
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	addi	r0,2		;delay slot
	nop			;delay slot
	st	r6,r0		;PUSH	;delay slot
	nop		

	;delay slot
	
	subi	r5,1
	brts	i2cSend8WACKPushLoop
	add	r1,r1,r1	;next bit	delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;bits send so wait for ack
	
	;DIR IN, CLK 0
	
	movei	r0,$0	;DIR IN, CLK 0
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r0,$07	;EN A		delay slot
	nop		;delay slot
	st	r6,r0	;PUSH		delay slot
	nop		;delay slot
	
	;DIR IN, CLK 1
	
	movei	r0,$2	;DIR IN, CLK 1

	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r0,$07		;EN A			;delay slot
	nop			;delay slot
	st	r6,r0		;PUSH			;delay slot
	nop			;delay slot
	
	;get result
	
	rqldi	r6,0
	nop
	movei	r1,$8
	ld	r0		
	nop
	and	r0,r0,r1	;r0 = 0 OK, else fail
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;DIR OUT, CLK 0, DATA 0
	
	movei	r1,$4	;DIR OUT, CLK 0, DATA 0
	nop
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r1,$07		;EN A			;delay slot
	nop			;delay slot
	st	r6,r1		;PUSH			;delay slot
	nop			;delay slot
	
	rqpop
	rqpop	
	rqpop
	pop	r5
	pop	r7
	pop	r1
	
	jmpi	r7,0
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
;******************************
;*
;* i2cRecive8
;*
;* r6 =  UcI2CSoftPortA/BCtrl
;* 
;* return:
;*
;* r0 = data
;* r1 = status (if ack used)
;*

i2cRecive8

	push	r5
	push	r7
	
	movei	r0,0

	;76543210
	;      

	; clk down
	
	movei	r5,7	;8 times

i2cRecive8PushLoop	
	
	;DIR IN, CLK 0
	
	movei	r1,$0	
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r1,$7		;delay slot
	nop			;delay slot
	st	r6,r1		;PUSH			;delay slot
	nop			;delay slot
	
	;DIR IN, CLK 1
	
	gpci	r7,2		;next 4 + X
	br	i2cWaitHalfPeriode
	addi	r1,2		;CLK = 1		;delay slot
	nop			;delay slot
	st	r6,r1		;PUSH			;delay slot
	nop			;delay slot
	
	;read bit
	
	rqldi	r6,0
	nop	
	movei	r7,$1
	ld	r1
	add	r0,r0,r0	;r0 * 2
	lsri	r1,3
	
	subi	r5,1
	brts	i2cRecive8PushLoop
	and	r1,r1,r7	;delay slot
	nop			;delay slot
	or	r0,r0,r1	;delay slot
	add	r1,r1,r1	;next bit		;delay slot
	
	;bits readed so wait for ack
	
	nop
	
	;DIR IN, CLK 0
	
	movei	r1,$0	;DIR IN, CLK 0
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r1,$07	;EN A		delay slot
	nop		;delay slot
	st	r6,r1	;PUSH		delay slot
	nop		;delay slot
	
	;DIR IN, CLK 1
	
	movei	r1,$2	;DIR IN, CLK 1

	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r1,$07		;EN A			;delay slot
	nop			;delay slot
	st	r6,r1		;PUSH			;delay slot
	nop			;delay slot
	
	;get result
	
	rqldi	r6,0
	nop
	movei	r5,$8
	ld	r1		
	nop
	and	r1,r1,r5	;r0 = 0 OK, else fail
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;DIR IN, CLK 0
	
	movei	r1,$0	;DIR IN, CLK 0
	nop
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r1,$07		;EN A			;delay slot
	nop			;delay slot
	st	r6,r1		;PUSH			;delay slot
	nop			;delay slot
	
	rqpop
	rqpop	
	nop
	pop	r7
	pop	r5
	
	jmpi	r7,0
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot	
	
;******************************
;*
;* i2cSendStart
;*
;* r6 =  UcI2CSoftPortA/BCtrl
;
i2cSendStart
	push	r0
	push	r7
	
	movei	r0,$7	;DIR OUT, CLK 1, DATA 1
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r0,$07		;EN A			;delay slot
	nop			;delay slot
	st	r6,r0		;PUSH			;delay slot
	nop			;delay slot
	
	movei	r0,$6	;DIR OUT, CLK 1, DATA 0

	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r0,$07		;EN A			;delay slot
	nop			;delay slot
	st	r6,r0		;PUSH			;delay slot
	nop			;delay slot
	
	rqpop
	rqpop
	nop
	pop	r7
	pop	r0
	
	jmpi	r7,0
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop	
	
;******************************
;*
;* i2cSendStop
;*
;* r6 =  UcI2CSoftPortA/BCtrl
;
i2cSendStop
	push	r0
	push	r7
	
	movei	r0,$6	;DIR OUT, CLK 1, DATA 0

	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r0,$07		;EN A			;delay slot
	nop			;delay slot
	st	r6,r0		;PUSH			;delay slot
	nop			;delay slot
	
	movei	r0,$7	;DIR OUT, CLK 1, DATA 1
	
	gpci	r7,2	;next 4 + X
	br	i2cWaitHalfPeriode
	moveih	r0,$07		;EN A			;delay slot
	nop			;delay slot
	st	r6,r0		;PUSH			;delay slot
	nop			;delay slot
	
	rqpop
	rqpop
	nop
	pop	r7
	pop	r0
	
	jmpi	r7,0
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop		

;******************************
;*
;* i2cEEPROMReadByte
;*
;* r2 = address
;* 
;* return:
;*
;* r0 = data
;*

i2cEEPROMReadByte

	push	r1
	push	r6
	push	r7

i2cEEPROMReadByteStart
	
	;start
	
	gpci	r7,2	;next 4 + X
	br	i2cSendStart
	movei	r6,UcI2CSoftPortACtrl		;delay slot
	nop					;delay slot
	moveih	r6,>UcI2CSoftPortACtrl		;I2C ports	;delay slot
	nop					;delay slot
	
	;write id
	
	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	movei	r1,$A0		;WRITE			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	
	cmpeqi	r0,0		;if no ack retry because eeprom is busy
	brtc	i2cEEPROMReadByteStart
	nop
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;write address high
	
	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	or	r1,r2,r2	;delay slot
	nop			;delay slot
	lsri	r1,8		;delay slot
	nop			;delay slot
	
	
	cmpeqi	r0,0
	brtc	i2cSend8WACKFails
	movei	r0,$ff		;delay slot
	nop			;delay slot
	moveih	r0,$02		;delay slot
	nop			;delay slot
	
	;write address low
	
	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	or	r1,r2,r2	;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	cmpeqi	r0,0
	brtc	i2cSend8WACKFails
	movei	r0,$ff		;delay slot
	nop			;delay slot
	moveih	r0,$03		;delay slot
	nop			;delay slot
		
	;start
	
	gpci	r7,2	;next 4 + X
	br	i2cSendStart
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;write id

	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	movei	r1,$A1		;READ		;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	cmpeqi	r0,0
	brtc	i2cSend8WACKFails
	movei	r0,$ff		;delay slot
	nop			;delay slot
	moveih	r0,$04		;delay slot
	nop			;delay slot
	
	;capture data
		
	gpci	r7,2	;next 4 + X
	br	i2cRecive8
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	;stop
	
i2cSend8WACKFails

	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
	
	
;******************************
;*
;* i2cEEPROMWriteByte
;*
;* r3 = data
;* r2 = address
;* 
;* return:
;*
;* r0 = result
;*

i2cEEPROMWriteByte

	push	r1
	push	r6
	push	r7
	
	
i2cEEPROMWriteByteStart
	;start
	
	gpci	r7,2	;next 4 + X
	br	i2cSendStart
	movei	r6,UcI2CSoftPortACtrl		;delay slot
	nop					;delay slot
	moveih	r6,>UcI2CSoftPortACtrl		;I2C ports	;delay slot
	nop					;delay slot
	
	;write id
	
	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	movei	r1,$A0		;WRITE			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	cmpeqi	r0,0		;if no ack retry because eeprom is busy
	brtc	i2cEEPROMWriteByteStart
	nop
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	
	;write address high
		
	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	or	r1,r2,r2	;delay slot
	nop			;delay slot
	lsri	r1,8		;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 address low
	
	gpci	r7,2	;next 4 + X
	br	i2cSend8WACK
	or	r1,r2,r2	;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,$03		;delay slot
	nop			;delay slot
		
	;write data
	
	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
	
	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	

;******************************
;*
;* i2cWaitHalfPeriode
;*	
	
i2cWaitHalfPeriode

	push	r0

	;min 134 cycles to waste
	
	movei	r0,20		;21 * 6 = 126 (+9 cycles) => 135
	nop
	
i2cWaitHalfPeriodeLoop	
	subi	r0,1
	brts	i2cWaitHalfPeriodeLoop
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	nop			;delay slot
	
	rqpop
	jmpi	r7,0
	nop			;delay slot
	pop	r0		;delay slot
	nop			;delay slot
	nop			;delay slot	
		
		
;******************************
;*
;* drawText
;*
;* r0		text
;* r1 	 	cursor x
;* r2		cursor y

drawTextFormated

	push	r0
	push	r1
	push	r4
	push	r6
	push	r7
	
	getsp	r6,5

	or	r4,r0,r0	;text address to r4
	nop
	
textLoop

	rqldi	r4,0
	nop
	nop
	ld	r0
	nop
	cmpeqi	r0,0
	brts	textLoopEnd
	addi	r4,1	;next char 	delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	cmpeqi	r0,37	;%
	brts	textProcessCmd
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	gpci	r7,2	;next 4 + X
	br	drawChar
	subi	r0,32	;map visible	delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	addi	r1,1
textProcessCmdReturn
	
	br	textLoop
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	
textLoopEnd	
	
	
	rqpop
	rqpop
	rqpop
	pop	r7
	pop	r6
	pop	r4
	
	rqpop
	rqpop
	jmpi	r7,0
	pop	r1	;delay slot
	pop	r0	;delay slot
	nop		;delay slot
	nop		;delay slot
	
;processing cmd string	
	
textProcessCmd

	rqldi	r4,0	;get next char
	nop
	nop
	ld	r0	
	nop
	
	cmpeqi	r0,37	;% again so print it
	brts	textProcessCmdProzent
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	cmpeqi	r0,99	;c -> char
	brts	textProcessCmdChar
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	cmpeqi	r0,120	;x -> hex
	brts	textProcessCmdHex
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	cmpeqi	r0,117	;u -> unsigned dec
	brts	textProcessCmdUDec
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	

	br	textProcessCmdReturn
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
;%%	
	
textProcessCmdProzent
	
	gpci	r7,2	;next 4 + X
	br	drawChar
	subi	r0,32	;map visible	delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	addi	r1,1
	
	br	textProcessCmdReturn
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
;%c	
	
textProcessCmdChar
	
	rqldi	r6,0
	addi	r6,1	;next value if exist
	nop
	ld	r0	
	
	gpci	r7,2	;next 4 + X
	br	drawChar
	subi	r0,32	;map visible	delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	addi	r4,1
	addi	r1,1
	
	br	textProcessCmdReturn
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot	
	
;%x	
	
textProcessCmdHex	
	
	push	r5
	push	r3
	
	rqldi	r6,0
	addi	r6,1	;next value if exist
	nop
	ld	r5
	
	movei	r3,3	;3 hex digits

textProcessCmdHexLoop	
	
	or	r0,r5,r5
	nop
	lsri	r0,12
	nop
	
	cmploi	r0,10
	brts	textProcessCmdHexNoABCDEF
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	addi	r0,7
	
textProcessCmdHexNoABCDEF	
	
	gpci	r7,2	;next 4 + X
	br	drawChar
	addi	r0,16	;map visible +48-32	delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
				
	subi	r3,1	
	brts	textProcessCmdHexLoop
	addi	r1,1	;x++		delay slot
	muli	r5,16	;r5 << 4	delay slot
	nop		;delay slot
	nop		;delay slot
	
	rqpop
	rqpop
	br	textProcessCmdReturn
	pop	r3	;delay slot
	pop	r5	;delay slot		
	addi	r4,1	;next input char	delay slot
	nop		;delay slot
	
;%u	
	
textProcessCmdUDec

	push	r5
	push	r4
	push	r3
	push	r7
	
	
	rqldi	r6,0
	addi	r6,1	;next value if exist
	movei	r4,$cd
	ld	r5
	moveih	r4,$cc	;r4 = $cccd
	
		
	movei	r7,4		;5 dec digits	
	
textProcessCmdUDecDecodeDigit
	
	or	r3,r5,r5
	mul	r5,r5,r4	;result = value * $cccd
	nop
	gmulhi	r5		;result >> 16
	nop
	lsrqi	r5,r5,3		;result >> 3
	nop
	or	r0,r5,r5
	nop
	muli	r0,10
	
		
	subi	r7,1
	brts	textProcessCmdUDecDecodeDigit
	nop			;delay slot
	sub	r0,r3,r0	;delay slot
	nop			;delay slot
	push	r0		;push digit ;delay slot
	
	;
	
	movei	r3,3		;4 dec digits with leading zero test	
	movei	r4,0		;leading zero
	
textProcessCmdUDecPrintDigit	
	
	rqpop	
	nop
	nop
	pop	r0
	nop
	cmpeq	r4,r0
	brts	textProcessCmdUDecSkipLeadingZero	;skip leading zero
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	movei	r4,$ff	;illegal value after first not leading zero
	
	
	gpci	r7,2	;next 4 + X
	br	drawChar
	addi	r0,16	;map visible +48-32	delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	
	addi	r1,1
	
textProcessCmdUDecSkipLeadingZero
	
	subi	r3,1
	brts	textProcessCmdUDecPrintDigit
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot

	;last digit
	
	rqpop	
	nop
	nop
	pop	r0
	gpci	r7,2	;next 4 + X
	br	drawChar
	addi	r0,16	;map visible +48-32	delay slot
	nop		;delay slot
	nop		;delay slot
	nop		;delay slot
	addi	r1,1
	
	rqpop
	nop
	nop
	pop	r7
	
	rqpop
	rqpop
	rqpop
	pop	r3
	pop	r4	
	pop	r5	
	
	br	textProcessCmdReturn
	nop		;delay slot
	nop		;delay slot	
	addi	r4,1	;next input char	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,UcTimer2Ctrl		;dest-1
	moveih	r0,>videoDefault
	moveih	r1,>UcTimer2Ctrl			
	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
	
textHeader	

	.string		"I2C EEPROM read/write test"
	word	0

textResult	
	.string		"Result = $%x"
	word	0
	
textWriteFail	
	.string		"WriteFail $%x at adr $%x"
	word	0	
	