;*** Krmiljenje HMC702 - S53MV 04.09.2013 ***

;*** Vhodno/izhodni prikljucki LPC2138/2148 @60MHz (kristal=12MHz) ***
;P0.0-7 - digitalni izhodi za LCD HD44780 D0-7
;P0.8-9 - UART1 (neuporabljeno)
;P0.10-13 - digitalni izhodi (neuporabljeno)
;P0.14 - digitalni vhod /bootloader, pullup na +3.3V 
;P0.15-16 - digitalni izhodi (neuporabljeno)

;P0.17 - digitalni izhod SCK za HMC702
;P0.18 - digitalni vhod MISO za HMC702
;P0.17 - digitalni izhod MOSI za HMC702
;P0.20 - digitalni izhod SSEL za HMC702

;P0.21-23 - digitalni izhodi (neuporabljeno)
;P0.25 - analogni izhod AOUT
;P0.26-27 - USB? (neuporabljeno)
;P0.28 - digitalni izhod (neuporabljeno)
;P0.29 - digitalni izhod za LCD HD44780 RS
;P0.30 - digitalni izhod za LCD HD44780 E
;P0.31 - digitalni izhod (neuporabljeno)
;P1.16 - digitalni vhod - tipka DESNO
;P1.17 - digitalni vhod - tipka DOL
;P1.18 - digitalni vhod - tipka GOR
;P1.19 - digitalni vhod - tipka LEVO
;P1.20-25 - digitalni vhodi (neuporabljeno)
;P1.26 - JTAG vhod/izhod RTCK
;P1.27 - JTAG izhod TDO
;P1.28 - JTAG vhod TDI
;P1.29 - JTAG vhod TCK
;P1.30 - JTAG vhod TMS
;P1.31 - JTAG vhod TRST

;*** Ukazi za delovanje zbirnika ARM ***
        AREA	RESET, CODE, READONLY, ALIGN=9
	ENTRY
	CODE32

;*** Konstante programa ***
ZMIGA	EQU	0x40		;perioda utripanja (mora biti 2^N)

;*** Dodelitev pomnilnika RAM ***
SKLAD	EQU	0x40000480	;glavni sklad (navzdol ???)

ZASLON	EQU	0x40000500	;vsebina zaslona (32 bajtov)

ZNACKA	EQU	0x40000580	;znacka na zaslonu
UTRIP	EQU	0x40000584	;stevec utripanja

;*** Tabela izjem na zacetnem naslovu 0 ***
IZJEME	B	ZACNI
	B	IZJEME	;Undef
	B	IZJEME	;SWI
	B	IZJEME	;PAbt
	B	IZJEME	;DAbt
	NOP		;Reserved Vector
	B	IZJEME	;IRQ
	B	IZJEME	;FIQ
	ALIGN	512		;izbrisi naslov 0x00001FC

;*** Inicializiraj MAM v LPC2138/2148 *** (R0-1)
MAM	LDR	R0,=0xE01FC000	;MAMCR=0
	MOV	R1,#0
	STRB	R1,[R0]
	LDR	R0,=0xE01FC004	;MAMTIM=3
	MOV	R1,#3
	STRB	R1,[R0]
	LDR	R0,=0xE01FC000	;MAMCR=2
	MOV	R1,#2
	STRB	R1,[R0]
	BX	LR
	LTORG

;*** Inicializiraj PLL0 v LPC2138/2148 *** (R0-2)
PLL0	LDR	R0,=0xE01FC084	;PLL0CFG=0x24 P=2,M=5
	MOV	R1,#0x24
	STRB	R1,[R0]
	LDR	R0,=0xE01FC080	;PLL0CON=0x01 PLL-enable
	MOV	R1,#0x01
	STRB	R1,[R0]
	LDR	R0,=0xE01FC08C	;PLL0FEED
	MOV	R1,#0xAA
	MOV	R2,#0x55
	STRB	R1,[R0]
	STRB	R2,[R0]
PLL01	LDR	R0,=0xE01FC088	;PLL0STAT cakanje uklenitve
	LDR	R1,[R0]
	ANDS	R1,R1,#0x400
	BEQ	PLL01
	LDR	R0,=0xE01FC080	;PLL0CON=0x03 PLL-enable&connect
	MOV	R1,#0x03
	STRB	R1,[R0]
	LDR	R0,=0xE01FC08C	;PLL0FEED
	MOV	R1,#0xAA
	MOV	R2,#0x55
	STRB	R1,[R0]
	STRB	R2,[R0]
	BX	LR
	LTORG

;*** Inicializiraj GPIO v LPC2138/2148 *** (R0-1)
GPIO	LDR	R0,=0xE002C000	;PINSEL0 P0.8-9=TXD-RXD(UART1)
	LDR	R1,=0x00050000
	STR	R1,[R0]
	LDR	R0,=0xE002C004	;PINSEL1 P0.25=Aout(DAC)
	LDR	R1,=0x00080000
	STR	R1,[R0]
	LDR	R0,=0xE01FC1A0	;SCS=0x03 high-speed GPIO 0&1
	MOV	R1,#0x03
	STR	R1,[R0]
	LDR	R0,=0x3FFFC000	;FIO0DIR izhodi 0.0-0.13 0.15-0.17 0.19-0.31
	LDR	R1,=0xFFFBBFFF
	STR	R1,[R0]
	BX	LR
	LTORG

;*** Inicializacija HD44780 *** (R0-3)
INILCD	STR	LR,[SP,#-4]!	;resi link
	BL	T4MS
	MOV	R0,#0x38	;function set 
	BL	UKAZ
	BL	T4MS
	MOV	R0,#0x38	;function set
	BL	UKAZ
	MOV	R0,#0x38	;function set
	BL	UKAZ
	MOV	R0,#0x08	;display off
	BL	UKAZ
	MOV	R0,#0x01	;display clear
	BL	UKAZ
	BL	T4MS
	MOV	R0,#0x06	;entry mode set
	BL	UKAZ
	MOV	R0,#0x0C	;display on
	BL	UKAZ
	MOV	R0,#0x40	;set CGRAM address
	BL	UKAZ
	MOV	R0,#0x15	;znak 0 - sahovnica za kurzor
	BL	ZNAK
	MOV	R0,#0x0A
	BL	ZNAK
	MOV	R0,#0x15
	BL	ZNAK
	MOV	R0,#0x0A
	BL	ZNAK
	MOV	R0,#0x15
	BL	ZNAK
	MOV	R0,#0x0A
	BL	ZNAK
	MOV	R0,#0x15
	BL	ZNAK
	MOV	R0,#0x00
	BL	ZNAK
	LDR	PC,[SP],#4	;povratek na link

;*** Znak iz R0 v HD44780 *** (R0-1)
ZNAK	STR	LR,[SP,#-4]!	;resi link
	LDR	R1,=0x3FFFC014	;FIO0PIN3 podatek in RS=1
	STRB	R0,[R1]
	LDR	R1,=0x3FFFC017	;FIO0PIN3
	MOV	R0,#0x20
	STRB	R0,[R1]
	BL	T1US
	MOV	R0,#0x60	;vklopi E
	STRB	R0,[R1]
	BL	T1US
	MOV	R0,#0x20	;izkolpi E
	STRB	R0,[R1]
	BL	T100US
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Ukaz iz R0 v HD44780 *** (R0-1)
UKAZ	STR	LR,[SP,#-4]!	;resi link
	LDR	R1,=0x3FFFC014	;FIO0PIN0 podatek in RS=0
	STRB	R0,[R1]
	LDR	R1,=0x3FFFC017	;FIO0PIN3
	MOV	R0,#0x00
	STRB	R0,[R1]
	BL	T1US
	MOV	R0,#0x40	;vklopi E
	STRB	R0,[R1]
	BL	T1US
	MOV	R0,#0x00	;izkolpi E
	STRB	R0,[R1]
	BL	T100US
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Zakasnitev 1us *** (R0)
T1US	MOV	R0,#15
T1US1	SUBS	R0,R0,#1
	BPL	T1US1
	BX	LR

;*** Zakasnitev 100us *** (R0-1)
T100US	STR	LR,[SP,#-4]!	;resi link
	MOV	R1,#100
T100US1	BL	T1US
	SUBS	R1,R1,#1
	BPL	T100US1
	LDR	PC,[SP],#4	;povratek na link

;*** Zakasnitev 4ms *** (R0-2)
T4MS	STR	LR,[SP,#-4]!	;resi link
	MOV	R2,#40
T4MS1	BL	T100US
	SUBS	R2,R2,#1
	BPL	T4MS1
	LDR	PC,[SP],#4	;povratek na link

;*** Zakasnitev 1s *** (R0-3)
T1S	STR	LR,[SP,#-4]!	;resi link
	MOV	R3,#250
T1S1	BL	T4MS
	SUBS	R3,R3,#1
	BPL	T1S1
	LDR	PC,[SP],#4	;povratek na link

;*** Izpisi inacico programa *** (R0-3)
INACICA	STR	LR,[SP,#-4]!	;resi link
	MOV	R0,#0x80	;set DDRAM address - zacetek prve vrstice
	BL	UKAZ
	MOV	R0,#"P"		;PLL HMC702
	BL	ZNAK
	MOV	R0,#"L"
	BL	ZNAK
	MOV	R0,#"L"
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#"H"
	BL	ZNAK
	MOV	R0,#"M"
	BL	ZNAK
	MOV	R0,#"C"
	BL	ZNAK
	MOV	R0,#"7"
	BL	ZNAK
	MOV	R0,#"0"
	BL	ZNAK
	MOV	R0,#"2"
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#0xC0	;set DDRAM address - zacetek druge vrstice
	BL	UKAZ
	MOV	R0,#0x53	;"S" - S53MV
	BL	ZNAK
	MOV	R0,#0x35	;"5"
	BL	ZNAK
	MOV	R0,#0x33	;"3"
	BL	ZNAK
	MOV	R0,#0x4D	;"M"
	BL	ZNAK
	MOV	R0,#0x56	;"V"
	BL	ZNAK
	MOV	R0,#0x20	;" "
	BL	ZNAK
	MOV	R0,#"0"		;04.09.2013
	BL	ZNAK
	MOV	R0,#"4"
	BL	ZNAK
	MOV	R0,#"."
	BL	ZNAK
	MOV	R0,#"0"
	BL	ZNAK
	MOV	R0,#"9"
	BL	ZNAK
	MOV	R0,#"."
	BL	ZNAK
	MOV	R0,#"2"
	BL	ZNAK
	MOV	R0,#"0"
	BL	ZNAK
	MOV	R0,#"1"
	BL	ZNAK
	MOV	R0,#"3"
	BL	ZNAK
	LDR	PC,[SP],#4	;povratek na link

;*** Izpisi vsebino pomnilnika 2x16 znakov *** (R0-4)
IZPIS	STR	LR,[SP,#-4]!	;resi link
	LDR	R3,=ZASLON
	LDR	R0,=ZNACKA	;utripajoca znacka
	LDR	R4,[R0]
	LDR	R0,=UTRIP
	LDR	R1,[R0]
	ADD	R1,R1,#1
	STR	R1,[R0]
	ANDS	R1,R1,#ZMIGA
	MOVEQ	R4,#0
	MOV	R0,#0x80	;set DDRAM address - zacetek prve vrstice
	BL	UKAZ
	MOV	R2,#16
IZPIS1	LDRB	R0,[R3],#1
	SUBS	R4,R4,#1
	MOVEQ	R0,#0x00
	BL	ZNAK
	SUBS	R2,R2,#1
	BNE	IZPIS1
	MOV	R0,#0xC0	;set DDRAM address - zacetek druge vrstice
	BL	UKAZ
	MOV	R2,#16
IZPIS2	LDRB	R0,[R3],#1
	SUBS	R4,R4,#1
	MOVEQ	R0,#0x00
	BL	ZNAK
	SUBS	R2,R2,#1
	BNE	IZPIS2
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Izpisi R1 HEX 4 bite v [R2]+ *** (R1-2)
HEX4	AND	R1,R1,#15
	CMP	R1,#10
	ADDCS	R1,R1,#7
	ADD	R1,R1,#48
	STRB	R1,[R2],#1
	BX	LR

;*** Izpisi R0 HEX 8 bitov v [R2]+ *** (R0-2)
HEX8	STR	LR,[SP,#-4]!	;resi link
	MOV	R1,R0,LSR#4	;4
	BL	HEX4
	MOV	R1,R0		;0
	BL	HEX4
	LDR	PC,[SP],#4	;povratek na link

;*** Izpisi R0 HEX 24 bitov v [R2]+ *** (R0-2)
HEX24	STR	LR,[SP,#-4]!	;resi link
	MOV	R1,R0,LSR#20	;20
	BL	HEX4
	MOV	R1,R0,LSR#16	;16
	BL	HEX4
	MOV	R1,R0,LSR#12	;12
	BL	HEX4
	MOV	R1,R0,LSR#8	;8
	BL	HEX4
	MOV	R1,R0,LSR#4	;4
	BL	HEX4
	MOV	R1,R0		;0
	BL	HEX4
	LDR	PC,[SP],#4	;povratek na link

;*** Zacetek programa po resetu ***
ZACNI	LDR	SP,=SKLAD	;inicializiraj SP
	BL	MAM	;inicializiraj MAM v LPC2138/2148
	BL	GPIO	;inicializiraj GPIO v LPC2138/2148
	BL	PLL0	;inicializiraj PLL0 v LPC2138/2148
	BL	INILCD	;inicializiraj LCD
	BL	INACICA ;inacica programa
	BL	T1S	;1s cakanja
	B	ZANKA	;glavna zanka programa
	LTORG

;*** Glavna zanka programa ***
ZANKA	BL	TEST	;testni zaslon

	BL	IZPIS	;izpisi vsebino pomnilnika 2x16 znakov
	B	ZANKA
	LTORG

;*** Testni zaslon *** (R0-)
TEST	STR	LR,[SP,#-4]!	;resi link

	MOV	R0,#32
	LDR	R1,=ZNACKA
	STR	R0,[R1]

	LDR	R2,=ZASLON

	ADD	r7,r7,#1
	MOV	r0,r7
	BL	HEX24

	MOV	R0,#32
	MOV	R1,#32
TEST1	STRB	R0,[R2],#1
	ADD	R0,R0,#1
	SUBS	R1,R1,#1
	BNE	TEST1
	LDR	PC,[SP],#4	;povratek na link

;*** Konec delovanja zbirnika ARM ***
	END
