253 lines
11 KiB
Plaintext
253 lines
11 KiB
Plaintext
{{
|
|
┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
│ Autor: Ingo Kripahle Anpassungen:Reinhard Zielinski │
|
|
│ Copyright (c) 2013 Ingo Kripahle │
|
|
│ See end of file for terms of use. │
|
|
│ Die Nutzungsbedingungen befinden sich am Ende der Datei │
|
|
└──────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
Informationen : hive-project.de
|
|
Kontakt : zille9@googlemail.com
|
|
System : Hive
|
|
Name : Bus-Erweiterung für Hive-Computer
|
|
Chip : Venatrix-Bus-Protokoll
|
|
Typ : EEProm-Urfile
|
|
Version : 00
|
|
Subversion : 01
|
|
Funktion : Bus-System für Erweiterungsmodule
|
|
|
|
Der integrierte Loader kann Venatrix mit einem beliebigen Code versorgen
|
|
|
|
|
|
COG's : MANAGMENT 1 COG
|
|
-------------------
|
|
1 COG
|
|
|
|
}}
|
|
CON
|
|
_CLKMODE = XTAL1 + PLL16X
|
|
_XINFREQ = 5_000_000
|
|
|
|
' /cs --------+
|
|
' clk -------+|
|
|
' /wr ------+||
|
|
' /hs -----+||| +------------------------- /cs ->bei Venatrix P24 statt P23
|
|
' |||| | -------- d0..d7
|
|
DB_IN = %00001000_00000000_00000000_00000000 'maske: dbus-eingabe
|
|
DB_OUT = %00001000_00000000_00000000_11111111 'maske: dbus-ausgabe
|
|
|
|
M1 = %00000010_00000000_00000000_00000000 'busclk=1? & /cs=0?
|
|
M2 = %00000011_00000000_00000000_00000000 'maske: busclk & /cs (/prop4)
|
|
|
|
M3 = %00000000_00000000_00000000_00000000 'busclk=0?
|
|
M4 = %00000010_00000000_00000000_00000000 'maske busclk
|
|
|
|
|
|
#24, BUS_CS 'Chip-Select
|
|
BUSCLK 'bustakt
|
|
BUS_WR '/wr - schreibsignal
|
|
BUS_HS ' '/hs - quittungssignal
|
|
|
|
STRCOUNT =64 'Größe des Stringpuffers
|
|
|
|
Var
|
|
byte proghdr[16] 'puffer für objektkopf
|
|
long plen 'länge datenblock loader
|
|
byte strpuffer[STRCOUNT] 'stringpuffer
|
|
|
|
PUB bus_init 'bus: initialisiert bussystem
|
|
{{bus_init - bus: initialisierung aller bussignale }}
|
|
|
|
dira:= db_in ' datenbus auf eingabe schalten
|
|
outa[bus_hs] := 1 ' handshake inaktiv ,frida
|
|
'outa[23..8] := 0 ' Port 2 und 3 Null setzen
|
|
|
|
PUB bus_putchar(zeichen) 'chip: ein byte über bus ausgeben
|
|
''funktionsgruppe : chip
|
|
''funktion : senderoutine für ein byte zu regnatix über den systembus
|
|
''eingabe : byte zeichen
|
|
''ausgabe : -
|
|
|
|
waitpeq(M1,M2,0) 'busclk=1? & /prop1=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
|
|
outa[bus_hs] := 1 'daten ungültig
|
|
|
|
PUB bus_getchar : zeichen 'chip: ein byte über bus empfangen
|
|
''funktionsgruppe : chip
|
|
''funktion : emfangsroutine für ein byte von regnatix über den systembus
|
|
''eingabe : -
|
|
''ausgabe : byte zeichen
|
|
waitpeq(M1,M2,0) 'busclk=1? & prop4=0?
|
|
zeichen := ina[7..0] 'daten einlesen
|
|
outa[bus_hs] := 0 'daten quittieren
|
|
waitpeq(M3,M4,0) 'busclk=0?
|
|
outa[bus_hs] := 1
|
|
|
|
PUB bus_putstr(stradr) | len,i 'bus: string zu administra senden
|
|
|
|
len := strsize(stradr)
|
|
bus_putchar(len)
|
|
repeat i from 0 to len - 1
|
|
bus_putchar(byte[stradr++])
|
|
|
|
PUB bus_getstr: stradr | len,i 'bus: string von administra empfangen
|
|
|
|
len := bus_getchar 'längenbyte empfangen
|
|
repeat i from 0 to len - 1 '20 zeichen dateinamen empfangen
|
|
strpuffer[i] := bus_getchar
|
|
strpuffer[i] := 0
|
|
return @strpuffer
|
|
|
|
PUB bus_getword: wert 'bus: 16 bit von bellatrix empfangen hsb/lsb
|
|
|
|
wert := bus_getchar << 8
|
|
wert := wert + bus_getchar
|
|
|
|
PUB bus_putword(wert) 'bus: 16 bit an bellatrix senden hsb/lsb
|
|
|
|
bus_putchar(wert >> 8)
|
|
bus_putchar(wert)
|
|
|
|
PUB bus_getlong: wert 'bus: long von bellatrix empfangen hsb/lsb
|
|
|
|
wert := bus_getchar << 24 '32 bit empfangen hsb/lsb
|
|
wert := wert + bus_getchar << 16
|
|
wert := wert + bus_getchar << 8
|
|
wert := wert + bus_getchar
|
|
|
|
PUB bus_putlong(wert) 'bus: long an bellatrix senden hsb/lsb
|
|
|
|
bus_putchar(wert >> 24) '32bit wert senden hsb/lsb
|
|
bus_putchar(wert >> 16)
|
|
bus_putchar(wert >> 8)
|
|
bus_putchar(wert)
|
|
|
|
con'------------------------------------------------ Chiploader -------------------------------------------------------------------------------------------------------------------
|
|
PUB mgr_getcogs: cogs |i,c,cog[8] 'cmgr: abfragen wie viele cogs in benutzung sind
|
|
''funktionsgruppe : cmgr
|
|
''funktion : abfrage wie viele cogs in benutzung sind
|
|
''eingabe : -
|
|
''ausgabe : cogs - anzahl der cogs
|
|
''busprotokoll : [097][put.cogs]
|
|
'' : cogs - anzahl der belegten cogs
|
|
|
|
cogs := i := 0
|
|
repeat 'loads as many cogs as possible and stores their cog numbers
|
|
c := cog[i] := cognew(@entry, 0)
|
|
if c=>0
|
|
i++
|
|
while c => 0
|
|
cogs := i
|
|
repeat 'unloads the cogs and updates the string
|
|
i--
|
|
if i=>0
|
|
cogstop(cog[i])
|
|
while i=>0
|
|
|
|
|
|
PUB mgr_load|i 'cmgr: venatrix-loader
|
|
''funktionsgruppe : cmgr
|
|
''funktion : funktion um einen neuen code in bellatrix zu laden
|
|
''
|
|
|
|
' kopf der bin-datei einlesen ------------------------------------------------------
|
|
repeat i from 0 to 15 '16 bytes --> proghdr
|
|
byte[@proghdr][i] := bus_getchar
|
|
|
|
plen := 0
|
|
plen := byte[@proghdr + $0B] << 8
|
|
plen := plen + byte[@proghdr + $0A]
|
|
plen := plen - 8
|
|
|
|
' objektlänge an regnatix senden
|
|
bus_putchar(plen >> 8) 'hsb senden
|
|
bus_putchar(plen & $FF) 'lsb senden
|
|
|
|
repeat i from 0 to 7 'alle anderen cogs anhalten
|
|
ifnot i == cogid
|
|
cogstop(i)
|
|
|
|
dira := 0 'diese cog vom bus trennen
|
|
cognew(@loader, plen)
|
|
|
|
cogstop(cogid) 'cog 0 anhalten
|
|
|
|
DAT
|
|
org 0
|
|
|
|
loader
|
|
mov outa, M_0 'bus inaktiv
|
|
mov dira, DINP 'bus auf eingabe schalten
|
|
mov reg_a, PAR 'parameter = plen
|
|
mov reg_b, #0 'adresse ab 0
|
|
|
|
' datenblock empfangen
|
|
loop
|
|
call #get 'wert einlesen
|
|
wrbyte in, reg_b 'wert --> hubram
|
|
add reg_b, #1 'adresse + 1
|
|
djnz reg_a, #loop
|
|
|
|
' neuen code starten
|
|
|
|
rdword reg_a, #$A ' Setup the stack markers.
|
|
sub reg_a, #4 '
|
|
wrlong SMARK, reg_a '
|
|
sub reg_a, #4 '
|
|
wrlong SMARK, reg_a '
|
|
|
|
rdbyte reg_a, #$4 ' Switch to new clock mode.
|
|
clkset reg_a '
|
|
|
|
coginit SINT ' Restart running new code.
|
|
|
|
|
|
cogid reg_a
|
|
cogstop reg_a 'cog hält sich selbst an
|
|
|
|
|
|
get
|
|
waitpeq M_1, M_2 'busclk=1? & /cs=0?
|
|
mov in, ina 'daten einlesen
|
|
and in, DMASK 'wert maskieren
|
|
mov outa, M_3 'hs=0
|
|
waitpeq M_3, M_4 'busclk=0?
|
|
mov outa, M_0 'hs=1
|
|
get_ret ret
|
|
|
|
|
|
' /cs --------+
|
|
' clk -------+|
|
|
' /wr ------+||
|
|
' /hs -----+|||+------------------------- /cs ->geändert auf 24
|
|
' ||||| -------- d0..d7
|
|
DINP long %00001000000000000000000000000000 'constant dinp hex \ bus input
|
|
DOUT long %00001000000000000000000011111111 'constant dout hex \ bus output
|
|
|
|
M_0 long %00001000000000000000000000000000 'bus inaktiv
|
|
|
|
M_1 long %00000010000000000000000000000000
|
|
M_2 long %00000011000000000000000000000000 'busclk=1? & /cs=0?
|
|
|
|
M_3 long %00000000000000000000000000000000
|
|
M_4 long %00000010000000000000000000000000 'busclk=0?
|
|
|
|
|
|
DMASK long %00000000000000000000000011111111 'datenmaske
|
|
|
|
SINT long ($0001 << 18) | ($3C01 << 4) ' Spin interpreter boot information.
|
|
SMARK long $FFF9FFFF ' Stack mark used for spin code.
|
|
|
|
in res 1
|
|
reg_a res 1
|
|
reg_b res 1
|
|
Dat
|
|
|
|
' Entry: dummy-assemblercode fuer cogtest
|
|
'
|
|
entry jmp entry 'just loops
|