;*** Krmiljenje HMC702LP6CE - S53MV 02.10.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

PARAM	EQU	0x40000600	;privzete nastavitve registrov (256x4byte)

IAPCMD	EQU	0x40000C00	;ukaz IAP
IAPRES	EQU	0x40000C80	;rezultat IAP

;*** 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=AD0.4
	LDR	R1,=0x00040000
	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

;*** Inicializiraj ADC0 v LPC2138/2148 *** (R0-1)
ADC0	LDR	R0,=0xE0034000	;AD0CR
	LDR	R1,=0x0021EE10 ;START=000,PDN=1,CLKS=000,BURST=1,CLKDIV=0xEE,SEL=0x10
	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
	MOV	R0,#0x04	;znak 1 - prerezani romb
	BL	ZNAK
	MOV	R0,#0x0E
	BL	ZNAK
	MOV	R0,#0x1F
	BL	ZNAK
	MOV	R0,#0x00
	BL	ZNAK
	MOV	R0,#0x1F
	BL	ZNAK
	MOV	R0,#0x0E
	BL	ZNAK
	MOV	R0,#0x04
	BL	ZNAK
	MOV	R0,#0x00
	BL	ZNAK
	MOV	R0,#0x1F	;znak 2 - vaga
	BL	ZNAK
	MOV	R0,#0x0E
	BL	ZNAK
	MOV	R0,#0x04
	BL	ZNAK
	MOV	R0,#0x00
	BL	ZNAK
	MOV	R0,#0x04
	BL	ZNAK
	MOV	R0,#0x0E
	BL	ZNAK
	MOV	R0,#0x1F
	BL	ZNAK
	MOV	R0,#0x00
	BL	ZNAK
	MOV	R0,#0x1F	;znak 3 - crno
	BL	ZNAK
	MOV	R0,#0x1F
	BL	ZNAK
	MOV	R0,#0x1F
	BL	ZNAK
	MOV	R0,#0x1F
	BL	ZNAK
	MOV	R0,#0x1F
	BL	ZNAK
	MOV	R0,#0x1F
	BL	ZNAK
	MOV	R0,#0x1F
	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 HMC702LP6CE "
	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,#"L"
	BL	ZNAK
	MOV	R0,#"P"
	BL	ZNAK
	MOV	R0,#"6"
	BL	ZNAK
	MOV	R0,#"C"
	BL	ZNAK
	MOV	R0,#"E"
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#0xC0	;set DDRAM address - zacetek druge vrstice
	BL	UKAZ
	MOV	R0,#"S"		;"S53MV "
	BL	ZNAK
	MOV	R0,#"5"
	BL	ZNAK
	MOV	R0,#"3"
	BL	ZNAK
	MOV	R0,#"M"
	BL	ZNAK
	MOV	R0,#"V"
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#"0"		;"02.10.2013"
	BL	ZNAK
	MOV	R0,#"2"
	BL	ZNAK
	MOV	R0,#"."
	BL	ZNAK
	MOV	R0,#"1"
	BL	ZNAK
	MOV	R0,#"0"
	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 2:6 bitov v [R2]+ *** (R0-2)
HEX26	STR	LR,[SP,#-4]!	;resi link
	MOV	R1,R0,LSR#6	;6
	AND	R1,R1,#3
	BL	HEX4
	MOV	R1,#":"
	STRB	R1,[R2],#1
	MOV	R1,R0,LSR#4	;4
	AND	R1,R1,#3
	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

;*** Izpisi R0 desetisko 2.1 v [R2]+ *** (R0-2)
DEC	MOV	R1,#"0"		;desetice
DEC1	CMP	R0,#100
	BCC	DEC2
	SUB	R0,R0,#100
	ADD	R1,R1,#1
	B	DEC1
DEC2	CMP	R1,#"0"		;brisi vodilno niclo
	MOVEQ	R1,#" "
	STRB	R1,[R2],#1
	MOV	R1,#"0"		;enice
DEC3	CMP	R0,#10
	BCC	DEC4
	SUB	R0,R0,#10
	ADD	R1,R1,#1
	B	DEC3
DEC4	STRB	R1,[R2],#1
	MOV	R1,#"."		;pika
	STRB	R1,[R2],#1
	MOV	R1,#"0"		;desetine
	ADD	R1,R1,R0
	STRB	R1,[R2],#1
	BX	LR

;*** 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

;*** Reset registrov HMC702 *** (R0-4,R8)
RHMC	STR	LR,[SP,#-4]!	;resi link
	LDR	R3,=PARAM
	MOV	R4,#0
RHMC1	ADD	R0,R3,R4,LSL#2	;zastavica?
	LDR	R8,[R0]
	MOVS	R8,R8
	BMI	RHMC2
	BIC	R8,R8,#0xFF000000
	MOV	R8,R8,LSL#1
	AND	R0,R4,#63
	ORR	R8,R8,R0,LSL#25
	BL	HMC		;HMC702 write/read (R8)
RHMC2	BL	T4MS
	ADD	R4,R4,#1
	CMP	R4,#256
	BCC	RHMC1
	LDR	PC,[SP],#4	;povratek na link
	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

;*** 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		;HMC702 write/read (R8)
	LDR	R2,=ZASLON
	LDR	R0,=REGIST	;izpis stevilke vpisa/registra
	LDR	R1,[R0]
	AND	R0,R1,#255
	BL	HEX26
	MOV	R0,#" "		;" (romb) R"
	STRB	R0,[R2],#1
	MOV	R0,#1
	STRB	R0,[R2],#1
	MOV	R0,#" "
	STRB	R0,[R2],#1
	MOV	R0,#"R"
	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,#3		;"(crno)"
	MOVNE	R0,#" "
	STRB	R0,[R2],#1
	LDR	R1,=0xE0034004	;AD0GDR voltmeter 0-51.2V
	LDR	R0,[R1]
	MOV	R0,R0,LSL#16
	MOV	R0,R0,LSR#22
	ADD	R0,R0,#1
	MOV	R0,R0,LSR#1
	BL	DEC
	MOV	R0,#"V"
	STRB	R0,[R2],#1
	LDR	R0,=REGIST	;vsebina za vpis v register
	LDR	R1,[R0]
	AND	R1,R1,#255
	LDR	R0,=PARAM
	ADD	R0,R0,R1,LSL#2
	LDR	R8,[R0]
	MOV	R0,#" "		;"  W"
	STRB	R0,[R2],#1
	MOV	R0,#" "
	STRB	R0,[R2],#1
	MOV	R0,#"W"
	STRB	R0,[R2],#1
	MOV	R0,R8
	BL	HEX24
	MOV	R0,#" "		;vpis ob resetu "(vaga)"?
	STRB	R0,[R2],#1
	MOVS	R8,R8
	MOVMI	R0,#" "
	MOVPL	R0,#2
	STRB	R0,[R2],#1
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Zacetne nastavitve iz FLASH *** (R0-3)
INIPAR	MOV	R0,#0		;zacetni kazalec
	LDR	R1,=KAZALO
	STR	R0,[R1]
	LDR	R0,=0x0007B000	;source Flash address
	LDR	R1,=0x40000600	;destination RAM address
	LDR	R2,=256
INIPAR1	LDR	R3,[R0],#4	;prepisi 256*4bajte
	STR	R3,[R1],#4		
	SUBS	R2,R2,#1
	BNE	INIPAR1
	BX	LR
	LTORG

;*** Vpis v FLASH pomnilnik *** (R0-4)
EEPROM	LDR	R0,=0x3FFFC036	;FIO1PIN2 precita tipke v R1
	LDRB	R1,[R0]
	AND	R1,R1,#0x0F	;izkljucno LEVO+DESNO vpis v EEPROM?
	EORS	R1,R1,#0x06
	BXNE	LR
	STR	LR,[SP,#-4]!	;resi link
	BL	HMCLCD		;napis na LCD
	BL	RHMC		;vpis registrov HMC702
	LDR	R0,=0x0007B000	;Flash address
	LDR	R1,=0x40000600	;RAM address
	LDR	R2,=256
EEPROM1	LDR	R3,[R0],#4	;primerjaj 256*4bajte
	LDR	R4,[R1],#4
	CMP	R3,R4
	BNE	EEPROM2		;vpisi EEPROM samo razlicno!
	SUBS	R2,R2,#1
	BNE	EEPROM1
	LDR	PC,[SP],#4	;povratek na link
EEPROM2	BL	EELCD		;dopolni napis na LCD
	LDR	R0,=IAPCMD	;prepare sector 25: 0x0007B000-0x0007BFFF
	LDR	R2,=50		;command code 50
	STR	R2,[R0]
	LDR	R2,=25		;start sector number 25
	STR	R2,[R0,#4]
	LDR	R2,=25		;end sector number 25
	STR	R2,[R0,#8]
	LDR	R1,=IAPRES
	LDR	R2,=0x7FFFFFF1	;IAP naslov 0x7ffffff1 THUMB
	MOV	LR,PC
	BX	R2
	BL	T4MS		;zakasnitev 4ms
	LDR	R0,=IAPCMD	;erase sector 25: 0x0007B000-0x0007BFFF
	LDR	R2,=52		;command code 50
	STR	R2,[R0]
	LDR	R2,=25		;start sector number 25
	STR	R2,[R0,#4]
	LDR	R2,=25		;end sector number 25
	STR	R2,[R0,#8]
	LDR	R2,=12000	;system clock frequency (CCLK) in kHz
	STR	R2,[R0,#12]
	LDR	R1,=IAPRES
	LDR	R2,=0x7FFFFFF1	;IAP naslov 0x7ffffff1 THUMB
	MOV	LR,PC
	BX	R2
	BL	T4MS		;zakasnitev 4ms
	LDR	R0,=IAPCMD	;prepare sector 25: 0x0007B000-0x0007BFFF
	LDR	R2,=50		;command code 50
	STR	R2,[R0]
	LDR	R2,=25		;start sector number 25
	STR	R2,[R0,#4]
	LDR	R2,=25		;end sector number 25
	STR	R2,[R0,#8]
	LDR	R1,=IAPRES
	LDR	R2,=0x7FFFFFF1	;IAP naslov 0x7ffffff1 THUMB
	MOV	LR,PC
	BX	R2
	BL	T4MS		;zakasnitev 4ms
	LDR	R0,=IAPCMD	;copy RAM to Flash: 0x40000600>0x0007B000
	LDR	R2,=51		;command code 51
	STR	R2,[R0]
	LDR	R2,=0x0007B000	;destination Flash address
	STR	R2,[R0,#4]
	LDR	R2,=0x40000600	;source RAM address
	STR	R2,[R0,#8]
	LDR	R2,=1024	;number of bytes to be written (1024)
	STR	R2,[R0,#12]
	LDR	R2,=12000	;system clock frequency (CCLK) in kHz
	STR	R2,[R0,#16]
	LDR	R1,=IAPRES
	LDR	R2,=0x7FFFFFF1	;IAP naslov 0x7ffffff1 THUMB
	MOV	LR,PC
	BX	R2
	BL	T1S		;zakasnitev 1s
	BL	INIPAR		;inicializiraj parametre iz FLASH
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Izpisi vpis v EEPROM *** (R0-3)
EELCD	STR	LR,[SP,#-4]!	;resi link
	MOV	R0,#0xC0	;set DDRAM address - zacetek druge vrstice
	BL	UKAZ
	MOV	R0,#"*"		;"***  EEPROM  ***"
	BL	ZNAK
	MOV	R0,#"*"
	BL	ZNAK
	MOV	R0,#"*"
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#"E"
	BL	ZNAK
	MOV	R0,#"E"
	BL	ZNAK
	MOV	R0,#"P"
	BL	ZNAK
	MOV	R0,#"R"
	BL	ZNAK
	MOV	R0,#"O"
	BL	ZNAK
	MOV	R0,#"M"
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#"*"
	BL	ZNAK
	MOV	R0,#"*"
	BL	ZNAK
	MOV	R0,#"*"
	BL	ZNAK
	LDR	PC,[SP],#4	;povratek na link

;*** Izpisi vpis v HMC702 *** (R0-3)
HMCLCD	STR	LR,[SP,#-4]!	;resi link
	MOV	R0,#0x80	;set DDRAM address - zacetek prve vrstice
	BL	UKAZ
	MOV	R0,#"*"		;"***  HMC702  ***"
	BL	ZNAK
	MOV	R0,#"*"
	BL	ZNAK
	MOV	R0,#"*"
	BL	ZNAK
	MOV	R0,#" "
	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,#0xC0	;set DDRAM address - zacetek druge vrstice
	BL	UKAZ
	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,#" "
	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,#" "
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	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	INILCD	;inicializiraj LCD
	BL	INIPAR	;zacetne nastavitve iz FLASH
	BL	ADC0	;inicializiraj ADC0 v LPC2138/2148
	BL	INACICA ;inacica programa
	BL	T1S	;1s cakanja
	BL	RHMC	;reset registrov HMC702
	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
	BL	EEPROM	;vpis v FLASH pomnilnik
	B	ZANKA
	LTORG

;*** Izvedi ukaz s tipk *** (R0-2,R8)+HMC
IZVEDI	LDR	R1,=KAZALO	;preveri KAZALO
	LDR	R0,[R1]
	MOVS	R0,R0
	MOVMI	R0,#0
	CMP	R0,#10
	MOVCS	R0,#9
	STR	R0,[R1]
	CMP	R0,#2		;zamenjaj vpis/register?
	BCS	IZVEDI1	
	CMP	R0,#1
	MOVNE	R1,#1
	MOVNE	R2,#64
	MOVEQ	R1,#4
	MOVEQ	R2,#1
	LDR	R0,=ZNACKA	;shrani polozaj znacke
	STR	R1,[R0]
	LDR	R1,=PREMIK	;izracunaj premik v R1
	LDR	R0,[R1]
	MUL	R1,R0,R2
	LDR	R0,=REGIST
	LDR	R2,[R0]
	ADD	R2,R2,R1
	STR	R2,[R0]
	BX	LR
	LTORG
IZVEDI1	BEQ	IZVEDI3		;vpis enega registra?
	CMP	R0,#3
	MOVEQ	R1,#25
	MOVEQ	R2,#0x100000
	CMP	R0,#4
	MOVEQ	R1,#26
	MOVEQ	R2,#0x010000
	CMP	R0,#5
	MOVEQ	R1,#27
	MOVEQ	R2,#0x001000
	CMP	R0,#6
	MOVEQ	R1,#28
	MOVEQ	R2,#0x000100
	CMP	R0,#7
	MOVEQ	R1,#29
	MOVEQ	R2,#0x000010
	CMP	R0,#8
	MOVEQ	R1,#30
	MOVEQ	R2,#0x000001
	CMP	R0,#9
	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
	BMI	IZVEDI2		;popravi vsebino za vpis?
	MUL	R0,R1,R2
	LDR	R1,=REGIST
	LDR	R2,[R1]
	AND	R2,R2,#255
	LDR	R1,=PARAM
	ADD	R1,R1,R2,LSL#2
	LDR	R2,[R1]
	BIC	R2,R2,#0x3F000000
	ORR	R2,R2,#0x40000000
	ADD	R2,R2,R0
	STR	R2,[R1]
	BX	LR
	LTORG
IZVEDI2	LDR	R0,=REGIST	;vklop/izklop skupinskega vpisa?
	LDR	R2,[R0]
	AND	R2,R2,#255
	LDR	R0,=PARAM
	ADD	R0,R0,R2,LSL#2
	LDR	R2,[R0]
	MOVS	R1,R1
	ORRMI	R2,R2,#0x80000000
	BICGT	R2,R2,#0x80000000
	STR	R2,[R0]
	BX	LR
	LTORG
IZVEDI3	MOV	R1,#6		;shrani polozaj znacke
	LDR	R0,=ZNACKA
	STR	R1,[R0]
	LDR	R0,=PREMIK	;premik v R1?
	LDR	R1,[R0]
	MOVS	R1,R1
	BGT	IZVEDI4
	BMI	IZVEDI5
	BX	LR
	LTORG
IZVEDI4	STR	LR,[SP,#-4]!	;RAM v register
	LDR	R0,=REGIST
	LDR	R1,[R0]
	AND	R1,R1,#255
	LDR	R0,=PARAM
	ADD	R0,R0,R1,LSL#2
	LDR	R2,[R0]
	BIC	R2,R2,#0xFF000000
	MOV	R2,R2,LSL#1
	AND	R1,R1,#63
	ORR	R8,R2,R1,LSL#25
	BL	HMC		;HMC702 write/read (R8)
	LDR	PC,[SP],#4
	LTORG
IZVEDI5	STR	LR,[SP,#-4]!	;register v RAM, ohrani zastavico RESET
	LDR	R0,=REGIST
	LDR	R1,[R0]
	AND	R0,R1,#63
	ORR	R0,R0,#64
	MOV	R8,R0,LSL#25
	BL	HMC		;HMC702 write/read (R8)
	LDR	R0,=REGIST
	LDR	R1,[R0]
	AND	R1,R1,#255
	LDR	R0,=PARAM
	ADD	R0,R0,R1,LSL#2
	LDR	R2,[R0]
	AND	R2,R2,#0xFF000000
	MOV	R1,R8,LSR#1
	BIC	R1,R1,#0xFF000000
	ORR	R2,R2,R1
	STR	R2,[R0]
	LDR	PC,[SP],#4
	LTORG

;*** Konec delovanja zbirnika ARM ***
	END
