@*** Zgovorni voltmeter - zbirnik Gnu as,ld,objcopy - S53MV 17.06.2019 ***

@*** Konstante mikrokrmilnika LPC2138/01 ***
.equ	KVARC,14745600		@frekvenca kristala (Hz)
.equ	CLK,KVARC*4		@frekvenca jedra ARM (brez PLL !!!)
.equ	PCLK,CLK		@frekvenca vhodno/izhodnih enot (APBDIV=1)
.equ	BAUD,PCLK/153600	@modulo deljenja UART za 9600bps*16
.equ	N1US,CLK/3000000	@konstanta cakanja T1US za HD44780
.equ	NZVOK,(PCLK+4000)/8000	@TIMER0 prekinitve 8kHz
.equ	ZGLAS,5			@zacetna glasnost govora (0...9)
.equ	MGOVOR,40		@stevilo govornih sporocil +1

@*** 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 - izhod za vklop/ tokovnega vira 1mA
@P0.3.od/SDA0/MAT0.0/EINT1 - neuporabljen izhod
@P0.4/SCK0/CAP0.1/AD0.6 - vhod voltmetra AD0.6 za negativne napetosti
@P0.5/MISO0/MAT0.1/AD0.7 -vhod voltmetra AD0.7 za pozitivne napetosti
@P0.6/MOSI0/CAP0.2/AD1.0 - vhod voltmetra AD1.0 za negativne napetosti
@P0.7/SSEL0/PWM2/EINT2 - neuporabljen izhod
@P0.8/TXD1/PWM4/AD1.1 - vhod voltmetra AD1.1 za pozitivne napetosti
@P0.9/RXD1/PWM6/EINT3 - neuporabljen izhod
@P0.10/RTS1/CAP1.0/AD1.2 - neuporabljen izhod
@P0.11.od/CTS1/CAP1.1/SCL1 - neuporabljen izhod
@P0.12/DSR1/MAT1.0/AD1.3 - neuporabljen izhod
@P0.13/DTR1/MAT1.1/AD1.4 - neuporabljen izhod
@P0.14.od/DCD1/EINT1/SDA1/BOOTLOADER(!) - vhod vezan na /RTS.FT231XS 
@P0.15/RI1/EINT2/AD1.5 - neuporabljen izhod
@P0.16-23 - digitalni izhodi za LCD D0-7.HD44780
@P0.24 - ne obstaja ***
@P0.25/AD0.4/AOUT - analogni izhod govora AOUT preko ojacevalnika na zvocnik 
@P0.26/AD0.5 - neuporabljen izhod
@P0.27/AD0.0/CAP0.1/MAT0.1 - neuporabljen izhod
@P0.28/AD0.1/CAP0.2/MAT0.2 - neuporabljen izhod
@P0.29/AD0.2/CAP0.3/MAT0.3 - neuporabljen izhod
@P0.30/AD0.3/EINT3/CAP0.0 - neuporabljen izhod
@P0.31(!) - nepovezan ***
@P1.0-15 - ne obstajajo ***
@P1.16 - pull-up vhod - tipka DESNO
@P1.17 - pull-up vhod - tipka DOL
@P1.18 - pull-up vhod - tipka GOR
@P1.19 - pull-up vhod - tipka LEVO
@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 ***
.equ	SKLAD,	0x40000300	@navzdol -768byte
.equ	CENTI,	0x40000400	@stotinke (8bit)
.equ	DECI,	0x40000401	@desetinke (8bit)
.equ	ENICE,	0x40000402	@enice (8bit)
.equ	DEKA,	0x40000403	@desetice (8bit)
.equ	CELI,	0x40000404	@celi del (8bit)
.equ	MINUS,	0x40000405	@predznak (8bit)
.equ	ZSTANJE,0x40000406	@stanje govora (8bit)
.equ	ZCENTI,	0x40000407	@stotinke zvok (8bit)
.equ	ZDECI,	0x40000408	@desetinke zvok (8bit)
.equ	ZCELI,	0x40000409	@celi del zvok (8bit)
.equ	ZSTEVEC,0x4000040A	@stevec vzorcev v zapisu (16bit)
.equ	ZKAZALC,0x4000040C	@kazalec vzorcev v zapisu (32bit)

.equ	VAVG,0x40000410		@povprecje meritve (32bit)
.equ	VMAX,0x40000414		@maksimum meritve (32bit)
.equ	VMIN,0x40000418		@minimum meritve (32bit)
.equ	VPP,0x4000041C		@vrhvrh meritve (32bit)
.equ	MERI,0x40000420	@stanje merilnika (8bit)
.equ	GLASNO,0x40000421	@glasnost (8bit)
.equ	PREKO,0x40000422	@prekoracitev (8bit)
.equ	ZPREKO,0x40000423	@prekoracitev zvok (8bit)
.equ	ZMERI,0x40000424	@stanje merilnika zvok (8bit)

@*** Ukazi za delovanje zbirnika Gnu ***
.text
.arm

@*** 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	PREKI1
	SUB	R10,R10,#1
	STRH	R10,[R9]
	LDR	R9,=ZKAZALC	@kazalec vzorcev v zapisu
	LDR	R10,[R9]
	LDRB	R8,[R10],#1	@bajt iz zapisa
	STR	R10,[R9]
PREKI1:	LDR	R9,=GLASNO	@obdelaj bajt za DAC in nastavi glasnost
	LDRB	R10,[R9]
	MOV	R9,R8,LSL R10
	MOV	R9,R9,LSR#1
	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

@*** Onemogoci zascito vsebine FLASH na naslovu 0x000001FC ***
.balign	512,0

@*** 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,=0x0010100A	@AD1,AD0,UART0,TIM0
	STR	R1,[R0]
	LDR	R0,=0xE01FC100	@APBDIV=1
	MOV	R1,#1
	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 P0.5=AD0.7 P0.6=AD1.0 P0.8=AD1.1
	LDR	R1,=0x00033F05
	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 0 razen P0.2 (vir izkloplnjen)
	MOV	R1,#4
	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]
	LDR	R0,=MERI	@zacetno stanje 0 meri Vavg
	MOV	R1,#0
	STRB	R1,[R0]
	LDR	R0,=GLASNO	@zacetna glasnost 5
	MOV	R1,#ZGLAS
	STRB	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
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** 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)
.balign	16,0
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,#39		@govor ob vklopu
	BL	GOVOR
	BL	T1S		@zakasnitev 1s
	MOV	R0,#0x80	@pobrisi prvo vrstico
	BL	UKAZ
	LDR	PC,[SP],#4	@povratek na link
.ltorg
VKLOP1:	.asciz	"Zgovorni V-meter"
VKLOP2:	.asciz	"S53MV 17.06.2019"
.align

@*** 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

@*** Podcrtan stolpec v desno v drugi vrstici *** (R0-4)
STOLP:	STR	LR,[SP,#-4]!	@resi link
	LDR	R0,=MERI	@izberi podatek
	LDRB	R1,[R0]
	LDR	R0,=VAVG
	CMP	R1,#1
	LDREQ	R0,=VMAX
	CMP	R1,#2
	LDREQ	R0,=VMIN
	CMP	R1,#3
	LDREQ	R0,=VPP
	LDR	R3,[R0]
	MOVEQ	R3,R3,ASR#1	@dvakratna skala za Vpp?
	MOVS	R3,R3,ASR#1	@predznaceno deljenje in absolutna vrednost
	RSBMI	R3,R3,#0
	LDR	R4,=STOLP3	@pripravi DDRAM glede na predznak
	LDRMI	R4,=STOLP4
	MOV	R0,#0x40	@set CGRAM address
	BL	UKAZ
	MOV	R2,#64		@prepisi 8 znakov = 64 bajtov
STOLP1:	LDRB	R0,[R4],#1
	BL	ZNAK
	SUBS	R2,R2,#1
	BNE	STOLP1
	MOV	R0,#0xC0	@set DDRAM address druga vrstica
	BL	UKAZ
	MOV	R2,#0
STOLP2:	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	STOLP2
	LDR	PC,[SP],#4	@povratek na link
.ltorg
STOLP3:
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04	@0=praznina
.byte	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x04	@1=enacrtica
.byte	0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x04	@2=dvecrtici
.byte	0x15,0x15,0x15,0x15,0x15,0x15,0x00,0x04	@3=tricrtice
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F	@0=praznina podcrtana
.byte	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x1F	@1=enacrtica podcrtana
.byte	0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x1F	@2=dvecrtici podcrtani
.byte	0x15,0x15,0x15,0x15,0x15,0x15,0x00,0x1F	@3=tricrtice podcrtane
STOLP4:
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04	@0=praznina
.byte	0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x04	@1=enklicaj
.byte	0x14,0x14,0x14,0x14,0x00,0x14,0x00,0x04	@2=dvaklicaja
.byte	0x15,0x15,0x15,0x15,0x00,0x15,0x00,0x04	@3=triklicaji
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B	@0=praznina podcrtana
.byte	0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x1B	@1=enklicaj podcrtan
.byte	0x14,0x14,0x14,0x14,0x00,0x14,0x00,0x1B	@2=dvaklicaja podcrtana
.byte	0x15,0x15,0x15,0x15,0x00,0x15,0x00,0x1B	@3=trikilicaji podcrtani
.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
	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	IZPOV		@izpisi prekoracitev ADC
	BL	IZPLCD		@izpis stevila na LCD
	BL	IZPTOK		@izpis tokovnega vira in glasnosti na LCD
	BL	IZPCOM		@desetiski rezultat na UART0
	BL	STOLP		@stolpec v drugi vrstici
	BL	GVOLT		@govorni voltmeter
	BL	TIPKE		@ukaz s tipk?
	BL	COM		@ukaz z UART0?
	B	ZANKA
.ltorg

@*** Ukaz s tipk *** (R0-2)
TIPKE:	LDR	R0,=0x3FFFC036	@FIO1PIN2
	LDRB	R1,[R0]
	LDR	R2,=MERI	@postavi stanje meritve
	LDRB	R0,[R2]
	TST	R1,#8		@stanje 0 meri Vavg? (levo)?
	MOVEQ	R0,#0
	TST	R1,#4		@stanje 1 meri Vmax? (gor)?
	MOVEQ	R0,#1
	TST	R1,#2		@stanje 2 meri Vmin (dol)?
	MOVEQ	R0,#2
	TST	R1,#1		@stanje 3 meri Vpp (desno)?
	MOVEQ	R0,#3
	STRB	R0,[R2]
	MOV	R0,#4		@izklop tokovnega vira P0.2 (levo+dol)?
	LDR	R2,=0x3FFFC018	@FIO0SET0
	TST	R1,#10
	STREQB	R0,[R2]
	MOV	R0,#4		@vklop tokovnega vira P0.2 (levo+gor)?
	LDR	R2,=0x3FFFC01C	@FIO0CLR0
	TST	R1,#12
	STREQB	R0,[R2]
	LDR	R2,=GLASNO	@nastavi glasnost
	LDRB	R0,[R2]
	TST	R1,#5		@glasneje (desno+gor)?
	ADDEQ	R0,R0,#1
	TST	R1,#3		@utisaj (desno+dol)?
	SUBEQ	R0,R0,#1
	MOVS	R0,R0		@preveri spodnjo mejo?
	MOVMI	R0,#0
	CMP	R0,#10		@preveri gornjo mejo?
	MOVPL	R0,#9
	STRB	R0,[R2]
	MOV	PC,LR
.ltorg

@*** Ukaz z UART0 *** (R0-2)
COM:	LDR	R0,=0xE000C014	@U0LSR nov znak?
	LDRB	R1,[R0]
	TST	R1,#1		@DR=?
	MOVEQ	PC,LR
	LDR	R0,=0xE000C000	@U0RBR precitaj prispeli znak
	LDRB	R1,[R0]
	AND	R1,R1,#127	@porezi v ASCII 7bit
	CMP	R1,#96		@male crke v velike?
	SUBPL	R1,R1,#32
	LDR	R2,=MERI	@postavi stanje meritve
	MOV	R0,#0		@stanje 0 meri Vavg? (V)?
	CMP	R1,#'V'
	STREQB	R0,[R2]
	MOV	R0,#1		@stanje 1 meri Vmax? (P)?
	CMP	R1,#'P'
	STREQB	R0,[R2]
	MOV	R0,#2		@stanje 2 meri Vmin? (M)?
	CMP	R1,#'M'
	STREQB	R0,[R2]
	MOV	R0,#3		@stanje 3 meri Vpp? (D)?
	CMP	R1,#'D'
	STREQB	R0,[R2]
	MOV	R0,#4		@vklop tokovnega vira P0.2 (I)?
	LDR	R2,=0x3FFFC01C	@FIO0CLR0
	CMP	R1,#'I'
	STREQB	R0,[R2]
	MOV	R0,#4		@izklop tokovnega vira P0.2 (H)?
	LDR	R2,=0x3FFFC018	@FIO0SET0
	CMP	R1,#'H'
	STREQB	R0,[R2]
	SUBS	R1,R1,#'0'	@nastavi glasnost (0...9)?
	MOVMI	PC,LR
	CMP	R1,#10
	MOVPL	PC,LR
	LDR	R0,=GLASNO
	STRB	R1,[R0]
	MOV	PC,LR
.ltorg

@*** Povprecenje AD pretvornikov *** (R0-7)
.balign	16,0
ADC:	MOV	R4,#49152	@stevilo zank povprecenja 49152=32768*1.5
	MOV	R3,#0		@zacetno povprecje v R3
	MOV	R5,#4096	@zacetni minimum v R5
	RSB	R6,R5,#0	@zacetni maksimum v R6
	MOV	R7,#0		@zacetne prekoracitve
ADC1:	LDR	R0,=0xE0034000	@AD0CR za AD0.7 in AD0.6
	TST	R4,#1
	LDREQ	R1,=0x00200C80	@START=000,PDN=1,CLKS=11,CLKDIV=13-1=0x0C,SEL=7=0x80
	LDRNE	R1,=0x00200C40	@START=000,PDN=1,CLKS=11,CLKDIV=13-1=0x0C,SEL=6=0x40
	STR	R1,[R0]
	LDR	R0,=0xE0060000	@AD1CR za AD1.0 in AD1.1
	TST	R4,#1
	LDREQ	R1,=0x00200C01	@START=000,PDN=1,CLKS=11,CLKDIV=13-1=0x0C,SEL=0=0x01
	LDRNE	R1,=0x00200C02	@START=000,PDN=1,CLKS=11,CLKDIV=13-1=0x0C,SEL=1=0x02
	STR	R1,[R0]
	LDR	R0,=0xE0034008	@ADGSR istocasni skupni start obeh ADC
	LDR	R1,=0x01000000
	STR	R1,[R0]
ADC2:	LDR	R0,=0xE0034004	@AD0GDR cakaj konec pretvorbe
	LDR	R1,[R0]
	TST	R1,#0x80000000
	BEQ	ADC2
ADC3:	LDR	R0,=0xE0060004	@AD1GDR cakaj konec pretvorbe
	LDR	R2,[R0]
	TST	R2,#0x80000000
	BEQ	ADC3
	TST	R4,#1		@zamenjaj med sabo lihe?
	MOVNE	R0,R1
	MOVNE	R1,R2
	MOVNE	R2,R0
	MOV	R1,R1,LSL#16	@ocisti pozitivno
	MOV	R1,R1,LSR#22	
	MOV	R2,R2,LSL#16	@ocisti negativno
	MOV	R2,R2,LSR#22
	LDR	R0,=1023	@zabelezi prekoracitve
	CMP	R1,R0
	ORRPL	R7,R7,#1
	CMP	R2,R0
	ORRPL	R7,R7,#2
	SUB	R1,R1,R2	@skupni rezultat meritve v R1
	ADD	R3,R3,R1	@pristej povprecju
	CMP	R5,R1		@isci nov minimum?
	MOVPL	R5,R1
	CMP	R6,R1		@isci nov maksimum?
	MOVMI	R6,R1
	SUBS	R4,R4,#1	@zanka povprecenja
	BNE	ADC1
	ADD	R1,R3,#16384	@zaokroženo predznaceno deljenje povprecja /32768
	MOV	R1,R1,ASR#15
	LDR	R0,=VAVG
	STR	R1,[R0]
	ADD	R1,R5,R5,ASR#1	@pomnozi minimum z 1.5 in shrani
	LDR	R0,=VMIN	
	STR	R1,[R0]
	ADD	R1,R6,R6,ASR#1	@pomnozi maksimum z 1.5 in shrani
	LDR	R0,=VMAX	
	STR	R1,[R0]
	SUB	R1,R6,R5	@pomnozi razliko z 1.5 in shrani
	ADD	R1,R1,R1,ASR#1
	LDR	R0,=VPP
	STR	R1,[R0]
	LDR	R0,=PREKO	@shrani prekoracitev
	STRB	R7,[R0]
	MOV	PC,LR
.ltorg

@*** Pretvorba rezultata v desetisko obliko *** (R0-3)
BCD:	STR	LR,[SP,#-4]!	@resi link
	LDR	R0,=MERI	@izberi podatek
	LDRB	R1,[R0]
	LDR	R0,=VAVG
	CMP	R1,#1
	LDREQ	R0,=VMAX
	CMP	R1,#2
	LDREQ	R0,=VMIN
	CMP	R1,#3
	LDREQ	R0,=VPP
	LDR	R3,[R0]
	MOV	R0,#0		@predznak
	MOVS	R3,R3
	MOVMI	R0,#-1
	RSBMI	R3,R3,#0	@absolutna vrednost
	LDR	R1,=MINUS
	STRB	R0,[R1]
	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

@*** Izpisi prekoracitev ADC *** (R0-3)
IZPOV:	STR	LR,[SP,#-4]!	@resi link
	MOV	R0,#0x80	@polozaj v prvi vrstici LCD
	BL	UKAZ
	LDR	R0,=PREKO	@prekoracitev
	LDRB	R2,[R0]
	LDR	R3,=IZPOV1	@brez prekoracitev
	CMP	R2,#1		@prekoracen VMAX?
	LDREQ	R3,=IZPOV2
	CMP	R2,#2		@prekoracen MIN?
	LDREQ	R3,=IZPOV3
	CMP	R2,#3		@prekoracena oba?
	LDREQ	R3,=IZPOV4
	BL	BESEDA		@Besedilo iz [R3] v HD44780, zakljuceno z 0
	LDR	PC,[SP],#4	@povratek na link
.ltorg
IZPOV1:	.asciz	"   "
IZPOV2:	.asciz	"^^^"
IZPOV3:	.asciz	"vvv"
IZPOV4:	.asciz	"***"
.align

@*** Izpis stevila na LCD *** (R0-3)
IZPLCD:	STR	LR,[SP,#-4]!	@resi link
	MOV	R0,#0x83	@polozaj v prvi vrstici LCD
	BL	UKAZ
	LDR	R1,=MINUS	@predznak
	LDRB	R0,[R1]
	MOVS	R0,R0
	MOV	R0,#' '
	MOVNE	R0,#'-'
	LDR	R1,=DEKA	@desetice
	LDRB	R2,[R1]
	MOVS	R2,R2
	BEQ	IZPLC1		@predznak in nenicelne desetice
	BL	ZNAK
	ADD	R0,R2,#'0'
	BL	ZNAK
	B	IZPLC2
IZPLC1:	MOV	R2,R0		@presledek in predznak
	MOV	R0,#' '
	BL	ZNAK
	MOV	R0,R2
	BL	ZNAK
IZPLC2:	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
	LDR	R0,=MERI	@merske enote
	LDRB	R1,[R0]
	LDR	R3,=IZPLC3
	CMP	R1,#1
	LDREQ	R3,=IZPLC4
	CMP	R1,#2
	LDREQ	R3,=IZPLC5
	CMP	R1,#3
	LDREQ	R3,=IZPLC6
	BL	BESEDA		@Besedilo iz [R3] v HD44780, zakljuceno z 0
	LDR	PC,[SP],#4	@povratek na link
.ltorg
IZPLC3:	.asciz	"=V= "
IZPLC4:	.asciz	"^V^ "
IZPLC5:	.asciz	"vVv "
IZPLC6:	.asciz	"^Vv "
.align

@*** Izpis tokovnega vira in glasnosti na LCD *** (R0-2)
IZPTOK:	STR	LR,[SP,#-4]!	@resi link
	MOV	R0,#0x8D	@polozaj v prvi vrstici LCD
	BL	UKAZ
	MOV	R0,#' '
	LDR	R2,=0x3FFFC014	@FIO0PIN0
	LDRB	R1,[R2]
	TST	R1,#4		@tokovni vir P0.2=?
	MOVEQ	R0,#'I'
	BL	ZNAK
	MOV	R0,#' '		@presledek
	BL	ZNAK
	LDR	R2,=GLASNO	@glasnost
	LDRB	R0,[R2]
	ADD	R0,R0,#'0'
	BL	ZNAK
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Desetiski rezultat na UART0 *** (R0-2, UART0 TX FIFO)
IZPCOM:	LDR	R2,=0xE000C000	@U0THR
	LDR	R1,=PREKO	@prekoracitev
	LDRB	R0,[R1]
	ADD	R0,R0,#'0'
	STRB	R0,[R2]
	LDR	R1,=MINUS	@predznak
	LDRB	R0,[R1]
	MOVS	R0,R0
	MOV	R0,#' '
	MOVNE	R0,#'-'
	STRB	R0,[R2]
	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]
	LDR	R0,=MERI	@stanje
	LDRB	R1,[R0]
	MOV	R0,#'V'
	CMP	R1,#1
	MOVEQ	R0,#'P'
	CMP	R1,#2
	MOVEQ	R0,#'M'
	CMP	R1,#3
	MOVEQ	R0,#'D'
	STRB	R0,[R2]
	LDR	R0,=0x3FFFC014	@FIO0PIN0 tokovni vir P0.2=?
	LDRB	R1,[R0]
	MOV	R0,#'H'
	TST	R1,#4
	MOVEQ	R0,#'I'
	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]
	ADD	R2,R1,#1	@naslednje stanje
	STRB	R2,[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	@shrani celi del
	LDRB	R0,[R1]
	LDR	R1,=ZCELI
	STRB	R0,[R1]
	LDR	R1,=PREKO	@shrani prekoracitev
	LDRB	R0,[R1]
	LDR	R1,=ZPREKO
	STRB	R0,[R1]
	LDR	R1,=MERI	@shrani stanje
	LDRB	R0,[R1]
	LDR	R1,=ZMERI
	STRB	R0,[R1]
	LDR	R1,=MINUS	@govori predznak
	LDRB	R0,[R1]
	MOV	R3,#33
	MOVS	R0,R0
	BLNE	GOVOR
	LDR	PC,[SP],#4	@povratek na link
GVOLT1:	SUBS	R1,R1,#1	@stanje 1?
	BNE	GVOLT2
	LDR	R0,=ZCELI	@govori celi del
	LDRB	R3,[R0]
	BL	GOVOR
	LDR	PC,[SP],#4	@povratek na link
GVOLT2:	SUBS	R1,R1,#1	@stanje 2?
	BNE	GVOLT3
	MOV	R3,#32		@govori "cela"
	BL	GOVOR
	LDR	PC,[SP],#4	@povratek na link
GVOLT3:	SUBS	R1,R1,#1	@stanje 3?
	BNE	GVOLT4
	LDR	R0,=ZDECI	@govori desetinke
	LDRB	R3,[R0]
	BL	GOVOR
	LDR	PC,[SP],#4	@povratek na link
GVOLT4:	SUBS	R1,R1,#1	@stanje 4?
	BNE	GVOLT5
	LDR	R0,=ZCENTI	@govori stotinke
	LDRB	R3,[R0]
	BL	GOVOR
	LDR	PC,[SP],#4	@povratek na link
GVOLT5:	SUBS	R1,R1,#1	@stanje 5?
	BNE	GVOLT6
	LDR	R0,=ZMERI	@govori stanje 0="volta",1="maks",2="min",3="vrhvrh"
	LDRB	R3,[R0]
	ADD	R3,R3,#34
	BL	GOVOR
	LDR	PC,[SP],#4	@povratek na link
GVOLT6:	SUBS	R1,R1,#1	@stanje 6?
	BNE	GVOLT7
	LDR	R0,=ZPREKO	@govori prekoračitev?
	LDRB	R1,[R0]
	MOV	R3,#38
	MOVS	R1,R1
	BLNE	GOVOR
	LDR	PC,[SP],#4	@povratek na link
GVOLT7:	LDR	R0,=ZSTANJE	@postavi stanje 0!
	MOV	R1,#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,#MGOVOR	@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
	B	ZVOK35
	B	ZVOK36
	B	ZVOK37
	B	ZVOK38
	B	ZVOK39

@*** Govorni zapisi ZVOK0-35 *** (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	"minus.wav"
.align
ZVOK34:	BL	GOVOR1
.incbin	"volta.wav"
.align
ZVOK35:	BL	GOVOR1
.incbin	"maks.wav"
.align
ZVOK36:	BL	GOVOR1
.incbin	"min.wav"
.align
ZVOK37:	BL	GOVOR1
.incbin	"vrhvrh.wav"
.align
ZVOK38:	BL	GOVOR1
.incbin	"preko.wav"
.align
ZVOK39:	BL	GOVOR1
.incbin	"voltmeter.wav"
.align

@*** Konec delovanja zbirnika Gnu ***
.end
