;*** Krmiljenje HMC702LP6C - S53MV 04.09.2013 ***

;*** Vhodno/izhodni prikljucki LPC2138/2148 (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
KAZALO	EQU	0x40000588	;kazalec na velicino
TIPKES	EQU	0x4000058C	;stare tipke
PREMIK	EQU	0x40000590	;premik parametra

REGIST	EQU	0x40000594	;prikazani register HMC702

NACIN	EQU	0x40000600	;privzete nastavitve registrov (64x4byte)


;*** 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 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 (priblizno) *** (R0)
T1US	MOV	R0,#2
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

;*** HMC702 write/read (R8) *** (R0-2,R8)
HMC	STR	LR,[SP,#-4]!	;resi link
	LDR	R0,=0x3FFFC01A	;FIO0SET2
	MOV	R1,#0x10	;enable SSEL=SEN
	STRB	R1,[R0]
	MOV	R2,#32		;zanka 32 bitov
HMC1	BL	HMC2
	SUBS	R2,R2,#1
	BNE	HMC1
	LDR	R0,=0x3FFFC01E	;FIO0CLR2
	MOV	R1,#0x10	;enable SSEL=SEN
	STRB	R1,[R0]
	LDR	PC,[SP],#4	;povratek na link
	LTORG
HMC2	ADDS	R8,R8,R8	;oddaja
	LDRCC	R0,=0x3FFFC01E	;FIO0CLR2
	LDRCS	R0,=0x3FFFC01A	;FIO0SET2
	MOV	R1,#0x08	;oddaja MOSI=SDI
	STRB	R1,[R0]
	LDR	R0,=0x3FFFC01A	;FIO0SET2
	MOV	R1,#0x02	;takt SCK
	STRB	R1,[R0]
	LDR	R0,=0x3FFFC01E	;FIO0CLR2
	MOV	R1,#0x02	;takt SCK
	STRB	R1,[R0]
	LDR	R0,=0x3FFFC016	;FIO0PIN2
	LDRB	R1,[R0]		;sprejem MISO=SDO_LD
	TST	R1,#0x04
	ORRNE	R8,R8,#1
	BX	LR
	LTORG

;*** Preberi ukaz s tipk *** (R0-4)
TIPKE	LDR	R0,=0x3FFFC036	;FIO1PIN2 precita tipke v R1
	LDRB	R1,[R0]
	AND	R1,R1,#0x0F
	LDR	R0,=TIPKES	;stara vrednost tipk v R2
	LDR	R2,[R0]
	STR	R1,[R0]
	EOR	R1,R1,#0x0F
	AND	R2,R2,R1	;veljavne zastavice v R2
	LDR	R0,=UTRIP	;sahovnica ali znak?
	LDR	R3,[R0]
	LDR	R1,=KAZALO	;KAZALO	LEVO/DESNO
	LDR	R4,[R1]
	TST	R2,#0x08	;ukaz LEVO in sahovnica?
	MOVNE	R3,#ZMIGA
	SUBNE	R4,R4,#1
	TST	R2,#0x01	;ukaz DESNO in sahovnica?
	MOVNE	R3,#ZMIGA
	ADDNE	R4,R4,#1
	STR	R4,[R1]		;shrani KAZALO
	MOV	R4,#0
	TST	R2,#0x04	;ukaz GOR in znak?
	ADDNE	R4,R4,#1
	MOVNE	R3,#0
	TST	R2,#0x02	;ukaz DOL in znak?
	SUBNE	R4,R4,#1
	MOVNE	R3,#0
	LDR	R1,=PREMIK	;shrani PREMIK
	STR	R4,[R1]
	STR	R3,[R0]		;shrani sahovnico/znak
	BX	LR
	LTORG

;*** 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	INILCD	;inicializiraj LCD
	BL	INACICA ;inacica programa
	BL	T1S	;1s cakanja
	MOV	R0,#0	;zacetni register 0 in kazalo 0
	LDR	R1,=REGIST
	STR	R0,[R1]
	LDR	R1,=KAZALO
	STR	R0,[R1]
	B	ZANKA	;glavna zanka programa
	LTORG

;*** Glavna zanka programa ***
ZANKA	BL	TIPKE	;preberi ukaz s tipk
	BL	IZVEDI	;izvedi ukaz s tipk
	BL	MENU	;menu v pomnilnik zaslona
	BL	IZPIS	;izpisi vsebino pomnilnika 2x16 znakov
	B	ZANKA
	LTORG

;*** Izvedi ukaz s tipk *** (R0-8)
IZVEDI	STR	LR,[SP,#-4]!	;resi link
	LDR	R1,=KAZALO	;preveri KAZALO
	LDR	R0,[R1]
	MOVS	R0,R0
	MOVMI	R0,#0
	CMP	R0,#9
	MOVCS	R0,#8
	STR	R0,[R1]
	MOV	R1,#0		;polozaj znacke in popravek WR
	MOV	R2,#0
	CMP	R0,#1
	MOVEQ	R1,#18
	CMP	R0,#2
	MOVEQ	R1,#25
	MOVEQ	R2,#0x100000
	CMP	R0,#3
	MOVEQ	R1,#26
	MOVEQ	R2,#0x010000
	CMP	R0,#4
	MOVEQ	R1,#27
	MOVEQ	R2,#0x001000
	CMP	R0,#5
	MOVEQ	R1,#28
	MOVEQ	R2,#0x000100
	CMP	R0,#6
	MOVEQ	R1,#29
	MOVEQ	R2,#0x000010
	CMP	R0,#7
	MOVEQ	R1,#30
	MOVEQ	R2,#0x000001
	CMP	R0,#8
	MOVEQ	R1,#32
	MOVEQ	R2,#-1
	LDR	R0,=ZNACKA	;shrani polozaj znacke
	STR	R1,[R0]
	LDR	R0,=PREMIK	;premik v R1
	LDR	R1,[R0]
	MOVS	R2,R2		;zamenjaj register?
	BNE	IZVEDI1
	LDR	R0,=REGIST
	LDR	R2,[R0]
	ADD	R2,R2,R1
	STR	R2,[R0]
	LDR	PC,[SP],#4	;povratek na link
	LTORG
IZVEDI1	BMI	IZVEDI2		;popravi vsebino za vpis?
	MUL	R0,R1,R2
	LDR	R1,=REGIST
	LDR	R2,[R1]
	AND	R2,R2,#63
	LDR	R1,=NACIN
	ADD	R1,R1,R2,LSL#2
	LDR	R2,[R1]
	ADD	R2,R2,R0
	STR	R2,[R1]
	LDR	PC,[SP],#4	;povratek na link
	LTORG
IZVEDI2	MOVS	R1,R1		;vpis ob resetu?
	LDREQ	PC,[SP],#4	;povratek na link
	LDR	R0,=REGIST
	LDR	R2,[R0]
	AND	R2,R2,#63
	LDR	R0,=NACIN
	ADD	R0,R0,R2,LSL#2
	LDR	R2,[R0]
	ORRPL	R2,R2,#0xFF000000
	BICMI	R2,R2,#0xFF000000
	STR	R2,[R0]
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Menu v pomnilnik zaslona *** (R0-2,R8)+HEX8,HEX24
MENU	STR	LR,[SP,#-4]!	;resi link
	LDR	R0,=REGIST	;preberi vsebino registra
	LDR	R1,[R0]
	AND	R0,R1,#63
	ORR	R0,R0,#64
	MOV	R8,R0,LSL#25
	BL	HMC
	LDR	R2,=ZASLON
	MOV	R0,#"R"		;"R:"
	STRB	R0,[R2],#1
	MOV	R0,#":"
	STRB	R0,[R2],#1
	LDR	R0,=REGIST	;izpis stevilke registra
	LDR	R1,[R0]
	AND	R0,R1,#63
	BL	HEX8
	MOV	R0,#" "		;" RD:"
	STRB	R0,[R2],#1
	MOV	R0,#"R"
	STRB	R0,[R2],#1
	MOV	R0,#"D"
	STRB	R0,[R2],#1
	MOV	R0,#":"
	STRB	R0,[R2],#1
	MOV	R0,R8,LSR#1	;izpis vsebine registra
	BL	HEX24
	MOV	R0,#" "		;stanje PLL "U/L"
	STRB	R0,[R2],#1
	TST	R8,#1
	MOVEQ	R0,#"U"
	MOVNE	R0,#"L"
	STRB	R0,[R2],#1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	MOV	R0,#" "		;stiri praznine
	STRB	R0,[R2],#1
	STRB	R0,[R2],#1
	STRB	R0,[R2],#1
	STRB	R0,[R2],#1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	LDR	R0,=REGIST	;vsebina za vpis v register
	LDR	R1,[R0]
	AND	R1,R1,#63
	LDR	R0,=NACIN
	ADD	R0,R0,R1,LSL#2
	LDR	R8,[R0]
	MOV	R0,#" "		;" WR:"
	STRB	R0,[R2],#1
	MOV	R0,#"W"
	STRB	R0,[R2],#1
	MOV	R0,#"R"
	STRB	R0,[R2],#1
	MOV	R0,#":"
	STRB	R0,[R2],#1
	MOV	R0,R8
	BL	HEX24
	MOV	R0,#" "		;vpis ob resetu "!"
	STRB	R0,[R2],#1
	MOVS	R8,R8
	MOVPL	R0,#" "
	MOVMI	R0,#"!"
	STRB	R0,[R2],#1
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Konec delovanja zbirnika ARM ***
	END
