TriOS-alt/flash/bellatrix/belflash.spin

198 lines
20 KiB
Plaintext

{{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Autor: Ingo Kripahle │
│ Copyright (c) 2010 Ingo Kripahle │
│ See end of file for terms of use. │
│ Die Nutzungsbedingungen befinden sich am Ende der Datei │
└──────────────────────────────────────────────────────────────────────────────────────────────────────┘
Informationen : hive-project.de
Kontakt : drohne235@googlemail.com
System : TriOS
Name : Bellatrix-Flash
Chip : Bellatrix
Typ : Flash
Version : 01
Subversion : 1
Funktion : Systemloader für den Bellatrix-Chip. Dieser Code wird bei einem Chip-Reset oder
nach einem reboot-Kommando aus dem an Bellatrix angeschlossenen EEProm in den
hRAM kopiert und gestartet. Funktional wartet der Loader dann darauf, dass
Regnatix über den Systembus eine BIN-Datei sendet, welche in einen Heap geladen
und gestartet wird. In TriOS ist dafür die Datei "bel.sys" reserviert. Dieser
Bellatrix-Code kann zur Laufzeit den Loader durch das Spin-Kommando "reboot"
wieder aktivieren. Nachdem der Loader den übertragenen Code gestartet hat, beendet
die verwendete Cog ihre Arbeit.
Komponenten : -
COG's : Loader 1 Cog (nur während des Bootvorgangs)
Logbuch :
20-01-2009-dr235 - erste version
22-03-2010-dr235 - anpassung trios
Kommandoliste :
Notizen :
header einer bin-datei
00 b400 ' clkfreq low
02 04c4 ' clkfreq hi
04 ca6f ' sum byte, clkmode byte
06 0010 ' (obj) object start addr
08 005c ' (vars) variables start
0A 0088 ' (stk) stack start
0C 002c ' (PUB) obchain first PUB method start
0E 008c ' (isp) initial stack pointer value
--------------------------------------------------------------------------------------------------------- }}
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
COGMAX = 8
INTERPRETER = $f004 'interpreteradresse (rom)
PROGLEN = 32000 'größe des verfügbaren programmspeichers
'signaldefinitionen regnatix
#0, D0,D1,D2,D3,D4,D5,D6,D7 'datenbus
#8, BEL_VGABASE 'vga-signale (8pin)
#16, BEL_KEYBC,BEL_KEYBD 'keyboard-signale
#18, BEL_MOUSEC,BEL_MOUSED 'maus-signale
#20, BEL_VIDBASE 'video-signale(3pin)
#23, BEL_SELECT 'belatrix-auswahlsignal
#24, HBEAT 'front-led
BUSCLK 'bustakt
BUS_WR '/wr - schreibsignal
BUS_HS ' '/hs - quittungssignal
'system
'
' hbeat --------+
' clk -------+|
' /wr ------+||
' /hs -----+||| +------------------------- /cs
' |||| | -------- d0..d7
DB_IN = %00001001_00000000_00000000_00000000 'maske: dbus-eingabe
DB_OUT = %00001001_00000000_00000000_11111111 'maske: dbus-ausgabe
DB_OFF = %00000000_00000000_00000000_00000000 'maske: bus inaktiv
M1 = %00000010_00000000_00000000_00000000
M2 = %00000010_10000000_00000000_00000000 'busclk=1? & /cs=0?
M3 = %00000000_00000000_00000000_00000000
M4 = %00000010_00000000_00000000_00000000 'busclk=0?
VAR
byte heap[PROGLEN] 'programmspeicher
byte proghdr[16] 'puffer für objektkopf
PUB main | spinbin,i 'loader: hauptroutine
{{main - loader: hauptroutine}}
outa[bus_hs] := 1 'handshake inaktiv ,frida
dira := db_in 'datenbus auf eingabe schalten ,frida
spinbin := load 'bellatrix-code laden
dira := db_off 'buszugriff deaktivieren
run(spinbin) 'code ausführen & loader-cog beenden
PRI errorled(time) 'loader: fehleranzeige über hbeat-led
{{errorled(time) - loader: fehleranzeige über hbeat-led}}
repeat
!outa[hbeat]
waitcnt(10_000_000 * time + cnt)
PRI run(spinptr) 'loader: bin-datei bei adresse starten
{{run(spinprt) - loader: bin-datei bei adresse starten}}
if spinptr
cognew(INTERPRETER, spinptr+4) 'neuen cog mit objekt starten
PRI load | rc,ii,plen,progptr 'loader: datei in heap laden
{{load - loader: datei vom bus in den heap laden
1. empf 16 Byte BIN-Dateiheader
2. send 2 Byte Objektlänge (h/l)
3. empf n Bytes komplette Datein inkl. Header
}}
' kopf der bin-datei einlesen ------------------------------------------------------
repeat ii from 0 to 15 '16 bytes --> proghdr
byte[@proghdr][ii] := bus_getchar
plen := word[@proghdr+$A] '$a ist stackposition und damit länge der objektdatei
if plen > PROGLEN 'objekt größer als verfügberer speicher?
errorled(1)
' objektlänge an regnatix senden
bus_putchar(plen >> 8) 'hsb senden
bus_putchar(plen & $FF) 'lsb senden
' bin-datei einlesen ------------------------------------------------------
progptr := @heap
progptr := (progptr + 4) & !3
repeat ii from 0 to plen-1 'datei --> heap
byte[progptr][ii] := bus_getchar
' zeiger im header mit offset versehen ------------------------------------------------------
repeat ii from 0 to 4
Word[progptr+6+ii<<1] += progptr
' variablenbereich löschen ------------------------------------------------------
rc := word[@proghdr+$8]
repeat ii from rc to plen step 4
long[progptr + ii] := 0
' stackwerte setzen? ------------------------------------------------------
long[progptr+plen-4] := $fff9ffff
long[progptr+plen-8] := $fff9ffff
return progptr
PUB bus_putchar(zeichen) 'BUS: Ein Byte über BUS ausgeben
{{ein byte über bus ausgeben Belltrix --> Regnatix}}
waitpeq(M1,M2,0) 'busclk=1? & prop2=0?
dira := db_out 'datenbus auf ausgabe stellen
outa[7..0] := zeichen 'daten ausgeben
outa[bus_hs] := 0 'daten gültig
waitpeq(M3,M4,0) 'busclk=0?
dira := db_in 'bus freigeben
outa[bus_hs] := 1 'daten ungültig
PUB bus_getchar : zeichen 'BUS: Ein Byte über BUS empfangen
{{ein byte über bus empfangen Regnatix --> Bellatrix}}
waitpeq(M1,M2,0) 'busclk=1? & prop2=0?
zeichen := ina[7..0] 'daten einlesen
outa[bus_hs] := 0 'daten quittieren
outa[bus_hs] := 1
waitpeq(M3,M4,0) 'busclk=0?
DAT
{{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ TERMS OF USE: MIT License │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
│is furnished to do so, subject to the following conditions: │
│ │
│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
│ │
│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
}}