;*** Zgovorni voltmeter - S53MV 16.03.2014 ***

;*** Konstante mikrokrmilnika LPC2138/01 ***
KVARC	EQU	14745600	;frekvenca kristala (Hz)
CLK	EQU	KVARC		;frekvenca jedra ARM (brez PLL !!!)
PCLK	EQU	CLK/2		;frekvenca vhodno/izhodnih enot (APBDIV)
BAUD	EQU	PCLK/153600	;modulo deljenja UART za 9600bps*16
N1US	EQU	CLK/3000000	;konstanta cakanja T1US za HD44780
NZVOK	EQU	(PCLK+4000)/8000	;TIMER0 prekinitve 8kHz
NADC	EQU	PCLK/200000	;deljenje takta ADC0
SKALA	EQU	960		;nastavi skalo za delilnik 150k+33k pred AD0.6 !!!!!!!!!!!!!!!!!!!!!!!!!!!

;*** Vhodno/izhodni prikljucki LPC2138/01 ***
;/RESET - vhod vezan na /ERROR.LP2951 in na /DTR.FT231XS
;P0.0/TXD0/PWM1 - izhod vezan na RXD.FT231XS 
;P0.1/RXD0/PWM3/EINT0 - vhod vezan na TXD.FT231XS
;P0.2.od/SCL0/CAP0.0 -
;P0.3.od/SDA0/MAT0.0/EINT1 -
;P0.4/SCK0/CAP0.1/AD0.6 - vhod voltmetra AD0.6 z uporovnim delilnikom
;P0.5/MISO0/MAT0.1/AD0.7 -
;P0.6/MOSI0/CAP0.2/AD1.0 -
;P0.7/SSEL0/PWM2/EINT2 -
;P0.8/TXD1/PWM4/AD1.1 -
;P0.9/RXD1/PWM6/EINT3 -
;P0.10/RTS1/CAP1.0/AD1.2 -
;P0.11.od/CTS1/CAP1.1/SCL1 -
;P0.12/DSR1/MAT1.0/AD1.3 -
;P0.13/DTR1/MAT1.1/AD1.4 -
;P0.14.od/DCD1/EINT1/SDA1/BOOTLOADER(!) - vhod vezan na /RTS.FT231XS 
;P0.15/RI1/EINT2/AD1.5 -
;P0.16-23 - digitalni izhodi za LCD D0-7.HD44780
;P0.24 - ne obstaja ***
;P0.25/AD0.4/AOUT - analogni izhod govora AOUT preko kondenzatorja na slusalke/zvocnik 
;P0.26/AD0.5 -
;P0.27/AD0.0/CAP0.1/MAT0.1 -
;P0.28/AD0.1/CAP0.2/MAT0.2 -
;P0.29/AD0.2/CAP0.3/MAT0.3 -
;P0.30/AD0.3/EINT3/CAP0.0 -
;P0.31(!) - nepovezan ***
;P1.0-15 - ne obstajajo ***
;P1.16-19 - vhodi z vgrajenim PULL-UP za tipke na maso
;P1.20(!) - nepovezan ***
;P1.21 - digitalni izhod za LCD RS.HD44780
;P1.22-25 - nepovezani ***
;P1.26(!) - nepovezan ***
;P1.27-29 - nepovezani ***
;P1.30 - digitalni izhod za LCD E.HD44780
;P1.31 - nepovezan ***

;*** Dodelitev pomnilnika RAM ***
SKLAD	EQU	0x40000300	;navzdol -768byte
MERITEV	EQU	0x40000400	;dvojiski rezultat meritve (32bit)
CENTI	EQU	0x40000404	;stotinke (8bit)
DECI	EQU	0x40000405	;desetinke (8bit)
ENICE	EQU	0x40000406	;enice (8bit)
DEKA	EQU	0x40000407	;desetice (8bit)
CELI	EQU	0x40000408	;celi del (8bit)
ZSTANJE	EQU	0x40000409	;stanje govora (8bit)
ZCENTI	EQU	0x4000040A	;stotinke zvok (8bit)
ZDECI	EQU	0x4000040B	;desetinke zvok (8bit)
ZKAZALC	EQU	0x4000040C	;kazalec vzorcev v zapisu (32bit)
ZSTEVEC	EQU	0x40000410	;stevec vzorcev v zapisu (16bit)

;*** Ukazi za delovanje zbirnika ARM ***
	AREA	RESET, CODE, READONLY, ALIGN=9
	ENTRY
	CODE32

;*** Tabela izjem na zacetnem naslovu 0 ***
IZJEME	B	ZACNI	;RESET
	B	IZJEME	;Undef
	B	IZJEME	;SWI
	B	IZJEME	;PAbt
	B	IZJEME	;DAbt
	NOP		;Reserved Vector
	B	IZJEME	;IRQ
;;;	B	PREKIN	;FIQ *** Skok ni potreben, ko takoj sledi PREKIN !!!

;*** FIQ prekinitveni podprogram za TIMER0 *** (R8-10.FIQ) brez sklada!
PREKIN	MOV	R8,#0x80	;bajt za tisino
	LDR	R9,=ZSTEVEC	;stevec vzorcev v zapisu
	LDRH	R10,[R9]
	MOVS	R10,R10
	BEQ	PREKIN1
	SUB	R10,R10,#1
	STR	R10,[R9]
	LDR	R9,=ZKAZALC	;kazalec vzorcev v zapisu
	LDR	R10,[R9]
	LDRB	R8,[R10],#1	;bajt iz zapisa
	STR	R10,[R9]
PREKIN1	MOV	R9,R8,LSL#8	;obdelaj bajt za DAC in nastavi glasnost
	LDR	R8,=0xE006C000	;naslov DACR
	STR	R9,[R8]
	LDR	R8,=0xE0004000	;T0IR=0xFF reset zahtev TIMER0
	MOV	R9,#0xFF
	STRB	R9,[R8]
	SUBS	PC,LR,#4	;izhod iz prekinitve
	LTORG

;*** Inicializiraj MAM *** (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]
	MOV	PC,LR
	LTORG

;*** Nastavi PCONP in APBDIV *** (R0-1)
PWRCLK	LDR	R0,=0xE01FC0C4	;PCONP
	LDR	R1,=0x0000100A	;AD0,UART0,TIM0
	STR	R1,[R0]
	LDR	R0,=0xE01FC100	;APBDIV=2
	MOV	R1,#2
	STRB	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Inicializiraj PLL *** (R0-2)
PLL	LDR	R0,=0xE01FC084	;PLLCFG=0x24 P=2,M-1=3
	MOV	R1,#0x23
	STRB	R1,[R0]
	LDR	R0,=0xE01FC080	;PLLCON=0x01 PLL-enable
	MOV	R1,#0x01
	STRB	R1,[R0]
	LDR	R0,=0xE01FC08C	;PLLFEED
	MOV	R1,#0xAA
	MOV	R2,#0x55
	STRB	R1,[R0]
	STRB	R2,[R0]
PLL1	LDR	R0,=0xE01FC088	;PLLSTAT cakanje uklenitve
	LDR	R1,[R0]
	ANDS	R1,R1,#0x400
	BEQ	PLL1
	LDR	R0,=0xE01FC080	;PLLCON=0x03 PLL-enable&connect
	MOV	R1,#0x03
	STRB	R1,[R0]
	LDR	R0,=0xE01FC08C	;PLLFEED
	MOV	R1,#0xAA
	MOV	R2,#0x55
	STRB	R1,[R0]
	STRB	R2,[R0]
	MOV	PC,LR
	LTORG

;*** Inicializiraj GPIO in DAC *** (R0-1)
GPIO	LDR	R0,=0xE002C000	;PINSEL0 P0.0-1=UART0 P0.4=AD0.6
	LDR	R1,=0x00000305
	STR	R1,[R0]
	LDR	R0,=0xE002C004	;PINSEL1 P0.25=AOUT
	LDR	R1,=0x00080000
	STR	R1,[R0]
	LDR	R0,=0xE002C014	;PINSEL2 izklop JTAG&TRACE
	LDR	R1,[R0]
	BIC	R1,R1,#0x0C
	STR	R1,[R0]
	LDR	R0,=0xE01FC1A0	;SCS=0x03 high-speed GPIO 0&1
	MOV	R1,#0x03
	STR	R1,[R0]
	LDR	R0,=0x3FFFC014	;FIO0PIN vsi 1
	MOV	R1,#-1
	STR	R1,[R0]
	LDR	R0,=0x3FFFC034	;FIO1PIN vsi 0
	MOV	R1,#0
	STR	R1,[R0]
	LDR	R0,=0x3FFFC000	;FIO0DIR izhodi 0.0-0.31
	LDR	R1,=0xFFFFFFFF
	STR	R1,[R0]
	LDR	R0,=0x3FFFC020	;FIO1DIR izhodi 1.20-1.31
	LDR	R1,=0xFFF00000
	STR	R1,[R0]
	LDR	R0,=0xE006C000	;DACR sredina skale, visok tok
	LDR	R1,=0x00008000
	STR	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Inicializiraj UART0 *** (R0-1)
UART0	LDR	R0,=0xE000C00C	;U0LCR=0x83 DLAB=1,no-parity,1stop,8bit
	MOV	R1,#0x83
	STRB	R1,[R0]
	LDR	R0,=0xE000C000	;U0DLL 
	LDR	R1,=BAUD
	STRB	R1,[R0]
	LDR	R0,=0xE000C004	;U0DLM
	MOV	R1,R1,LSR#8
	STRB	R1,[R0]
	LDR	R0,=0xE000C008	;U0FCR=0xC1 RXtrig=14bit,FIFOenable
	MOV	R1,#0xC1
	STRB	R1,[R0]
	LDR	R0,=0xE000C00C	;U0LCR=0x03 DLAB=0,no-parity,1stop,8bit
	MOV	R1,#0x03
	STRB	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Vkljuci prekinitve FIQ v ARM *** (R0)
FIQON	MRS	R0,CPSR		;preberi CPSR
	BIC	R0,R0,#0x40	;vkljuci prekinitve FIQ
	MSR	CPSR_c,R0	;popravi CPSR
	MOV	PC,LR

;*** Nastavi prekinitve TIMER0 *** (R0-1)
TIMER0	LDR	R0,=ZSTEVEC	;resetiraj stevec vzorcev v zapisu
	MOV	R1,#0
	STRH	R1,[R0]
	LDR	R0,=ZSTANJE	;resetiraj stanje govora
	MOV	R1,#0
	STRB	R1,[R0]
	LDR	R0,=0xE0004018	;T0MR0=NZVOK-1
	LDR	R1,=NZVOK
	SUB	R1,R1,#1
	STR	R1,[R0]
	LDR	R0,=0xE0004014	;T0MCR=0x0003 reset in int iz MR0
	MOV	R1,#0x0003
	STR	R1,[R0]
	LDR	R0,=0xE0004004	;T0TCR=0x01 vklop TIMER0
	MOV	R1,#0x01
	STR	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Inicializiraj VIC *** (R0-1)
VIC	LDR	R0,=0xFFFFF00C	;VICIntSelect=0x00000010 TIMER0=FIQ
	LDR	R1,=0x00000010
	STR	R1,[R0]
	LDR	R0,=0xFFFFF010	;VICIntEnable=0x00000010 TIMER0
	LDR	R1,=0x00000010
	STR	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Inicializiraj HD44780 5X7,2vrstici,CGRAM *** (R0-3)
INILCD	STR	LR,[SP,#-4]!	;resi link
	BL	T100MS		;zakasnitev 100ms
	MOV	R0,#0x38	;function set 
	BL	UKAZ
	BL	T4MS		;zakasnitev 4ms
	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		;zakasnitev 4ms
	MOV	R0,#0x06	;entry mode set
	BL	UKAZ
	MOV	R0,#0x0C	;display on
	BL	UKAZ
	MOV	R0,#0x40	;set CGRAM address
	BL	UKAZ
	MOV	R2,#64		;prepisi 8 znake = 64 bajtov
	LDR	R3,=INILCD2
INILCD1	LDRB	R0,[R3],#1
	BL	ZNAK
	SUBS	R2,R2,#1
	BNE	INILCD1
	MOV	R0,#0x80	;set DDRAM address zacetek prve vrstice
	BL	UKAZ
	LDR	PC,[SP],#4	;povratek na link
	LTORG
INILCD2	DCB	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04	;0=praznina
	DCB	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x04	;1=enacrtica
	DCB	0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x04	;2=dvecrtici
	DCB	0x15,0x15,0x15,0x15,0x15,0x15,0x00,0x04	;3=tricrtice
	DCB	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F	;0=praznina podcrtana
	DCB	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x1F	;1=enacrtica podcrtana
	DCB	0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x1F	;2=dvecrtici podcrtana
	DCB	0x15,0x15,0x15,0x15,0x15,0x15,0x00,0x1F	;3=tricrtice podcrtana
	ALIGN

;*** Podcrtan stolpec v desno v drugi vrstici iz R3 *** (R0-3)
STOLP	STR	LR,[SP,#-4]!	;resi link
	MOV	R0,#0xC0	;set DDRAM address druga vrstica
	BL	UKAZ
	MOV	R2,#0
STOLP1	MOV	R0,#0		;praznina za velike korake po 16
	CMP	R3,#16		;ena crtica?
	MOVCS	R0,#1
	CMP	R3,#32		;dve crtici?
	MOVCS	R0,#2
	CMP	R3,#48		;tri crtice?
	MOVCS	R0,#3
	AND	R1,R3,#15	;podcrtaj pripadajoci znak za male korake po 1
	CMP	R1,R2
	ADDEQ	R0,R0,#4
	BL	ZNAK		;izpisi crtice
	SUBS	R3,R3,#48	;odstej 3 crtice, negativno ustavi?
	ANDMI	R3,R3,#15
	ADD	R2,R2,#1	;zanka 16 znakov
	CMP	R2,#16
	BMI	STOLP1
	LDR	PC,[SP],#4	;povratek na link

;*** Besedilo iz [R3] v HD44780, zakljuceno z 0 ***
BESEDA	STR	LR,[SP,#-4]!	;resi link
BESEDA1	LDRB	R0,[R3],#1	;preberi znak
	MOVS	R0,R0
	LDREQ	PC,[SP],#4	;povratek na link ob izhodu
	BL	ZNAK		;izpisi znak
	B	BESEDA1

;*** Znak iz R0 v HD44780 *** (R0-1)
ZNAK	STR	LR,[SP,#-4]!	;resi link
	LDR	R1,=0x3FFFC016	;FIO0PIN2 podatek
	STRB	R0,[R1]
	LDR	R1,=0x3FFFC03A	;FIO1SET2
	MOV	R0,#0x20	;RS=1
	STRB	R0,[R1]
	BL	T1US		;zakasnitev 1us
	LDR	R1,=0x3FFFC03B	;FIO1SET3
	MOV	R0,#0x40	;vklopi E
	STRB	R0,[R1]
	BL	T1US		;zakasnitev 1us
	LDR	R1,=0x3FFFC03F	;FIO1CLR3
	MOV	R0,#0x40	;izklopi E
	STRB	R0,[R1]
	BL	T100US		;zakasnitev 100us
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Ukaz iz R0 v HD44780 *** (R0-1)
UKAZ	STR	LR,[SP,#-4]!	;resi link
	LDR	R1,=0x3FFFC016	;FIO0PIN2 podatek
	STRB	R0,[R1]
	LDR	R1,=0x3FFFC03E	;FIO1CLR2
	MOV	R0,#0x20	;RS=0
	STRB	R0,[R1]
	BL	T1US		;zakasnitev 1us
	LDR	R1,=0x3FFFC03B	;FIO1SET3
	MOV	R0,#0x40	;vklopi E
	STRB	R0,[R1]
	BL	T1US		;zakasnitev 1us
	LDR	R1,=0x3FFFC03F	;FIO1CLR3
	MOV	R0,#0x40	;izklopi E
	STRB	R0,[R1]
	BL	T100US		;zakasnitev 100us
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Zakasnitev 1us *** (R0)
	ALIGN	16
T1US	MOV	R0,#N1US
T1US1	SUBS	R0,R0,#1
	BPL	T1US1
	MOV	PC,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 100ms *** (R0-3)
T100MS	STR	LR,[SP,#-4]!	;resi link
	MOV	R3,#25
T100MS1	BL	T4MS
	SUBS	R3,R3,#1
	BPL	T100MS1
	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

;*** Izpis in govor ob vklopu *** (R0-3)
VKLOP	STR	LR,[SP,#-4]!	;resi link
	MOV	R0,#0x80	;prva vrstica besedila ob vklopu
	BL	UKAZ
	LDR	R3,=VKLOP1
	BL	BESEDA
	MOV	R0,#0xC0	;druga vrstica besedila ob vklopu
	BL	UKAZ
	LDR	R3,=VKLOP2
	BL	BESEDA
	BL	T100MS		;zakasnitev 100ms
	MOV	R3,#34		;govor ob vklopu
	BL	GOVOR
	BL	T1S		;zakasnitev 1s
	MOV	R0,#0x80	;pobrisi prvo vrstico
	BL	UKAZ
	LDR	R3,=VKLOP3
	BL	BESEDA
	LDR	PC,[SP],#4	;povratek na link
	LTORG
VKLOP1	DCB	"Zgovorni V-meter",0
VKLOP2	DCB	"S53MV 16.03.2014",0
VKLOP3	DCB	"                ",0
	ALIGN

;*** Zacetek programa po resetu ***
ZACNI	LDR	SP,=SKLAD	;inicializiraj SP
	BL	MAM		;inicializiraj MAM
	BL	PWRCLK		;nastavi PCONP in APBDIV
;;;	BL	PLL		;inicializiraj PLL *** PLL IZKLUCEN !!!
	BL	GPIO		;inicializiraj GPIO in DAC
	BL	UART0		;inicializiraj UART0
	BL	INILCD		;inicializiraj HD44780 5X7,2vrstici,CGRAM
	BL	VIC		;inicializiraj VIC
	BL	TIMER0		;nastavi prekinitve TIMER0
	BL	FIQON		;vkljuci prekinitve FIQ v ARM
	BL	VKLOP		;izpis in govor ob vklopu
	B	ZANKA		;glavna zanka programa
	LTORG

;*** Glavna zanka programa ***
ZANKA	BL	ADC		;povprecenje AD pretvornika
	BL	BCD		;pretvorba rezultata v desetisko obliko
	BL	IZPLCD		;izpis stevila na LCD
	BL	IZPUART		;desetiski rezultat na UART0
	LDR	R0,=MERITEV	;stolpec v drugi vrstici
	LDR	R3,[R0]
	MOV	R3,R3,LSR#1
	BL	STOLP
	BL	GVOLT		;govorni voltmeter
	B	ZANKA
	LTORG

;*** Povprecenje AD pretvornika *** (R0-3)
ADC	LDR	R2,=SKALA	;nastavi skalo za delilnik pred AD0.6
	MOV	R3,#0
ADC2	MOV	R0,#NADC	;izracunaj deljenje takta ADC0
	LDR	R1,=0x01203840	;START=001,PDN=1,CLKS=11,CLKDIV,SEL=6
	ORR	R1,R1,R0,LSL#8
	LDR	R0,=0xE0034000	;AD0CR
	STR	R1,[R0]
ADC1	LDR	R0,=0xE0034004	;AD0GDR cakaj konec pretvorbe
	LDR	R1,[R0]
	TST	R1,#0x80000000
	BEQ	ADC1
	MOV	R1,R1,LSL#16
	ADD	R3,R3,R1,LSR#22
	SUBS	R2,R2,#1
	BNE	ADC2
	MOV	R3,R3,LSR#9	;deljenje rezultata /512
	LDR	R0,=MERITEV
	STR	R3,[R0]
	MOV	PC,LR
	LTORG

;*** Pretvorba rezultata v desetisko obliko *** (R0-3)
BCD	STR	LR,[SP,#-4]!	;resi link
	LDR	R0,=MERITEV
	LDR	R3,[R0]
	MOV	R0,#10		;stotinke
	BL	NDELI
	LDR	R1,=CENTI
	STRB	R0,[R1]
	MOV	R0,#10		;desetinke
	BL	NDELI
	LDR	R1,=DECI
	STRB	R0,[R1]
	LDR	R1,=CELI	;celi del
	STRB	R3,[R1]
	MOV	R0,#10		;enice
	BL	NDELI
	LDR	R1,=ENICE
	STRB	R0,[R1]
	LDR	R1,=DEKA	;desetice
	STRB	R3,[R1]
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Nepredznaceno deljenje R3/R0=R3, ostanek v R0 *** (R0-3)
NDELI	MOVS	R1,R0		;prepreci deljenje z 0?
	MOVEQ	PC,LR
	MOV	R2,#1
	BMI	NDELI2
NDELI1	MOV	R2,R2,LSL#1	;enica delitelja v MSB
	MOVS	R1,R1,LSL#1
	BPL	NDELI1
NDELI2	MOV	R0,R3		;ostanek v R0
	MOV	R3,#0		;kvocient v R3
NDELI3	CMP	R0,R1
	SUBCS	R0,R0,R1
	ADDCS	R3,R3,R2
	MOV	R1,R1,LSR#1
	MOVS	R2,R2,LSR#1
	BNE	NDELI3
	MOV	PC,LR

;*** Izpis stevila na LCD *** (R0-1)
IZPLCD	STR	LR,[SP,#-4]!	;resi link
	MOV	R0,#0x85	;polozaj v prvi vrstici LCD
	BL	UKAZ
	LDR	R1,=DEKA	;desetice
	LDRB	R0,[R1]
	MOVS	R0,R0
	ADD	R0,R0,#"0"
	MOVEQ	R0,#" "
	BL	ZNAK
	LDR	R1,=ENICE	;enice
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	MOV	R0,#"."		;pika
	BL	ZNAK
	LDR	R1,=DECI	;desetinke
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	LDR	R1,=CENTI	;stotinke
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	MOV	R0,#"V"
	BL	ZNAK
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Desetiski rezultat na UART0 *** (R0-2, UART0 TX FIFO)
IZPUART	LDR	R2,=0xE000C000	;U0THR
	LDR	R1,=DEKA	;desetice
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	STRB	R0,[R2]
	LDR	R1,=ENICE	;enice
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	STRB	R0,[R2]
	MOV	R0,#"."		;pika
	STRB	R0,[R2]
	LDR	R1,=DECI	;desetinke
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	STRB	R0,[R2]
	LDR	R1,=CENTI	;stotinke
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	STRB	R0,[R2]
	MOV	R0,#"V"
	STRB	R0,[R2]
	MOV	R0,#13		;CR nova vrstica na UART0
	STRB	R0,[R2]
	MOV	R0,#10		;LF
	STRB	R0,[R2]
	MOV	PC,LR
	LTORG

;*** Govorni voltmeter *** (R0-3)
GVOLT	LDR	R0,=ZSTEVEC	;veljaven (ZSTEVEC)?
	LDRH	R1,[R0]
	MOVS	R1,R1
	MOVNE	PC,LR		;izhod med govorjenjem
	STR	LR,[SP,#-4]!	;resi link
	LDR	R0,=ZSTANJE	;stanje govora?
	LDRB	R1,[R0]
	MOVS	R1,R1		;stanje 0?
	BNE	GVOLT1
	LDR	R1,=CENTI	;shrani stotinke
	LDRB	R0,[R1]
	LDR	R1,=ZCENTI
	STRB	R0,[R1]
	LDR	R1,=DECI	;shrani desetinke
	LDRB	R0,[R1]
	LDR	R1,=ZDECI
	STRB	R0,[R1]
	LDR	R1,=CELI	;govori celi del
	LDRB	R3,[R1]
	BL	GOVOR
	LDR	R0,=ZSTANJE	;postavi stanje 1
	MOV	R1,#1
	STRB	R1,[R0]
	LDR	PC,[SP],#4	;povratek na link
GVOLT1	SUBS	R1,R1,#1	;stanje 1?
	BNE	GVOLT2
	MOV	R3,#32		;govori "cela"
	BL	GOVOR
	LDR	R0,=ZSTANJE	;postavi stanje 2
	MOV	R1,#2
	STRB	R1,[R0]
	LDR	PC,[SP],#4	;povratek na link
GVOLT2	SUBS	R1,R1,#1	;stanje 2?
	BNE	GVOLT3
	LDR	R0,=ZDECI	;govori desetinke
	LDRB	R3,[R0]
	BL	GOVOR
	LDR	R0,=ZSTANJE	;postavi stanje 3
	MOV	R1,#3
	STRB	R1,[R0]
	LDR	PC,[SP],#4	;povratek na link
GVOLT3	SUBS	R1,R1,#1	;stanje 3?
	BNE	GVOLT4
	LDR	R0,=ZCENTI	;govori stotinke
	LDRB	R3,[R0]
	BL	GOVOR
	LDR	R0,=ZSTANJE	;postavi stanje 4
	MOV	R1,#4
	STRB	R1,[R0]
	LDR	PC,[SP],#4	;povratek na link
GVOLT4	SUBS	R1,R1,#1	;stanje 4?
	BNE	GVOLT5
	MOV	R3,#33		;govori "volta"
	BL	GOVOR
	LDR	R0,=ZSTANJE	;postavi stanje 5
	MOV	R1,#5
	STRB	R1,[R0]
	LDR	PC,[SP],#4	;povratek na link
GVOLT5	LDR	R0,=ZSTANJE	;povecaj stanje za 1
	LDRB	R1,[R0]
	ADD	R1,R1,#1
	STRB	R1,[R0]
	CMP	R1,#9		;cakaj do stanja 9?
	LDRNE	PC,[SP],#4	;povratek na link
	MOV	R1,#0		;postavi stanje 0
	STRB	R1,[R0]
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Govorno sporocilo stevilka R3 *** (R0-3)
GOVOR	STR	LR,[SP,#-4]!	;resi link
	CMP	R3,#35		;preveri stevilko sporocila
	LDRCS	PC,[SP],#4	;povratek na link
	LDR	R0,=GOVOR2
	ADD	PC,R0,R3,LSL#2
GOVOR1	MOVS	R0,LR		;zacetek .WAV zapisa v R0
	LDREQ	PC,[SP],#4	;izhod za nicno sporocilo
	ADD	R0,R0,#46	;zacetek zvoka 32bit v (ZKAZALC)
	LDR	R1,=ZKAZALC
	STR	R0,[R1]
	LDRB	R1,[LR,#4]	;dolzina zvoka: dva bajta iz .WAV max 64kB
	LDRB	R2,[LR,#5]
	ADD	R1,R1,R2,LSL#8
	SUBS	R1,R1,#46	;odstej 30 bajtov glave
	MOVMI	R1,#0
	LDR	R0,=ZSTEVEC	;dolzina zvoka 16bit v (ZSTEVEC)
	STRH	R1,[R0]
	LDR	PC,[SP],#4	;povratek na link
	LTORG
GOVOR2	B	ZVOK0
	B	ZVOK1
	B	ZVOK2
	B	ZVOK3
	B	ZVOK4
	B	ZVOK5
	B	ZVOK6
	B	ZVOK7
	B	ZVOK8
	B	ZVOK9
	B	ZVOK10
	B	ZVOK11
	B	ZVOK12
	B	ZVOK13
	B	ZVOK14
	B	ZVOK15
	B	ZVOK16
	B	ZVOK17
	B	ZVOK18
	B	ZVOK19
	B	ZVOK20
	B	ZVOK21
	B	ZVOK22
	B	ZVOK23
	B	ZVOK24
	B	ZVOK25
	B	ZVOK26
	B	ZVOK27
	B	ZVOK28
	B	ZVOK29
	B	ZVOK30
	B	ZVOK31
	B	ZVOK32
	B	ZVOK33
	B	ZVOK34

;*** Govorni zapisi ZVOK0-34 *** (LR)
ZVOK0	BL	GOVOR1
	INCBIN	0.WAV
	ALIGN
ZVOK1	BL	GOVOR1
	INCBIN	1.WAV
	ALIGN
ZVOK2	BL	GOVOR1
	INCBIN	2.WAV
	ALIGN
ZVOK3	BL	GOVOR1
	INCBIN	3.WAV
	ALIGN
ZVOK4	BL	GOVOR1
	INCBIN	4.WAV
	ALIGN
ZVOK5	BL	GOVOR1
	INCBIN	5.WAV
	ALIGN
ZVOK6	BL	GOVOR1
	INCBIN	6.WAV
	ALIGN
ZVOK7	BL	GOVOR1
	INCBIN	7.WAV
	ALIGN
ZVOK8	BL	GOVOR1
	INCBIN	8.WAV
	ALIGN
ZVOK9	BL	GOVOR1
	INCBIN	9.WAV
	ALIGN
ZVOK10	BL	GOVOR1
	INCBIN	10.WAV
	ALIGN
ZVOK11	BL	GOVOR1
	INCBIN	11.WAV
	ALIGN
ZVOK12	BL	GOVOR1
	INCBIN	12.WAV
	ALIGN
ZVOK13	BL	GOVOR1
	INCBIN	13.WAV
	ALIGN
ZVOK14	BL	GOVOR1
	INCBIN	14.WAV
	ALIGN
ZVOK15	BL	GOVOR1
	INCBIN	15.WAV
	ALIGN
ZVOK16	BL	GOVOR1
	INCBIN	16.WAV
	ALIGN
ZVOK17	BL	GOVOR1
	INCBIN	17.WAV
	ALIGN
ZVOK18	BL	GOVOR1
	INCBIN	18.WAV
	ALIGN
ZVOK19	BL	GOVOR1
	INCBIN	19.WAV
	ALIGN
ZVOK20	BL	GOVOR1
	INCBIN	20.WAV
	ALIGN
ZVOK21	BL	GOVOR1
	INCBIN	21.WAV
	ALIGN
ZVOK22	BL	GOVOR1
	INCBIN	22.WAV
	ALIGN
ZVOK23	BL	GOVOR1
	INCBIN	23.WAV
	ALIGN
ZVOK24	BL	GOVOR1
	INCBIN	24.WAV
	ALIGN
ZVOK25	BL	GOVOR1
	INCBIN	25.WAV
	ALIGN
ZVOK26	BL	GOVOR1
	INCBIN	26.WAV
	ALIGN
ZVOK27	BL	GOVOR1
	INCBIN	27.WAV
	ALIGN
ZVOK28	BL	GOVOR1
	INCBIN	28.WAV
	ALIGN
ZVOK29	BL	GOVOR1
	INCBIN	29.WAV
	ALIGN
ZVOK30	BL	GOVOR1
	INCBIN	30.WAV
	ALIGN
ZVOK31	BL	GOVOR1
	INCBIN	31.WAV
	ALIGN
ZVOK32	BL	GOVOR1
	INCBIN	CELA.WAV
	ALIGN
ZVOK33	BL	GOVOR1
	INCBIN	VOLTA.WAV
	ALIGN
ZVOK34	BL	GOVOR1
	INCBIN	VOLTMETER.WAV
	ALIGN

;*** Konec delovanja zbirnika ARM ***
	END
