198 lines
20 KiB
Plaintext
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. │
|
|
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
}}
|