@*** Zgovorni voltmeter - zbirnik Gnu as,ld,objcopy - S53MV 12.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	SKALA,51200		@nastavi skalo za delilnik 20M/(2*3M3) pred AD0.7 !!!!!!!!!!!!!!!!!!!!!!!!!!!

@*** 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 - neuporabljen izhod
@P0.3.od/SDA0/MAT0.0/EINT1 - izhod za vklop/ tokovnega vira 1mA
@P0.4/SCK0/CAP0.1/AD0.6 - neuporabljen izhod
@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 - neuporabljen izhod
@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 kondenzatorja na slusalke/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-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 ***
.equ	SKLAD,	0x40000300	@navzdol -768byte
.equ	MERITEV,0x40000400	@dvojiski rezultat meritve (32bit)
.equ	CENTI,	0x40000404	@stotinke (8bit)
.equ	DECI,	0x40000405	@desetinke (8bit)
.equ	ENICE,	0x40000406	@enice (8bit)
.equ	DEKA,	0x40000407	@desetice (8bit)
.equ	CELI,	0x40000408	@celi del (8bit)
.equ	MINUS,	0x40000409	@predznak (8bit)
.equ	ZSTANJE,0x4000040A	@stanje govora (8bit)
.equ	ZCENTI,	0x4000040B	@stotinke zvok (8bit)
.equ	ZDECI,	0x4000040C	@desetinke zvok (8bit)

.equ	ZSTEVEC,0x4000040E	@stevec vzorcev v zapisu (16bit)
.equ	ZKAZALC,0x40000410	@kazalec vzorcev v zapisu (32bit)

@*** 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	PREKIN1
	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]
PREKIN1:
	MOV	R9,R8,LSL#8	@obdelaj bajt za DAC in nastavi glasnost
	mov	r9,r9,asr#2
	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.5=AD0.7 P0.6=AD1.0
	LDR	R1,=0x00003C05
	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
	MOV	R1,#0
	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:
.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 podcrtana
.byte	0x15,0x15,0x15,0x15,0x15,0x15,0x00,0x1F	@3=tricrtice podcrtana
.align


@*** Podcrtan stolpec v desno v drugi vrstici *** (R0-4)
STOLP:	STR	LR,[SP,#-4]!	@resi link
	LDR	R0,=MERITEV	@podatek
	LDR	R3,[R0]		
	MOVS	R3,R3,ASR#1	@predznaceno deljenje in absolutna vrednost
	RSBMI	R3,R3,#0
	LDR	R2,=INILCD2	@prekinjene crtice za negativno
	ADDMI	R2,R2,#6
	MOV	R4,#0
STOLP2:	ADD	R0,R4,#0x43	@set CGRAM address
	BL	UKAZ
	LDRB	R0,[R2],#8
	BL	ZNAK
	ADD	R4,R4,#8
	CMP	R4,#64		@prepisi 8 novih byte
	BCC	STOLP2

	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)
.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,#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:	.asciz	"Zgovorni V-meter"
VKLOP2:	.asciz	"S53MV 12.06.2019"
VKLOP3:	.asciz	"                "
.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	IZPLCD		@izpis stevila na LCD
	BL	IZPUART		@desetiski rezultat na UART0
	BL	STOLP		@stolpec v drugi vrstici
	BL	GVOLT		@govorni voltmeter
	B	ZANKA
.ltorg

@*** Povprecenje AD pretvornika *** (R0-4)
ADC:	LDR	R4,=SKALA	@stevilo zank povprecenja
	MOV	R3,#0
ADC1:	LDR	R0,=0xE0034000	@AD0CR za AD0.7
	LDR	R1,=0x01200C80	@START=001,PDN=1,CLKS=11,CLKDIV=13-1=0x0C,SEL=7=0x80
	STR	R1,[R0]
	LDR	R0,=0xE0060000	@AD1CR za AD1.0
	LDR	R1,=0x01200C01	@START=001,PDN=1,CLKS=11,CLKDIV=13-1=0x0C,SEL=0=0x01
	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
	MOV	R1,R1,LSL#16	@pristej pozitivno
	ADD	R3,R3,R1,LSR#22	
	MOV	R2,R2,LSL#16	@odstej negativno
	SUB	R3,R3,R2,LSR#22
	SUBS	R4,R4,#1	@zanka povprecenja
	BNE	ADC1
	MOV	R3,R3,ASR#15	@predznaceno deljenje rezultata /32768
	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]		@podatek
	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

@*** 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,=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
	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,=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]
	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 Gnu ***
.end
