@*** Visokofrekvencni vir ADF4351+HMC273 - S53MV 21.04.2017 ***

@*** Konstante mikrokrmilnika LPC2138/01 ***
.equ	KVARC,14745600		@frekvenca kristala (Hz)
.equ	CLK,KVARC*4		@frekvenca jedra ARM (PLL)
.equ	CCLKKHZ,CLK/1000	@frekvenca jedra ARM (PLL) v kHz
.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	ZMIGA,0x40		@perioda utripanja (mora biti 2^N)
.equ	PSTANJE,ZMIGA*3		@perioda oddajanja stanja (ZMIGA*(2N+1))
.equ	WSTANJE,PSTANJE*5	@cakanje oddaje stanja po sprejetem znaku
.equ	CLKNCO,1228800		@frekvenca ure NCO modulacije
.equ	NTIMER,PCLK/CLKNCO	@modulo deljenja TIMER0
.equ	FFNCO,65536*65536*NTIMER/PCLK	@faktor frekvence NCO

@*** Daljinski ukazi 9600bps, no parity, 1 stop bit ***
@	A xxx <enter>		... nastavi jakost signala [+/-dBm]
@	F xxxxxxx <enter>	... nastavi frekvenco [kHz]
@	M xxxxx <enter>		... nastavi frekvenco modulacije [Hz] 0=CW
@	P 123456789 <enter>	... vpiši vse nastavitve v FLASH
@	R <enter>		... resetiraj izvor
@	S x <enter>		... izberi spomin [0..9]

@*** 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 - izhod slabilec 1dB.HMC273
@P0.5/MISO0/MAT0.1/AD0.7 - izhod slabilec 2dB.HMC273
@P0.6/MOSI0/CAP0.2/AD1.0 - izhod slabilec 4dB.HMC273
@P0.7/SSEL0/PWM2/EINT2 - izhod slabilec 8dB.HMC273
@P0.8/TXD1/PWM4/AD1.1 - izhod slabilec 16dB.HMC273
@P0.9/RXD1/PWM6/EINT3 - izhod ON/OFF modulacija PDB.ADF4351
@P0.10/RTS1/CAP1.0/AD1.2 - izhod SPI CLK.ADF4351
@P0.11.od/CTS1/CAP1.1/SCL1 - vhod LOCK MUXOUT.ADF4351
@P0.12/DSR1/MAT1.0/AD1.3 - izhod SPI LE.ADF4351
@P0.13/DTR1/MAT1.1/AD1.4 - izhod SPI DATA.ADF4351
@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 -
@P0.26/AD0.5 -
@P0.27/AD0.0/CAP0.1/MAT0.1 -
@P0.28/AD0.1/CAP0.2/MAT0.2 - izhod ON/OFF modulacija
@P0.29/AD0.2/CAP0.3/MAT0.3 - izhod ON/OFF modulacija
@P0.30/AD0.3/EINT3/CAP0.0 - izhod ON/OFF modulacija
@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,0x40000100	@sklad raste navzdol -256byte

.equ	TABELA,0x40000200	@tabela parametrov z resetom (256byte)
.equ	ZNACKA,0x40000200	@znacka na zaslonu
.equ	UTRIP,0x40000204	@stevec utripanja
.equ	KAZALO,0x40000208	@kazalec na velicino
.equ	TIPKES,0x4000020C	@stare tipke
.equ	PREMIK,0x40000210	@premik parametra
.equ	SPOMIN,0x40000214	@stevilka spomina nastavitve
.equ	SFREKV,0x40000218	@stara frekvenca
.equ	SMODUL,0x4000021C	@stara modulacija
.equ	TXVHOD,0x40000220	@vhodni kazalec RS232 oddajnika
.equ	TXIZHOD,0x40000224	@izhodni kazalec RS232 oddajnika
.equ	NSTANJE,0x40000228	@stevec oddaje stanja
.equ	DALJKAZ,0x4000022C	@kazalec daljinca

.equ	ZASLON,0x40000300	@vsebina zaslona (32byte)

.equ	DALJIN,0x40000400	@pomnilnik daljinca (256byte)

.equ	NRAM,0x40000600		@naslov nastavitev (10*4*32bit)

.equ	IAPCMD,0x40000800	@ukaz IAP
.equ	IAPRES,0x40000880	@rezultat IAP

.equ	TXBUF,0x40000C00	@RS232 oddajni vmesnik (1024byte)

@*** 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
@*** NCO v prekinitvi FIQ *** (R8-13.FIQ)
	ADDS	R8,R8,R9	@povecaj akumulator R8
	STRPL	R11,[R10,#0x18]	@FIO0SET postavi enice na izbrane izhode
	STRMI	R11,[R10,#0x1C]	@FIO0CLR postavi nicle na izbrane izhode
	STRB	R13,[R12]	@T0IR=0xFF reset zahtev TIMER0
	SUBS	PC,LR,#4	@izhod iz prekinitve FIQ

@*** Pocisti pomnilnik do nevarne lokacije 0x000001FC ***
.balign	512,0

@*** Vkljuci in nastavi prekinitve FIQ *** (R0-4)
FIQON:	STR	LR,[SP,#-4]!	@resi link
	LDR	R1,=SPOMIN	@preveri frekvenco modulacije
	LDR	R0,[R1]
	LDR	R2,=NRAM
	ADD	R2,R2,R0,LSL#4
	LDR	R4,[R2,#8]
	MOVS	R4,R4
	MOVMI	R4,#0
	LDR	R0,=49999
	CMP	R4,R0
	MOVCS	R4,R0
	STR	R4,[R2,#8]
	MOVS	R4,R4		@frekvenca 0 brez modulacije?
	BNE	FIQON1
	BL	FIQOFF		@izkljuci prekinitve
	LDR	R0,=0x70000200	@izhodi P0.9 in P0.28-30
	LDR	R1,=0x3FFFC018	@FIO0SET
	STR	R0,[R1]
	LDR	PC,[SP],#4	@izhod brez modulacije
FIQON1:	LDR	R2,=SMODUL	@sprememba modulacije?
	LDR	R0,[R2]
	STR	R4,[R2]
	CMP	R4,R0		@izhod brez spremeb?
	LDREQ	PC,[SP],#4
	LDR	R3,=PCLK	@izracunaj faktor NCO
	LDR	R0,=NTIMER
	BL	NDELI
	MOV	R0,R3
	MOV	R3,#-1
	BL	NDELI
	MUL	R2,R3,R4	@pomnozi frekvenco modulacije
	MRS	R0,CPSR		@preberi CPSR
	BIC	R1,R0,#0x0E	@nastavi način FIQ
	ORR	R1,R1,#0x40	@izkljuci prekinitve FIQ
	MSR	CPSR_c,R1	@popravi CPSR
	MOV	R9,R2		@nastavi frekvenco NCO
	LDR	R10,=0x3FFFC000	@FIO0xxx
	LDR	R11,=0x70000200	@izhodi P0.9 in P0.28-30
	LDR	R12,=0xE0004000	@T0IR=0xFF reset zahtev TIMER0
	MOV	R13,#-1
	BIC	R0,R0,#0x40	@vkljuci prekinitve FIQ in vrni stanje
	MSR	CPSR_c,R0	@popravi CPSR
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Izkljuci prekinitve FIQ *** (R0-1)
FIQOFF:	LDR	R1,=SMODUL	@neveljavna modulacija
	MOV	R0,#-1
	STR	R0,[R1]
	MRS	R0,CPSR		@preberi CPSR
	ORR	R0,R0,#0x40	@izkljuci prekinitve FIQ
	MSR	CPSR_c,R0	@popravi CPSR
	MOV	PC,LR
.ltorg

@*** Nastavi prekinitve TIMER0 *** (R0-1)
TIMER0:	LDR	R0,=0xE0004018	@T0MR0=NTIMER-1
	LDR	R1,=NTIMER
	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 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,=0x0000000A	@UART0,TIMER0
	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 *** (R0-1)
GPIO:	LDR	R0,=0xE002C000	@PINSEL0 P0.0-1=UART0
	LDR	R1,=0x00000005
	STR	R1,[R0]
	LDR	R0,=0xE002C004	@PINSEL1
	LDR	R1,=0x00000000
	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.10, 0.12-0.13, 0.15-0.31
	LDR	R1,=0xFFFFB7FF
	STR	R1,[R0]
	LDR	R0,=0x3FFFC020	@FIO1DIR izhodi 1.20-1.31
	LDR	R1,=0xFFF00000
	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

@*** Oddaja znakov iz vmesnika na UART0 *** (R0-4)
ODDAJ:	LDR	R1,=0xE000C014	@U0LSR
	LDR	R0,[R1]
	TST	R0,#0x20
	MOVEQ	PC,LR		@izhod THRE zaseden
	LDR	R3,=TXIZHOD	@izhodni kazalec
	LDR	R1,[R3]
	LDR	R0,=TXVHOD	@vhodni kazalec
	LDR	R4,[R0]
	MOV	R5,#16		@16byte TX FIFO
ODDAJ1:	CMP	R1,R4		@nov(i) znak(i) v oddajnem vmesniku?
	MOVEQ	PC,LR		@izhod brez novosti
	LDR	R2,=TXBUF	@znak iz vmesnika
	LDRB	R0,[R2,R1]
	LDR	R2,=0xE000C000	@U0THR znak na UART0
	STRB	R0,[R2]
	ADD	R1,R1,#1	@povecaj in preveri izhodni kazalec
	CMP	R1,#1024
	MOVCS	R1,#0
	STR	R1,[R3]
	SUBS	R5,R5,#1	@stevec znakov v FIFO
	BNE	ODDAJ1
	MOV	PC,LR		@izhod poln FIFO
.ltorg

@*** Znak R0 v oddajni vmesnik brez nadzora! *** (R0-3)
VMES:	LDR	R3,=TXVHOD	@vhodni kazalec
	LDR	R1,[R3]
	LDR	R2,=TXBUF	@znak v vmesnika
	STRB	R0,[R2,R1]
	ADD	R1,R1,#1	@povecaj in preveri vhodni kazalec
	CMP	R1,#1024
	MOVCS	R1,#0
	STR	R1,[R3]
	MOV	PC,LR
.ltorg

@*** Postavi registre ADF4351 za REF=32.000MHz *** (R0-5)
SETADF:	LDR	R1,=SPOMIN	@preveri frekvenco
	LDR	R0,[R1]
	LDR	R2,=NRAM
	ADD	R2,R2,R0,LSL#4
	LDR	R3,[R2]
	MOVS	R3,R3
	MOVMI	R3,#0
	LDR	R0,=4999999	@MAX 4999.999MHz
	CMP	R3,R0
	MOVCS	R3,R0
	STR	R3,[R2]
	LDR	R1,=SFREKV	@sprememba frekvence?
	LDR	R0,[R1]
	STR	R3,[R1]
	LDR	R1,=0x3FFFC015	@FIO0PIN1 uklenitev PLL?
	LDRB	R2,[R1]
	TST	R2,#8
	ADDEQ	R0,R3,#1	@neveljavna frekvenca brez uklenitve!
	CMP	R3,R0		@izhod brez spremeb
	MOVEQ	PC,LR
	STR	LR,[SP,#-4]!	@resi link
	MOV	R3,R3,LSL#3	@pomnozi frekvenco z 8
	MOV	R4,#6		@zacetni modulo deljenja /64
	LDR	R2,=550000
SETAD1:	CMP	R3,R2
	BCC	SETAD2
	MOV	R3,R3,LSR#1
	SUBS	R4,R4,#1
	BNE	SETAD1
SETAD2:	MOV	R0,#4000	@izracunaj INT in FRAC
	BL	NDELI
	MOV	R5,R3,LSL#15	@dodaj INT v R5
	ORR	R5,R5,R0,LSL#3	@dodaj FRAC v R5
	LDR	R3,=0x00580005	@register5: LD=01
	BL	WSPI
	LDR	R3,=0x008FE03C	@register4: FB=1,BSCD=254=0xFE,VPD=0,MTLD=0,AOS=0,AOE=0,AOP=00,ROE=1,OP=11
	ORR	R3,R3,R4,LSL#20	@dodaj RF DIVIDER SELECT
	BL	WSPI
	LDR	R3,=0x00800003	@register3: BSCM=1,ABP=0,CC=0,CSR=0,CDM=00,CDV=000000000000
	BL	WSPI
	LDR	R3,=0x78006642	@register2: NM=11,MUXOUT=110,RD=0,RDIV2=0,R=0000000001,DB=1,CPCS=0011,LDF=0,LDP=0,PDP=1,PD=0,CPTS=0,CR=0
	BL	WSPI
	LDR	R3,=0x0000FD01	@register1: PA=0,PV=000000000001,MOD=4000=0xFA0=111110100000
	LDR	R2,=0x00320000	@dodaj mejo za preskaler 4/5>8/9 (0x32=50=3.2GHz)
	CMP	R5,R2
	ORRCS	R3,R3,#0x08000000
	BL	WSPI
	MOV	R3,R5		@register0: vstavi INT,FRAC
	BL	WSPI
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** 32-bitni ukaz iz R3 na SPI *** (R0-3)
WSPI:	STR	LR,[SP,#-4]!	@resi link
	MOV	R2,#32
WSPI1:	ADDS	R3,R3,R3	@pomikalni register podatkov
	LDRCS	R0,=0x3FFFC019	@FIO0SET1
	LDRCC	R0,=0x3FFFC01D	@FIO0CLR1
	MOV	R1,#32		@P0.13=DATA
	STRB	R1,[R0]
	BL	T1US
	LDR	R0,=0x3FFFC019	@FIO0SET1 impulz CLK
	MOV	R1,#4		@P0.10=CLK
	STRB	R1,[R0]
	BL	T1US
	LDR	R0,=0x3FFFC01D	@FIO0CLR1
	MOV	R1,#4		@P0.10=CLK
	STRB	R1,[R0]
	SUBS	R2,R2,#1	@zanka 32 bitov
	BNE	WSPI1
	BL	T1US
	LDR	R0,=0x3FFFC019	@FIO0SET1 impulz LE
	MOV	R1,#16		@P0.12=LE
	STRB	R1,[R0]
	BL	T1US
	LDR	R0,=0x3FFFC01D	@FIO0CLR1
	MOV	R1,#16		@P0.12=LE
	STRB	R1,[R0]
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Postavi slabilec HMC273 *** (R0-4)
SETHMC:	STR	LR,[SP,#-4]!	@resi link
	LDR	R1,=SPOMIN	@naslov frekvence in jakosti v R4
	LDR	R0,[R1]
	LDR	R4,=NRAM
	ADD	R4,R4,R0,LSL#4
	LDR	R3,[R4]		@polozaj popravka (frekvenca) v R3
	LDR	R0,=100000
	BL	NDELI
	LDR	R2,=AMIN	@MIN v R1
	LDRSB	R1,[R2,R3]
	LDR	R2,=AMAX	@MAX-MIN v R0
	LDRSB	R0,[R2,R3]
	SUB	R0,R0,R1
	LDR	R2,[R4,#4]	@preveri jakost
	SUBS	R2,R2,R1
	MOVMI	R2,#0
	CMP	R2,R0
	MOVCS	R2,R0
	ADD	R3,R2,R1
	STR	R3,[R4,#4]
	MOV	R1,#31		@nastavitev slabilca v R3
	MUL	R3,R2,R1
	BL	NDELI
	MOV	R2,#0x01F0	@omejitev 5 bitov P0.4-8
	AND	R3,R2,R3,LSL#4
	LDR	R1,=0x3FFFC014	@FIO0PINL 16(half-word)
	LDRH	R0,[R1]
	BIC	R0,R0,R2
	ORR	R0,R0,R3
	STRH	R0,[R1]
	LDR	PC,[SP],#4	@povratek na link
.ltorg
AMIN:	@tabela popravkov jakosti s korakom 100MHz za ADF4351+GALI5+HMC273
.byte	-4,-7,-10,-11,-12,-12,-13,-13,-14,-14	@0MHz-900MHz
.byte	-14,-15,-15,-15,-15,-15,-15,-15,-15,-15	@1000MHz-1900MHz
.byte	-15,-15,-16,-16,-17,-17,-17,-18,-19,-19	@2000MHz-2900MHz
.byte	-20,-20,-21,-21,-22,-22,-23,-23,-23,-23	@3000MHz-3900MHz
.byte	-23,-24,-25,-26,-26,-26,-26,-26,-26,-26	@4000MHz-4900MHz
AMAX:
.byte	14,18,18,18,18,18,18,18,17,17	@0MHz-900MHz
.byte	17,16,16,16,17,17,16,16,16,16	@1000MHz-1900MHz
.byte	16,16,15,15,15,14,14,13,12,12	@2000MHz-2900MHz
.byte	11,11,11,10,10,9,8,9,9,8	@3000MHz-3900MHz
.byte	8,8,7,7,6,6,6,6,6,6		@4000MHz-4900MHz
.align

@*** 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 znakov = 64 bajtov
	LDR	R3,=INILC2
INILC1:	LDRB	R0,[R3],#1
	BL	ZNAK
	SUBS	R2,R2,#1
	BNE	INILC1
	MOV	R0,#0x80	@set DDRAM address zacetek prve vrstice
	BL	UKAZ
	LDR	PC,[SP],#4	@povratek na link
.ltorg
INILC2:	@tabela dodatnih znakov za LCD
.byte	0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x00	@0=sahovnica
.byte	0x1F,0x0E,0x04,0x00,0x04,0x0E,0x1F,0x00	@1=ura
.byte	0x04,0x0E,0x1F,0x1F,0x1F,0x0E,0x04,0x00	@2=diamant
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	@3=praznina
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	@4=praznina
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	@5=praznina
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	@6=praznina
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	@7=praznina
.align

@*** 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

@*** 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

@*** 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

@*** Vpis 256byte v FLASH pomnilnik *** (R0-4)
.equ	SEKTOR,25
.equ	NFLASH,0x0007B000
FLASH:	LDR	R0,=0x3FFFC036	@FIO1PIN2 precita tipke v R1
	LDRB	R1,[R0]
	AND	R1,R1,#0x0F	@izkljucno LEVO+DESNO vpis v FLASH?
	EORS	R1,R1,#0x06
	MOVNE	PC,LR
FLASH0:	LDR	R0,=NFLASH	@Flash address - neposredni vhod brez tipk!
	LDR	R1,=NRAM	@RAM address
	MOV	R2,#64
FLASH1:	LDR	R3,[R0],#4	@primerjaj 64*4bajte
	LDR	R4,[R1],#4
	CMP	R3,R4
	BNE	FLASH2		@vpisi FLASH samo razlicno!
	SUBS	R2,R2,#1
	BNE	FLASH1
	MOV	PC,LR
FLASH2:	STR	LR,[SP,#-4]!	@resi link
	BL	ODDAJ		@oddaja znakov iz vmesnika na UART0
	MOV	R0,#0x80	@prva vrstica besedila '* Vpis v FLASH *'
	BL	UKAZ
	LDR	R4,=FLASH6
FLASH3:	LDRB	R0,[R4],#1
	MOVS	R0,R0
	BEQ	FLASH4
	BL	VMES		@ohrani R0!
	BL	ZNAK
	B	FLASH3
	MOV	R0,#13		@nova vrsta
FLASH4:	BL	VMES
	MOV	R0,#10
	BL	VMES
	MOV	R0,#0xC0	@druga vrstica besedila '................'
	BL	UKAZ
	LDR	R4,=FLASH7
FLASH5:	LDRB	R0,[R4],#1
	MOVS	R0,R0
	BEQ	FLASH8
	BL	VMES		@ohrani R0!
	BL	ZNAK
	B	FLASH5
.ltorg
FLASH6:	.asciz	"* Vpis v FLASH *"
FLASH7:	.asciz	"................"
.align
FLASH8:	MOV	R0,#13		@nova vrsta
	BL	VMES
	MOV	R0,#10
	BL	VMES
	BL	T100MS
	BL	ODDAJ		@oddaja znakov iz vmesnika na UART0
	BL	FIQOFF		@izkljuci prekinitve FIQ
	LDR	R0,=IAPCMD	@prepare sector
	MOV	R2,#50		@command code 50
	STR	R2,[R0]
	MOV	R2,#SEKTOR	@start sector number
	STR	R2,[R0,#4]
	MOV	R2,#SEKTOR	@end sector number
	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
	MOV	R2,#52		@command code 52
	STR	R2,[R0]
	MOV	R2,#SEKTOR	@start sector number
	STR	R2,[R0,#4]
	MOV	R2,#SEKTOR	@end sector number
	STR	R2,[R0,#8]
	LDR	R2,=CCLKKHZ	@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
	MOV	R2,#50		@command code 50
	STR	R2,[R0]
	MOV	R2,#SEKTOR	@start sector number
	STR	R2,[R0,#4]
	MOV	R2,#SEKTOR	@end sector number
	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: NRAM>NFLASH
	MOV	R2,#51		@command code 51
	STR	R2,[R0]
	LDR	R2,=NFLASH	@destination Flash address
	STR	R2,[R0,#4]
	LDR	R2,=NRAM	@source RAM address
	STR	R2,[R0,#8]
	MOV	R2,#256		@number of bytes to be written (256)
	STR	R2,[R0,#12]
	LDR	R2,=CCLKKHZ	@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
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Inicializiraj parametre iz FLASH *** (R0-3)
INIPAR:	MOV	R0,#0		@resetiraj zacetne vrednosti
	LDR	R1,=TABELA
	MOV	R2,#64
INIPA1:	STR	R0,[R1],#4
	SUBS	R2,R2,#1
	BNE	INIPA1
	LDR	R0,=NFLASH	@source Flash address
	LDR	R1,=NRAM	@destination RAM address
	MOV	R2,#64
INIPA2:	LDR	R3,[R0],#4	@prepisi 64*4bajte
	STR	R3,[R1],#4		
	SUBS	R2,R2,#1
	BNE	INIPA2
	MOV	PC,LR
.ltorg

@*** 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	INIPAR		@inicializiraj parametre iz FLASH
	BL	UART0		@inicializiraj UART0
	BL	TIMER0		@nastavi prekinitve TIMER0
	BL	VIC		@inicializiraj VIC
	BL	INILCD		@inicializiraj HD44780 5X7,2vrstici,CGRAM
	MOV	R0,#0x80	@prva vrstica besedila
	BL	UKAZ
	LDR	R4,=ZACNI5
ZACNI1:	LDRB	R0,[R4],#1
	MOVS	R0,R0
	BEQ	ZACNI2
	BL	VMES		@ne pokvari R0!
	BL	ZNAK
	B	ZACNI1
ZACNI2:	MOV	R0,#13		@nova vrsta
	BL	VMES
	MOV	R0,#10
	BL	VMES
	MOV	R0,#0xC0	@druga vrstica besedila
	BL	UKAZ
	LDR	R4,=ZACNI6
ZACNI3:	LDRB	R0,[R4],#1
	MOVS	R0,R0
	BEQ	ZACNI4
	BL	VMES		@ne pokvari R0!
	BL	ZNAK
	B	ZACNI3
ZACNI4:	MOV	R0,#13		@nova vrsta
	BL	VMES
	MOV	R0,#10
	BL	VMES
	BL	ODDAJ		@oddaja znakov iz vmesnika na UART0
	BL	T100MS
	BL	ODDAJ		@oddaja znakov iz vmesnika na UART0
	BL	T100MS
	BL	ODDAJ		@oddaja znakov iz vmesnika na UART0
	BL	T1S		@zakasnitev 1s
	B	ZANKA	@glavna zanka programa
.ltorg
ZACNI5:	.asciz	"VF izvor ADF4351"
ZACNI6:	.asciz	"S53MV 21.04.2017"
.align

@*** Glavna zanka programa ***
ZANKA:	BL	TIPKE		@preberi ukaz s tipk
	BL	IZVEDI		@izvedi ukaz s tipk
	BL	SETADF		@postavi registre ADF4351
	BL	SETHMC		@postavi slabilec HMC273
	BL	FIQON		@vkljuci in nasatvi prekinitve FIQ
	BL	MENU		@izpisi menu na zaslon
	BL	IZPIS		@izpisi vsebino pomnilnika 2x16 znakov
	BL	FLASH		@vpis 256byte v FLASH pomnilnik
	BL	ODDAJ		@oddaja znakov iz vmesnika na UART0
	BL	STANJE		@vsebina zaslona v oddajni vmesnik
	BL	SPREJM		@sprejem daljinskih ukazov iz UART0
	BL	T4MS		@zakasnitev 4ms
	B	ZANKA
.ltorg

@*** Izpisi vsebino pomnilnika 2x16 znakov *** (R0,R1,R2,R3,R4)
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

@*** 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?
	SUBNE	R4,R4,#1
	MOVNE	R3,#ZMIGA
	TST	R2,#0x01	@ukaz DESNO in sahovnica?
	ADDNE	R4,R4,#1
	MOVNE	R3,#ZMIGA
	STR	R4,[R1]		@shrani KAZALO
	MOV	R4,#0
	TST	R2,#0x04	@ukaz GOR in znak?
	MOVNE	R4,#1
	MOVNE	R3,#0
	TST	R2,#0x02	@ukaz DOL in znak?
	MOVNE	R4,#-1
	MOVNE	R3,#0
	LDR	R1,=PREMIK	@shrani PREMIK
	STR	R4,[R1]
	STR	R3,[R0]		@shrani sahovnico/znak
	MOVS	R4,R4
	MOVEQ	PC,LR
	LDR	R1,=NSTANJE	@takojsnja oddaja novega stanja
	MOV	R0,#0
	STR	R0,[R1]
	MOV	PC,LR
.ltorg

@*** Izvedi ukaz s tipk *** (R0-)
IZVEDI:	LDR	R3,=ZNACKA	@ZNACKA=0 je ni v [R3]
	MOV	R0,#0
	STR	R0,[R3]
	LDR	R1,=KAZALO	@preveri KAZALO
	LDR	R4,[R1]
	MOVS	R4,R4
	MOVMI	R4,#0
	CMP	R4,#14
	MOVCS	R4,#14
	STR	R4,[R1]		@KAZALO v R4
	LDR	R0,=PREMIK	@PREMIK v R1
	LDR	R1,[R0]
	MOVS	R4,R4		@nastavljanje SPOMIN?
	BNE	IZVED1
	LDR	R2,=SPOMIN
	LDR	R0,[R2]
	ADD	R0,R0,R1
	MOVS	R0,R0		@preveri SPOMIN
	MOVMI	R0,#0
	CMP	R0,#9
	MOVCS	R0,#9
	STR	R0,[R2]
	MOV	PC,LR
IZVED1:	LDR	R2,=SPOMIN	@naslov nastavitev SPOMIN v R2
	LDR	R0,[R2]
	LDR	R2,=NRAM
	ADD	R2,R2,R0,LSL#4
	SUBS	R4,R4,#8	@nastavitev frekvence?
	BPL	IZVED4
	ADD	R0,R4,#13	@nastavi ZNACKA [R3]
	CMP	R0,#10
	ADDCS	R0,R0,#1	@preskok decimalne pike
	STR	R0,[R3]
IZVED2:	ADDS	R4,R4,#1
	BEQ	IZVED3
	ADD	R1,R1,R1,LSL#2	@pomnozi PREMIK z 10
	ADD	R1,R1,R1
	B	IZVED2
IZVED3:	LDR	R0,[R2]		@popravek frekvence
	ADD	R0,R0,R1
	STR	R0,[R2]
	MOV	PC,LR
IZVED4:	SUBS	R4,R4,#2	@nastavitev jakosti?
	BPL	IZVED5
	ADD	R0,R4,#20	@nastavi ZNACKA [R3]
	STR	R0,[R3]
	ADDS	R4,R4,#1
	ADDNE	R1,R1,R1,LSL#2	@pomnozi PREMIK z 10
	ADDNE	R1,R1,R1
	LDR	R0,[R2,#4]	@popravek jakosti
	ADD	R0,R0,R1
	STR	R0,[R2,#4]
	MOV	PC,LR
IZVED5:	SUBS	R4,R4,#5	@nastavitev modulacije?
	BPL	IZVED8
	ADD	R0,R4,#31	@nastavi ZNACKA [R3]
	STR	R0,[R3]
IZVED6:	ADDS	R4,R4,#1
	BEQ	IZVED7
	ADD	R1,R1,R1,LSL#2	@pomnozi PREMIK z 10
	ADD	R1,R1,R1
	B	IZVED6
IZVED7:	LDR	R0,[R2,#8]	@popravek modulacije
	ADD	R0,R0,R1
	STR	R0,[R2,#8]
	MOV	PC,LR
IZVED8: MOV	PC,LR		@neuporabljeno!!!!!!!!!!!!!!!!!!!!
.ltorg

@*** Izpisi menu na zaslon *** (R0-5)
MENU:	STR	LR,[SP,#-4]!	@resi link
	LDR	R4,=ZASLON
	LDR	R1,=SPOMIN	@naslov nastavitev v R5
	LDR	R0,[R1]
	LDR	R1,=NRAM
	ADD	R5,R1,R0,LSL#4
	ADD	R0,R0,#'0'	@izpisi SPOMIN
	STRB	R0,[R4],#1
	MOV	R0,#' '		@presledek
	STRB	R0,[R4],#1
	LDR	R1,=0x3FFFC015	@FIO0PIN1 uklenitev PLL?
	LDRB	R0,[R1]
	TST	R0,#8
	MOVEQ	R0,#1		@ura
	MOVNE	R0,#' '		@praznina
	STRB	R0,[R4],#1
	MOV	R0,#' '		@ dva presledka
	STRB	R0,[R4],#1
	STRB	R0,[R4],#1
	LDR	R3,[R5]		@izpisi frekvenco XXXX.XXX(MHz)
	MOV	R0,#7		@omejena locljivost ADF4351 @32MHz
	LDR	R1,=2200000
MENU1:	CMP	R3,R1
	BCS	MENU2
	MOV	R1,R1,LSR#1
	MOVS	R0,R0,LSR#1
	BNE	MENU1
MENU2:	LDR	R2,=UTRIP	@utripaj s popravljeno frekvenco
	LDR	R1,[R2]
	TST	R1,#ZMIGA
	BICNE	R3,R3,R0	@popravi prikazano frekvenco?
	ADD	R4,R4,#8
	MOV	R0,#10		@enice kHz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	MOV	R0,#10		@desetice kHz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	MOV	R0,#10		@stotice kHz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	MOV	R0,#'.'		@pika
	STRB	R0,[R4,#-1]!
	MOV	R0,#10		@enice MHz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	MOV	R0,#10		@desetice MHz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	MOV	R0,#10		@stotice MHz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	ADD	R0,R3,#'0'	@tisocice MHz
	STRB	R0,[R4,#-1]!
	MOV	R1,#3		@brisi max 3 vodilne nicle
	MOV	R2,#0
MENU3:	LDRB	R0,[R4]
	ADD	R0,R0,R2
	CMP	R0,#'0'
	MOVEQ	R0,#' '
	MOVNE	R2,#256
	STRB	R0,[R4],#1
	SUBS	R1,R1,#1
	BNE	MENU3
	ADD	R4,R4,#5
	MOV	R0,#'M'		@'MHz'
	STRB	R0,[R4],#1
	MOV	R0,#'H'
	STRB	R0,[R4],#1
	MOV	R0,#'z'
	STRB	R0,[R4],#1
	LDR	R3,[R5,#4]	@izpisi jakost -XX(dBm)
	MOVS	R3,R3		@predznak
	MOVPL	R0,#'+'
	MOVMI	R0,#'-'
	RSBMI	R3,R3,#0
	STRB	R0,[R4],#1
	ADD	R4,R4,#2
	MOV	R0,#10		@enice dB
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!	
	ADD	R0,R3,#'0'	@desetice dB
	CMP	R0,#'0'		@brisi vodilno niclo
	LDREQB	R0,[R4,#-2]
	MOV	R1,#' '
	STREQB	R1,[R4,#-2]
	STRB	R0,[R4,#-1]!
	ADD	R4,R4,#2
	MOV	R0,#'d'		@'dBm' in 3 presledki
	STRB	R0,[R4],#1
	MOV	R0,#'B'
	STRB	R0,[R4],#1
	MOV	R0,#'m'
	STRB	R0,[R4],#1
	MOV	R0,#' '
	STRB	R0,[R4],#1
	STRB	R0,[R4],#1
	STRB	R0,[R4],#1
	LDR	R3,[R5,#8]	@izpisi modulacijo XXXXX(Hz)
	ADD	R4,R4,#5
	MOV	R0,#10		@enice Hz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	MOV	R0,#10		@desetice Hz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	MOV	R0,#10		@stotice Hz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	MOV	R0,#10		@tisocice Hz
	BL	NDELI	
	ADD	R0,R0,#'0'
	STRB	R0,[R4,#-1]!
	ADD	R0,R3,#'0'	@desettisocice kHz
	STRB	R0,[R4,#-1]!
	MOV	R1,#4		@brisi max 4 vodilne nicle
	MOV	R2,#0
MENU4:	LDRB	R0,[R4]
	ADD	R0,R0,R2
	CMP	R0,#'0'
	MOVEQ	R0,#' '
	MOVNE	R2,#256
	STRB	R0,[R4],#1
	SUBS	R1,R1,#1
	BNE	MENU4
	ADD	R4,R4,#1
	MOV	R0,#'H'		@'Hz'
	STRB	R0,[R4],#1
	MOV	R0,#'z'
	STRB	R0,[R4],#1
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Vsebina zaslona v oddajni vmesnik *** (R0-5)
STANJE:	LDR	R1,=NSTANJE	@stevec oddaje stanja
	LDR	R0,[R1]
	SUBS	R0,R0,#1
	LDRMI	R0,=PSTANJE
	STR	R0,[R1]
	MOVPL	PC,LR
	STR	LR,[SP,#-4]!	@resi link
	LDR	R4,=ZASLON
	BL	STANJ1		@prva vrstica
	MOV	R0,#' '		@presledek
	BL	VMES
	BL	STANJ1		@druga vrstica
	MOV	R0,#13		@nova vrsta
	BL	VMES
	MOV	R0,#10
	BL	VMES
	LDR	PC,[SP],#4	@povratek na link
STANJ1:	STR	LR,[SP,#-4]!	@izpis vrstice 16 znakov
	MOV	R5,#16
STANJ2:	LDRB	R0,[R4],#1
	CMP	R0,#' '		@zamenjaj neznano z *
	MOVCC	R0,#'*'
	BL	VMES
	SUBS	R5,R5,#1
	BNE	STANJ2
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Sprejem daljinskih ukazov iz UART0 *** (R0-3)
SPREJM:	STR	LR,[SP,#-4]!	@resi link
SPREJ1:	LDR	R0,=0xE000C014	@U0LSR bit0=ReceiveDataReady?
	LDRB	R1,[R0]
	TST	R1,#0x01
	LDREQ	PC,[SP],#4	@izhod brez novih znakov
	LDR	R1,=NSTANJE	@pocakaj z oddajo stanja
	LDR	R0,=WSTANJE
	STR	R0,[R1]
	LDR	R0,=0xE000C000	@U0RBR sprejeti znak 7bit v R0
	LDRB	R0,[R0]
	AND	R0,R0,#127
	CMP	R0,#127		@brisanje DEL?
	BEQ	SPREJ2
	CMP	R0,#8		@brisanje BS?
	BEQ	SPREJ2
	CMP	R0,#32		@CR ali kontrolni znak za konec ukaza?
	BCC	SPREJ3
	LDR	R1,=DALJKAZ	@nov znak ukaza v pomnilnik
	LDR	R2,[R1]
	CMP	R2,#66		@prostor v pomnilniku?
	BCS	SPREJ4
	LDR	R3,=DALJIN
	CMP	R0,#96		@pretvori male crke v velike
	SUBCS	R0,R0,#32
	STRB	R0,[R3,R2]	@znak v pomnilnik
	ADD	R2,R2,#1	@povecaj kazalec
	STR	R2,[R1]
	BL	VMES		@odmev na oddajo
	B	SPREJ1
SPREJ2:	LDR	R1,=DALJKAZ	@brisi znak v pomnilniku
	LDR	R2,[R1]
	SUBS	R2,R2,#1
	BMI	SPREJ4		@prazen pomnilnik?
	STR	R2,[R1]
	MOV	R0,#8		@brisi znak v odmevu
	BL	VMES
	MOV	R0,#32
	BL	VMES
	MOV	R0,#8
	BL	VMES
	B	SPREJ1
SPREJ3:	MOV	R0,#13		@zakljuci ukaz v pomnilniku
	LDR	R1,=DALJKAZ
	LDR	R2,[R1]
	LDR	R3,=DALJIN
	STRB	R0,[R3,R2]	@<CR> v pomnilnik
	MOV	R0,#13		@nova vrsta v odmev
	BL	VMES
	MOV	R0,#10
	BL	VMES
	BL	VNOS		@vnesi novo vrednost
	LDR	R1,=NSTANJE	@takojsnja oddaja novega stanja
	MOV	R0,#0
	STR	R0,[R1]
	LDR	R1,=DALJKAZ	@izprazni pomnilnik
	MOV	R2,#0
	STR	R2,[R1]
	B	SPREJ1
SPREJ4:	MOV	R0,#' '		@deblokada UART0?
	BL	VMES
	MOV	R0,#8
	BL	VMES
	B	SPREJ1
.ltorg

@*** Vnesi novo vrednost *** (R0-3)+FLASH0
VNOS:	LDR	R1,=DALJIN	@preberi ukaz v R2
	LDRB	R2,[R1],#1
	CMP	R2,#32
	MOVCC	PC,LR
	MOV	R3,#0		@zacetna vrednost 0 v R3
VNOS1:	LDRB	R0,[R1],#1	@preveri nov znak
	CMP	R0,#32		@konec ukaza?
	BCC	VNOS2
	CMP	R0,#'-'		@dodaj minus v R2?
	MVNEQ	R2,R2
	BEQ	VNOS1
	SUBS	R0,R0,#'0'	@stevilka?
	BCC	VNOS1
	CMP	R0,#10
	BCS	VNOS1
	ADD	R3,R3,R3,LSL#2	@pomnozi prejsnje z 10
	ADD	R3,R3,R3
	MOVS	R2,R2		@pristej/odstej novo stevilko
	ADDPL	R3,R3,R0
	SUBMI	R3,R3,R0
	B	VNOS1
VNOS2:	MOVS	R2,R2		@odstrani predznak iz R2
	MVNMI	R2,R2
	LDR	R1,=SPOMIN	@nastavi SPOMIN
	LDR	R0,[R1]
	LDR	R1,=NRAM
	ADD	R1,R1,R0,LSL#4
	CMP	R2,#'F'		@postavi novo frekvenco?
	STREQ	R3,[R1]
	MOVEQ	PC,LR
	CMP	R2,#'A'		@postavi novo jakost?
	STREQ	R3,[R1,#4]
	MOVEQ	PC,LR
	CMP	R2,#'M'		@postavi novo modulacijo?
	STREQ	R3,[R1,#8]
	MOVEQ	PC,LR
	CMP	R2,#'S'		@postavi nov spomin?
	BNE	VNOS3
	MOVS	R0,R3		@preveri spomin
	MOVMI	R0,#0
	CMP	R0,#9
	MOVCS	R0,#9
	LDR	R1,=SPOMIN
	STR	R0,[R1]
	MOV	PC,LR
VNOS3:	CMP	R2,#'R'		@popolni RESET vira?
	BNE	VNOS4
	BL	FIQOFF		@izkljuci prekinitve FIQ
	BL	ODDAJ		@oddaja znakov iz vmesnika na UART0
	BL	T100MS
	B	ZACNI		@zacetek programa
VNOS4:	CMP	R2,#'P'		@vpis parametrov v FLASH?
	MOVNE	PC,LR
	LDR	R0,=123456789	@kljuc vpisa 123456789
	CMP	R3,R0
	MOVNE	PC,LR
	STR	LR,[SP,#-4]!	@resi link
	BL	FLASH0		@FLASH brez tipk!!!
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Konec delovanja zbirnika Gnu ***
.end
