FRISC system-on-a-chip na FPGA razvojnoj pločici ULX2S

Uvod

Procesor FRISC, dizajniran i razvijen na FER-u unutar grupe RASIP, može se sintetizirati za rad na FPGA sklopovima različitih proizvođača. Za razvojnu pločicu FER-ULX2S pripremljen je system-on-a-chip sustav temeljen na procesoru FRISC koji radi na taktu frekvencije 32.5 MHz. Moduli i priključci FRISC system-on-a-chip konfiguracije prikazani su blok shemom:

Nakon što se FPGA sklop konfigurira odgovarajućom bitstream datotekom, izvršne programe za procesor FRISC moguće je putem USB sučelja s računala učitati u mikroprocesorski sustav na FPGA sklopu te ih pokrenuti korištenjem bilo kojeg programa za emulaciju asinkronog terminala.

Konfiguriranje FPGA sklopa

Za konfiguriranje FPGA sklopa Lattice XP2 koristi se alat ujprog koji mora na računalo biti instaliran u kazalo C:\Windows (za ostale operacijske sustave vidi Upute za rad s pločicom ULX2S). Zavisno od tipa FPGA sklopa ugrađenog na razvojnu pločicu (Lattice XP2-5E ili XP2-8E) potrebno je na računalo dohvatiti odgovarajući konfiguracijski bitstream FPGA sklopa: frisc_5e.jed ili frisc_8e.jed. Primjer konfiguriranja FPGA sklopa s automatskim prelaskom na emuliranje asinkronog terminala:

% ujprog -t frisc_8e.jed
ULX2S JTAG programmer v 2.beta0 $Id: ujprog.c 2683 2015-03-29 23:35:11Z marko $
Programming: 100%  
Completed in 3.62 seconds.
Terminal emulation mode, using 115200 bauds
Press ENTER, ~, ? for help

Nakon pritiska na tipku ENTER pojavit će se prompt kontrolnog programa (bootloader-a) procesora FRISC:

FRISC @ 00000000>

Prevođenje, učitavanje i pokretanje programa

Kontrolni program FRISC sustava (bootloader) omogućuje direktno učitavanje i pokretanje izvršnih programa u formatu ".p" koje stvara assembler xconas. Pri pokretanju assemblera kao prvi argument zadaje se put do datoteke s opisom FRISC assemblera frisc_v3ap1.adl, a drugi argument je ime datoteke s izvornim kodom. Primjer asembliranja izvornog koda pohranjenog u datoteci "prvi.asm":

% more prvi.asm
IO_LED	EQU	ffffff10 
                        
	MOVE 0ff, R0 
	STOREB R0, (IO_LED) 
	RET 
% xconas frisc_v3ap1.adl prvi.asm

Nakon završetka asembliranja program xconas može se prekinuti pritiskom na CTRL+C. Izlazna datoteka imat će ekstenziju ".p". Primjer assemblerskog izlaza ispitnog programa:

% more prvi.p
                       IO_LED   EQU    ffffff10 
                        
00000000  FF 00 00 04   MOVE 0ff, R0  
00000004  10 FF 0F 98   STOREB R0, (IO_LED)  
00000008  00 00 00 D8   RET 

NOVO (2015)!!! Izvorni assemblerski kod može se prevesti i korištenjem eksperimentalnog online FRISC assemblera u samo jednom koraku i bez potrebe za instaliranjem dodatnih programskih alata na vlastito računalo!

Prevedeni program može se učitati u FRISC sustav na FPGA pločici pomoću alata ujprog:

% ujprog -rta prvi.a
ULX2S JTAG programmer v 2.beta0 $Id: ujprog.c 2683 2015-03-29 23:35:11Z marko $
Using USB JTAG cable.
Reconfiguring FPGA...
Sending source.p: done.
Terminal emulation mode, using 115200 bauds
Press ENTER, ~, ? for help
                     
FRISC @ 0000000C>

Alternativno, program se moze učitati utipkavanjem prekidnog slijeda znakova u alatu ujprog:
(ENTER) ~ >
nakon čega treba upisati ime datoteke koju se šalje putem USB sučelja:

FRISC @ 00000000>~>Local file name? prvi.p

Tijekom učitavanja datoteke u memoriju FRISC sustava treptat će LED indikatori na razvojnoj pločici. Po završetku učitavanja treba još jednom pritisnuti tipku ENTER, nakon čega bi na promptu trebala biti vidljiva adresa za jedan viša od adrese zadnjeg okteta učitanog programa:

FRISC @ 0000000C>

Prije pokretanja programa moguće je pregledati sadržaj memorije korištenjem naredbe examine (x):

FRISC @ 0000000C>x0
00000000  FF 00 00 04 10 FF 0F 98  00 00 00 D8 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
000000F0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
FRISC @ 00000100>

Program se pokreće naredbom jump (j):

FRISC @ 00000100>j0
Booting at 00000000

FRISC @ 00000000>

U slučaju ispitnog programa prvi.p na zaslonu se neće ispisati nikakav tekst, ali će svi LED indikatori na razvojnoj pločici biti upaljeni.

Pokretanje programa s MicroSD kartice

Uz korištenje alternativne konfiguracije FPGA sklopa programe je u FRISC sustav moguće automatski učitati i pokrenuti s MicroSD kartice. Za pripremu sustava potrebno je najprije ažurirati firmware na ugrađenoj Flash memoriji, nakon čega FPGA sklop treba programirati posebno prilagođenom konfiguracijom FRISC-a (frisc_sd_5e.jed ili frisc_sd_8e.jed, zavisno od varijante ugrađenog FPGA chipa):

% ujprog -j flash frisc_sd_8e.jed
ULX2S JTAG programmer v 2.beta0 $Id: ujprog.c 2683 2015-03-29 23:35:11Z marko $
Using USB JTAG cable.
Programming: 100%   
Completed in 27.11 seconds.

Na MicroSD karticu treba pohraniti pomoćni program za učitavanje, te vlastiti program za FRISC asembliran alatom xconas:

% cp frisc_ld.bin /cygdrive/e
% cp prvi.p /cygdrive/e

Uspostavom napajanja FPGA pločice (uključenjem u USB priključnicu računala ili priključenjem na nezavisni izvor napajanja) FRISC sustav će automatski učitati i pokrenuti program pohranjen na MicroSD kartici.

Inicijalizacija (reset) FPGA sklopa

U bilo kojem trenutku FPGA sklop se može inicijalizirati (resetirati) utipkavanjem prekidnog slijeda znakova ENTER, ~, r u alatu ujprog. Učinak tog postupka identičan je isključenju te ponovnom ukapčanju FPGA pločice u računalo:

FRISC @ 00000000>x0
00000000  10 FF 8F 06 20 00 00 06  11 00 90 1C 00 00 D0 BC  |.... ...........|
00000010  00 00 04 05 01 00 20 35  F8 FF 0F D6 01 00 40 36  |...... 5......@6|
00000020  E4 FF 0F D6 00 00 00 D8  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
000000F0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
FRISC @ 00000100>(ENTER ~ r, ne vidi se na ekranu!)
Reconfiguring FPGA...
Terminal emulation mode, using 115200 bauds
Press ENTER, ~, ? for help
ULX2S FAT bootloader v 0.4 (f32c/le) (built Mar 17 2015)

SIO bootloader v1.0

FRISC @ 00000000>x0
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
000000F0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
FRISC @ 00000100>

Unutarnji SRAM (FPGA block RAM)

Ukupno 16 KB unutarnje SRAM memorije ugrađne u FPGA sklop dostupno je na adresnom rasponu od 0x00000000 do 0x00003FFF. Zadnjih 1 KB unutarnjeg SRAMa, odnosno raspon od 0x00003C00 do 0x00003FFF, zauzima kontrolni program (bootloader) i taj se adresni raspon ne smije koristiti u vlastitim programima. Prilikom pokretanja učitanih programa pokazivač stoga (stack pointer) pokazivat će na adresu 0x00003C00.

Vanjski SRAM

Na pločicu ULX2S ugrađena je statička RAM memorija (SRAM) kapaciteta 1 MB. U FRISC SoC sustavu ta memorija je dostupna na adresnom rasponu od 0x80000000 do 0x800FFFFF. Osim procesora, memoriji putem odvojenih sabirnica samostalno mogu pristupati grafički modul (generator PAL video signala) te zvučni podsustav (PCM audio dekoder).

LED indikatori

Ukupno osam LED indikatora ugrađenih na razvojnu pločicu povezani su na izlaz registra na adresi 0xFFFFFF10. Primjer pisanja u registar LED indikatora u FRISC assembleru:

IO_LED		EQU    ffffff10        ; byte, WR

	MOVE 0ff, R0
	STOREB R0, (IO_LED)

Tipke i prekidači

Stanje signala povezanih s pet tipki i četiri DIP prekidača na razvojnoj pločci može se pročitati na adresama 0xFFFFFF10 i 0xFFFFFF11. Primjer u FRISC assembleru povećat će ili smanjiti vrijednost brojača u registru R4 ako su pritisnute tipke BTN_UP odnosno BTN_DOWN, ili resetirati brojač ako je pritisnuta tipka BTN_CENTER:

IO_PUSHBTN      EQU    ffffff10        ; byte, RD
IO_DIPSW        EQU    ffffff11        ; byte, RD

BTN_CENTER      EQU    10
BTN_UP          EQU    08
BTN_DOWN        EQU    04
BTN_LEFT        EQU    02
BTN_RIGHT       EQU    01

        LOAD R1, (IO_PUSHBTN)   ; procitaj stanje tipki
        AND R1, BTN_UP, R2      ; pritisnut btn_up?
        JR_Z SKIP1              ; nije
        ADD R4, 1, R4           ; povecaj brojac
SKIP1   AND R1, BTN_DOWN, R2    ; pritisnut btn_down?
        JR_Z SKIP2              ; nije
        SUB R4, 1, R4           ; smanji brojac
SKIP2   AND R1, BTN_CENTER, R2  ; pritisnut btn_center?
	JR_Z SKIP3              ; nije
        MOVE 0, R4              ; resetiraj brojac
SKIP3

Asinkrono serijsko sučelje

Komunikaciju između računala i FRISC SoC sustava moguće je ostvariti putem asinkronog serijskog sučelja koje je na FPGA pločici povezano s USB-UART premosnikom FTDI FT232R, a omogućuje prijenos podataka brzinama između 300 i 3000000 bita u sekundi (standardna brzina prijenosa je 115200 bps). Primjer rutina PUTCHAR i GETCHAR u FRISC assembleru koje omogućuju pisanje odnosno čitanje znakova putem asinkronog serijskog sučelja:

IO_SIO_BYTE     EQU    ffffff20        ; byte, RW
IO_SIO_STATUS   EQU    ffffff21        ; byte, RD
IO_SIO_BAUD     EQU    ffffff22        ; half, WR

SIO_TX_BUSY     EQU    04
SIO_RX_FULL     EQU    01

PUTCHAR ; salji char u R0 na RS232 port, kvari R1
        LOADB R1, (IO_SIO_STATUS)
        AND R1, SIO_TX_BUSY, R1 ; TX busy?
        JR_NZ PUTCHAR           ; je -> spin
        STOREB R0, (IO_SIO_BYTE) ; posalji podatak
        RET

GETCHAR ; u R0 vrati byte procitan sa RS232 porta
        LOADB R0, (IO_SIO_STATUS)
        AND R0, SIO_RX_FULL, R0 ; RX byte ready?
        JR_Z GETCHAR            ; nije -> spin
        LOADB R0, (IO_SIO_BYTE) ; procitaj byte
        RET

Grafički podsustav (PAL video)

Grafički modul nezavisno od procesora dohvaća podatke iz statičkog RAM-a i 50 puta u sekundi osvježava prikaz slike rezolucije 512 * 288 točaka. Izlazni kompozitni PAL video signal dostupan je na 3.5 mm stereo priključnici razvojne pločice i može se bez ikakvih dodatnih prilagodbi prikazati na svakom TV prijemniku ili zaslonu s kompozitnim video ulazom. Linearni video framebuffer može biti smješten u bilo kojem dijelu vanjske statičke RAM memorije. U upravljački registar na adresi 0xFFFFFF40 upisuje se kodna riječ u kojoj dva bita najmanje težine određuju način rada grafičkog modula, dok ostali bitovi određuju početnu adresu video framebuffera. Moguće je odabrati rad s 8-bitnim ili 16-bitnim kodiranjem boje svake pojedine točke, uz korištenje fiksnih paleta.

8-bitna paleta 16-bitna paleta

Primjer podešavanja grafičkog modula za rad s 8-bitnim kodiranjem boje te video framebufferom na adresi 0x80010000, nakon čega se nacrta dijagonalna crta u plavoj boji koja se proteže od gornjeg lijevog do donjeg desnog ruba ekrana:

IO_FB           EQU    ffffff40        ; word, WR

FB_MODE_8       EQU    00
FB_MODE_16      EQU    01
FB_MODE_TEST    EQU    02
FB_MODE_OFF     EQU    03

        MOVE 8001, R1
        SHL R1, 10, R1
        STORE R1, (IO_FB)       ; FB_MODE_8, FB base @ 80010000
        MOVE 0c2, R0            ; plava boja
        MOVE 120, R2            ; 288 redaka
LOOP
        STOREB R0, (R1)         ; pofarbaj pixel
        STOREB R0, (R1 + 1)     ; pofarbaj pixel
        ADD R1, 202, R1         ; R1 += (512 + 2)
        SUB R2, 1, R2
        JR_NZ LOOP
        RET

Dodatni primjer crtanja po video framebufferu - igra krizic-kruzic: tic_tac_toe.asm

Zvučni podsustav (PCM audio)

Radom modula za generiranje zvučnog izlaza upravlja se putem četiri registra. U registar IO_PCM_FIRST (0xFFFFFF50) upisuje se početna adresa bloka u vanjskoj SRAM memoriji iz koje se DMA prijenosom u pravilnim vremenskim intervalima dohvaćaju uzorci PCM audio signala, kodirani kao parovi 16-bitnih vrijednosti. U registar IO_PCM_LAST (0xFFFFFF54) upisuje se zadnja adresa DMA bloka. U registar IO_PCM_FREQ (0xFFFFFF58) upisuje se frekvencija uzorkovanja izražena brojem ciklusa takta frekvencije 32.5 MHz nakon kojih modul automatski DMA pristupom dohvaća slijedeći uzorak PCM kodne riječi. U registar IO_PCM_VOLUME (0xFFFFFF5c) upisuje se glasnoća reprodukcije, odvojeno za lijevi i desni kanal u gornjih odnosno donjih 16 bitova kodne riječi. Čitanjem registra IO_PCM_CUR (0xFFFFFF50) može se odrediti trenutna vrijednost pokazivača PCM uzoraka u DMA bloku.

Primjer: program u SRAM memoriju kopira osam PCM uzoraka koji odgovaraju punom ciklusu sinusnog signala, podešava upravljačke registre DMA modula, te u petlji "svira" C-dur ljestvicu različitim brzinama reprodukcije.

IO_PCM_CUR	EQU	ffffff50	; word, RD
IO_PCM_FIRST	EQU	ffffff50	; word, WR
IO_PCM_LAST	EQU	ffffff54	; word, WR
IO_PCM_FREQ	EQU	ffffff58	; word, WR
IO_PCM_VOLUME	EQU	ffffff5c	; word, WR

IO_FB		EQU	ffffff40	; word, WR
FB_MODE_OFF	EQU	03

	MOVE FB_MODE_OFF, R0	; iskljuci signal video generatora, cime se
	STORE R0, (IO_FB)	; na oba kanala stereo prikljucnice prospaja
	MOVE 0ffffffff, R0	; PCM audio izlaz
	STORE R0, (IO_PCM_VOLUME) ; max. glasnoca zvuka na oba kanala

	MOVE 8008, R1
	SHL R1, 10, R1		; R1 = 0x80080000 (pocetak DMA bloka)
	STORE R1, (IO_PCM_FIRST) ; pocetna adresa DMA bloka
	ADD R1, 1C, R2		; zadnja adresa DMA bloka je 0x8008001C
	STORE R2, (IO_PCM_LAST)
	MOVE SIN_MAP, R0
	MOVE 20, R2		; kopiraj 32 bytes u vanjski SRAM (DMA blok)
COPY_LOOP
	LOAD R3, (R0)
	STORE R3, (R1)
	ADD R0, 4, R0
	ADD R1, 4, R1
	SUB R2, 4, R2
	JR_NZ COPY_LOOP

	MOVE 7ffff, R4		; brzina sviranja
SPEED_LOOP
	MOVE PITCH_MAP, R2
	MOVE 8, R3		; 8 tonova ljestvice
PITCH_LOOP
	LOAD R0, (R2)		; ucitaj iz tablice PITCH_MAP frekvenciju DMA
	STORE R0, (IO_PCM_FREQ)	; upisi u registar IO_PCM_FREQ
	ADD R2, 4, R2		; pomakni pointer na sljedeci kod
	MOVE R4, R0		; unutarnja petlja za kasnjenje
DELAY	SUB R0, 1, R0
	JR_NZ DELAY
	SUB R3, 1, R3		; ponavljaj 8 puta
	JR_NZ PITCH_LOOP
	SHR R4, 1, R4
	SHR R4, 1, R5
	ADD R4, R5, R4
	JR_NZ SPEED_LOOP
	STORE R4, (IO_PCM_FREQ)	; upisi nulu u registar IO_PCM_FREQ
	RET

SIN_MAP				; 8 stereo 16-bitnih PCM uzoraka
	DW 00000000, 5a825a82, 7fff7fff, 5a825a82
	DW 00000000, 0da82da82, 80008000, 0da82da82

PITCH_MAP			; code = Ftone * 8 * 2^24 / 32.5 MHz
	DW %D 1080		; C0 - 261.6 Hz
	DW %D 1212		; D0 - 293.6 Hz
	DW %D 1361		; E0 - 329.6 Hz
	DW %D 1442		; F0 - 349.2 Hz
	DW %D 1619		; G0 - 392.0 Hz
	DW %D 1817		; A0 - 440.0 Hz
	DW %D 2039		; H0 - 493.9 Hz
	DW %D 2161		; C1 - 523.3 Hz

Ugrađena Flash memorija

Na razvojnu pločicu ULX2S ugrađena je Flash memorija kapaciteta 4 MB koja je s FPGA sklopom povezana putem sučelja Serial Peripheral Interface (SPI). U FRISC SoC sustavu registri modula koji radi kao SPI serdes dostupni su na adresi 0xFFFFFF30.

Primjer: program koji započinje novu SPI transakciju prema Flash memoriji, šalje naredbu za slijedno čitanje bloka podataka s adrese 0, te u petlji dohvaća prvih 512 byteova s Flash memorije koje ispisuje na serijsko sučelje. Napomena: program koristi rutinu PUTCHAR i pripadajuće definicije vezane za asinkrono serijsko sučelje.

IO_SPI_FLASH	EQU	ffffff30	; half, RW

	MOVE IO_SPI_FLASH, R1
	CALL SPI_START_TRANSACTION
	MOVE 0b, R0	; SPI Flash CMD 0x0b: high-speed read
	CALL SPI_BYTE
	MOVE 0, R0	; SPI Flash read addr, bits 23..16
	CALL SPI_BYTE
	MOVE 0, R0	; SPI Flash read addr, bits 15..8
	CALL SPI_BYTE
	MOVE 0, R0	; SPI Flash read addr, bits 7..0
	CALL SPI_BYTE
	MOVE 0ff, R0	; dummy byte, ignored
	CALL SPI_BYTE
	MOVE 200, R2	; citaj 512 byteova sa SPI flasha
READ_LOOP
	CALL SPI_BYTE
	CALL PUTCHAR
	SUB R2, 1, R2
	JR_NZ READ_LOOP
	RET

SPI_BYTE
	; salji byte (u R0) na SPI port (u R1), i
	; u R0 vrati byte procitan sa SPI porta
	STOREB R0, (R1)
	LOADB R0, (R1)
	RET
	
SPI_START_TRANSACTION
	; posalji marker za pocetak SPI transakcije
	; na SPI portu (u R1); kvari R0
	MOVE 080, R0
	STOREB R0, (R1 + 1)
	RET

MicroSD memorijske kartice

Utor za MicroSD karticu povezan je s FPGA sklopom signalima koji su dostatni za komunikaciju prema protokolu SPI. U FRISC SoC sustavu pripadajući registri modula koji radi kao SPI serdes dostupni su na adresi 0xFFFFFF34. Međutim, postupak inicijalizacije i daljnja komunikacija s MicroSD karticama bitno su složeniji od komunikacije s ugrađenom Flash memorijom, zbog čega se preporuča za takve primjene koristiti već gotove biblioteke, koje su najčešče implementirane u programskim jezicima više razine, npr. FATFS ili Petit FATFS.

IO_SPI_SDCARD   EQU    ffffff34        ; half, RW

Priključi za proširenje

Ukupno 29 priključaka za proširenje na DIL priključnicama mogu raditi bilo kao ulazi ili kao izlazi. Način rada pojedinog priključka podešava se postavljanjem pripadajućeg bita registra IO_GPIO_CTL u nulu, čime se odabire ulazni način rada, ili jedinicu, čime priključak postaje aktivni izlaz. Primjer konfiguriranja priključka j2(2) kao izlaza, te generiranje pulsirajućeg signala frekvencije cca. 3 Hz na istom izlazu u petlji:

IO_GPIO_DATA	EQU	ffffff00	; word, RW
IO_GPIO_CTL	EQU	ffffff04	; word, WR

	MOVE 10000, R4          ; bitmask 0x10000 -> pin j2(2)
	STORE R4, (IO_GPIO_CTL) ; konfiguriraj j2(2) kao izlaz
	MOVE 20, R4		; izvedi petlju 32 puta
LOOP
	XOR R1, 10000, R1
	STORE R1, (IO_GPIO_DATA)
	MOVE 40000, R2		; unutarnja petlja za kasnjenje
DELAY	SUB R2, 1, R2
	JR_NZ DELAY
	SUB R4, 1, R4
	JR_NZ LOOP
	RET

Veza između priključaka na DIL priključnicama i bitova GPIO modula vidljiva je iz VHDL opisa njihovog povezivanja:

    j1_2  <= R_gpio_out(0) when R_gpio_ctl(0) = '1' else 'Z';
    j1_3  <= R_gpio_out(1) when R_gpio_ctl(1) = '1' else 'Z';
    j1_4  <= R_gpio_out(2) when R_gpio_ctl(2) = '1' else 'Z';
    j1_8  <= R_gpio_out(3) when R_gpio_ctl(3) = '1' else 'Z';
    j1_9  <= R_gpio_out(4) when R_gpio_ctl(4) = '1' else 'Z';
    j1_13 <= R_gpio_out(5) when R_gpio_ctl(5) = '1' else 'Z';
    j1_14 <= R_gpio_out(6) when R_gpio_ctl(6) = '1' else 'Z';
    j1_15 <= R_gpio_out(7) when R_gpio_ctl(7) = '1' else 'Z';
    j1_16 <= R_gpio_out(8) when R_gpio_ctl(8) = '1' else 'Z';
    j1_17 <= R_gpio_out(9) when R_gpio_ctl(9) = '1' else 'Z';
    j1_18 <= R_gpio_out(10) when R_gpio_ctl(10) = '1' else 'Z';
    j1_19 <= R_gpio_out(11) when R_gpio_ctl(11) = '1' else 'Z';
    j1_20 <= R_gpio_out(12) when R_gpio_ctl(12) = '1' else 'Z';
    j1_21 <= R_gpio_out(13) when R_gpio_ctl(13) = '1' else 'Z';
    j1_22 <= R_gpio_out(14) when R_gpio_ctl(14) = '1' else 'Z';
    j1_23 <= R_gpio_out(15) when R_gpio_ctl(15) = '1' else 'Z';
    j2_2  <= R_gpio_out(16) when R_gpio_ctl(16) = '1' else 'Z';
    j2_3  <= R_gpio_out(17) when R_gpio_ctl(17) = '1' else 'Z';
    j2_4  <= R_gpio_out(18) when R_gpio_ctl(18) = '1' else 'Z';
    j2_5  <= R_gpio_out(19) when R_gpio_ctl(19) = '1' else 'Z';
    j2_6  <= R_gpio_out(20) when R_gpio_ctl(20) = '1' else 'Z';
    j2_7  <= R_gpio_out(21) when R_gpio_ctl(21) = '1' else 'Z';
    j2_8  <= R_gpio_out(22) when R_gpio_ctl(22) = '1' else 'Z';
    j2_9  <= R_gpio_out(23) when R_gpio_ctl(23) = '1' else 'Z';
    j2_10 <= R_gpio_out(24) when R_gpio_ctl(24) = '1' else 'Z';
    j2_11 <= R_gpio_out(25) when R_gpio_ctl(25) = '1' else 'Z';
    j2_12 <= R_gpio_out(26) when R_gpio_ctl(26) = '1' else 'Z';
    j2_13 <= R_gpio_out(27) when R_gpio_ctl(27) = '1' else 'Z';
    j2_16 <= R_gpio_out(28) when R_gpio_ctl(28) = '1' else 'Z';

Potprogrami bootloadera

Iz korisničkih programa može se pozvati nekoliko korisnih rutina za pretvorbu podataka između binarnog i heksadekadskog zapisa, te za ispis i čitanje znakova sa serijskog (USB) sučelja. Deklaracije adresa za pozivanje potprograma te njihovi argumenti i specifičnosti navedeni su u sljedećem primjeru, kojim je ujedno ilustriran i način pozivanja potprograma u jednostavnoj petlji za ispis brojeva:

GETCHAR         EQU    03fe0   ; u R0 vrati char procitan s RS232, blokira
PUTCHAR         EQU    03fe4   ; ispisi char u R0, kvari R1
PUTHEX          EQU    03fe8   ; ispisi char u R0 kao hex, kvari R0, R1
PUTHEX_W        EQU    03fec   ; ispisi word u R0 kao hex, kvari R0, R1, R2
PUTS            EQU    03ff0   ; ispisi string s adrese u R0, kvari R1
ISHEX           EQU    03ff4   ; u R0 vrati 1 ako je R1 hex char, inace 0
HEX2BIN         EQU    03ff8   ; u R0 vrati dekodirani hex char iz R1

        MOVE 0abc0, R6          ; akumulator - pocetna vrijednost
        MOVE 4, R5              ; brojac: petlju izvedi 4 puta
LOOP
        ADD R6, 2, R6           ; broji parne brojeve
        MOVE R6, R0             ; ispisi word iz R6 u heksadekadskom formatu
        CALL PUTHEX_W
        MOVE 0d, R0             ; ASCII CR (povratak na pocetak retka)
        CALL PUTCHAR
        MOVE 0a, R0             ; ASCII LF (novi redak)
        CALL PUTCHAR
        SUB R5, 1, R5           ; smanji brojac
        JR_NZ LOOP
        RET

Izvođenjem primjera na zaslonu terminala dobit će se ovakav odziv:

FRISC @ 00000000>~>Local file name? primjer.p
FRISC @ 00000030>j0
Booting at 00000000
0000ABC2
0000ABC4
0000ABC6
0000ABC8

FRISC @ 00000000>

Izvorni kod bootloadera dostupan je ovdje:
frisc_boot.asm