Compare commits

..

11 Commits

Author SHA1 Message Date
Jörg Deckert 7b97da36e8 Administra: add signalgenerator (Plexus 2.10) 2014-11-20 16:20:23 +01:00
Jörg Deckert 614f239fc2 Update doku 2014-07-23 14:09:58 +02:00
Jörg Deckert 6cfa45140b Merge branch 'webserver' 2014-07-23 10:21:15 +02:00
Joerg Deckert 6872d9d008 websrv: re-init connection forever 2014-07-23 08:23:25 +02:00
Joerg Deckert 7b7e5bde66 support abort in administra network code, re-init connections in websrv 2014-07-15 19:35:38 +02:00
Joerg Deckert 86f42864ec many improvements, fully working now 2014-06-29 20:14:38 +02:00
Joerg Deckert 2bdb7084da first working web server example 2014-06-25 20:14:54 +02:00
Jörg Deckert f0f52300be change coding of admflash.spin back to utf-8 2014-06-24 13:25:27 +02:00
drohne235 945cf16706 korrektur admflash/plx 2014-06-23 20:35:54 +02:00
Joerg Deckert 58f833001c add skeleton of webserver code 2014-06-23 18:26:09 +02:00
Joerg Deckert 8374973638 update to TriOS R57 changes 2014-06-22 20:08:25 +02:00
40 changed files with 2366 additions and 750 deletions

346
README.md
View File

@ -1,25 +1,36 @@
INHALT HIVE TriOS
====== ==========
1. Installation des Grundsystems Beschreibung
2. Regime im Überblick ------------
3. Forth im Überblick
TriOS ist ein in SPIN geschriebenes Betriebssystem für den HIVE Computer.
Für weitere Informationen wird auf die Webseite des Projektes verwiesen:
http://hive-project.de
Installations-Varianten
-----------------------
1. Installation des Grundsystems: Zur Installation von TriOS auf dem Hive stehen 3 verschiedene Varianten zur
================================= Verfügung, welche am Ende aber dasselbe Ergebnis erzielen:
TriOS kann in zwei Versionen installiert werden: Mit oder ohne Forth als Binäres Archiv: HIVE-TriOS-Rxx-bin.zip
integrierte Programmiersprache. Als Standard wird das System ohne Forth Source-Archiv: HIVE-TriOS-Rxx-src.zip
installiert. Die Installation ist so für den Einsteiger einfacher. Möchte Git Repository: https://dev.bitquell.de/summary/HIVE/TriOS.git
man auch PropForth installieren, muß nur eine Konfiguration geändert werden
und ein Basiswortschatz im Forth selbst kompiliert werden. Das binäre Archiv kann sofort installiert werden. Wer selbst an den Quellen
Änderungen vornehmen, sollte stattdessen das Source-Archiv nutzen oder gleich
das top-aktuelle Git Repository nutzen.
Bei Nutzung des Source-Archives oder des Git-Repository müssen die Quellen vor
der Installation noch compiliert werden.
WICHTIG: Das System kann nur mit Brat's Spin Tool - kurz BST - compiliert WICHTIG: Das System kann nur mit Brat's Spin Tool - kurz BST - compiliert
werden. In den Einstellungen des Compilers (Tools/Compiler werden. In den Einstellungen des Compilers
Preferences/Search Paths) muss das lib-Verzeichnis eingetragen werden. (Tools/Compiler Preferences/Search Paths) muss das lib-Verzeichnis eingetragen
werden.
Downloadlink BST: http://www.fnarfbargle.com/bst.html Downloadlink BST: http://www.fnarfbargle.com/bst.html
@ -29,308 +40,5 @@ Voraussetzung ist, daß sich die Commandline-Version des Compilers (bstc) im
Pfad befindet. Pfad befindet.
Downloadlink BSTC: http://www.fnarfbargle.com/bst/bstc/Latest/ Downloadlink BSTC: http://www.fnarfbargle.com/bst/bstc/Latest/
Genaue Installation-Anleitungen und Einführungen befinden sich im Verzeichnis
Installation ohne Forth (Standard): "doku".
-----------------------------------
1. Mikrocontroller flashen:
\flash\administra\admflash.spin --> Administra
\flash\bellatrix\belflash.spin --> Bellatrix
\flash\regnatix\regflash.spin --> Regnatix
Installation mit Forth:
-----------------------
1. Mikrocontroller flashen:
\flash\administra\admflash.spin --> Administra
\flash\bellatrix\belflash.spin --> Bellatrix
\flash\regnatix\regforth.spin --> Regnatix
2. Der Schalter bleibt ab jetzt auf Regnatix stehen. Ein Terminalprogramm (ich
verwende Tera Term) starten und 57600 Baud auf die Schnittstelle vom Hive
(DIP steht auf Regnatix!) einstellen. Nach einem Reset meldet sich das
Propforth im Terminalprogramm auf dem Hostcomputer. Datei "forth\basics.mod"
in einem Editor öffnen, alles markieren, kopieren und im Terminal einfügen.
Der Quelltext wird jetzt im Forth compiliert.
3. Im Terminalfenster, also im Forth, dass Kommendo "saveforth" eingeben. Damit
wird das gesamte Forthsystem mit der gerade neu compilierten Erweiterungen
wieder im EEPROM als Image gespeichert.
Nach einem Reset sollte sich das Forth jetzt komplett mit seinem Prompt sowohl
auf dem angeschlossenen VGA-Monitor, als auch im Terminal melden. Im Prinzip
benötigen wir nun das Terminalprogramm nicht mehr und können direkt am Hive
arbeiten. Später, wenn man in Forth programmiert, ist die vorhandene
Terminalschnittstelle aber manchmal sehr nützlich.
Erstellen der SDCard:
---------------------
Im Prinzip kann jede normale FAT16/32 Karte verwendet werden. Lange Dateinamen
werden nicht verwendet, Unterverzeichnisse sind kein Problem. Es ist sinnvoll,
alle Dateien aus dem Verzeichnis "bin\sd-card\" auf die SD-Karte zu kopieren.
Das Verzeichnis "system" hat eine besondere Bedeutung: Hier sollten sich die
Tools, Erweiterungen und Bibliotheken befinden. Im PropForth: Mit dem Kommando
"sys name.f" kann aus jedem anderen Verzeichnis ohne Wechsel eine Datei name.f
im Verzeichnis System geladen und compiliert werden.
Systemstart:
------------
Beim Systemstart wird immer das Forth aus dem EEPROM gestartet. So kann, wie
mit den klassischen Homecomputern, sofort unkompliziert programmiert werden.
Neben dem Forth gibt es im TriOS noch ein in Spin programmiertes Betriebssystem,
welches sich dem Benutzer durch den Kommandointerpreter Regime präsentiert. Aus
dem Forth kann diese mit dem Kommando "regime" gestartet werden. Im Gegenzug
kann im laufenden Regime mit dem Kommando "forth" wieder zur integrierten
Programmiersprache gewechselt werden.
Wurde TriOS ohne Forth installiert, wird der Loader aus dem EEPROM gestartet und
sofort die Kommandozeile "Regime" aus der Datei reg.sys gestartet.
3. Regime im Überblick
======================
Da wir ja drei verschiedene Teilsystem in unserem Computer haben, muss Regime
wissen, für welchen Chip eine ausführbare Datei bestimmt ist. Den Typ
ausführbarer Dateien kann Regime automatisch anhand der Dateinamenserweiterung
unterscheiden:
*.bin Regnatix-Code
*.bel Bellatrix-Code
*.adm Administra-Code
Dabei genügt es, den Namen ohne Erweiterung einzugeben. Dennoch kann es
vorkommen, das man eine normale Spin-Datei mit einer beliebigen Erweiterung
gespeichert hat. Diese Datei kann man dann mit den Kommandos rload, aload oder
bload ganz gezielt in einen Chip laden.
<dateiname> - bin/adm/bel-datei wird gestartet
mount - SD-aufwerk mounten
unmount - SD-Laufwerk freigeben
dir wh - Verzeichnis anzeigen
type <sd:fn> - Anzeige einer Textdatei
aload <sd:fn> - Administra-Code laden
bload <sd:fn> - Bellatrix-Code laden
rload <sd:fn> - Regnatix-Code laden
del <sd:fn> - Datei löschen
cls - Bildschirm löschen
free - Anzeige des freien Speichers auf SD-Card
attrib <sd:fn> ashr - Dateiattribute ändern
cd <sd:dir> - Verzeichnis wechseln
mkdir <sd:dir> - Verzeichnis erstellen
rename <sd:fn1> <sd:fn2> - datei/verzeichnis umbenennen
format <volname> - SD-Laufwerk formatieren
reboot - Hive neu starten
sysinfo - Systeminformationen
ipconfig - Netzwerk-Konfiguration
color <0..7> - Farbe wählen
cogs - Belegung der COG's anzeigen
dmlist - Anzeige der Verzeichnis-Marker
dm <r/s/u/a/b/c> - Marker-Verzeichnis wechseln
dmset <r/s/u/a/b/c> - Marker setzen
dmclr <r/s/u/a/b/c> - Marker löschen
forth - Forth starten
Marker:
r - Marker für Root-Verzeichnis
s - Marker für System-Verzeichnis
u - Marker für User-Verzeichnis
a/b/c - Benutzerdefinierte Verzeichnismarker
Die r, s, u-Marker werden vom System automatisch gesetzt und intern verwendet.
RAMDISK:
xload <sd:fn> - Datei von SD-Laufwerk in RAM laden
xsave <x:fn> - Datei aus RAM auf SD-Laufwerk speichern
xdir - Verzeichnis im RAM anzeigen
xrename <x:fn1> <x:fn2> - Datei im RAM umbenennen
xdel <x:fn> - Datei im RAM löschen
xtype <x:fn> - Textdatei im RAM anzeigen
EXTERNE KOMMANDOS:
------------------
Die meisten Kommandozeilentools zeigen mit dem Parameter /? eine Liste der
Optionen an.
sysconf - Systemeinstellungen
hplay - HSS-Player
wplay - WAV-Player
splay - SID-Player
yplay - Yamaha-Soundchip-Player
sfxtool - HSS-Soundeffekte erstellen
ftp - FTP-Client
irc - IRC Client
vga.bin - VGA 1024 x 768 Pixel, 64 x 24 Zeichen
htext.bin - VGA 1024 x 768 Pixel, 128 x 48 Zeichen
tv.bin - TV-Textmodus 40 x 13 Zeichen
2. Forth im Überblick:
======================
Einige nützliche Kommandos befinden sich in dem Modul tools.mod. In den meisten
Fällen ist es sinnvoll dieses Modul mit der Befehlssequenz
"sys tools.mod saveforth" fest im Forth einzubinden.
Wichtige Tastencodes:
---------------------
[ESC]-1 Screen 1, COG 1
[ESC]-2 Screen 2, COG 2
[ESC]-3 Screen 3, COG 3
[ESC]-b Break, Reset der aktuellen COG
[ESC]-r Reset, Neustart Regnatix
Wichtige Kommandos:
-------------------
load <name> - Datei laden und comilieren, Ausgabe Screen 3
dload <name> - wie load, aber Ausgabe aktueller Screen
sys <name> - Datei aus sys-Verzeichnis laden und compilieren
ls - Dateiliste
lsl - Dateiliste- Long-Format
cd <name> - in Verzeichniss wechseln
mount - SD-Card einbinden
unmount - SD-Card freigeben
words - Anzeige Wöterbuch
mod? - (tools.mod) Anzeige compilierter Erweiterungen
lib? - (tools.mod) Anzeige compilierter Bibliotheken
cog? - (tools.mod) Anzeige COG-Liste
cat <name> - (tools.mod) Ausgabe einer Textdatei
less <name> - (tools.mod) Zeilenweise Textausgabe
dm? - (tools.mod) Anzeige der Systemverzeichnisse
regime - CLI starten
aload <name> - Adminsitra-Code laden
bload <name> - Bellatrix-Code laden
spin <name> - Spin-Programm starten
Wichtige Dateien:
-----------------
Die Dateien *.mod und *.lib enthalten ganz normale Forth-Quelltexte. Damit hat
man schnell eine Übersicht über die grobe Funktion dieser Quellen: Lib's sind
halt reine Sammlungen von Worten zu einer bestimmten Funktionsgruppe und MOD's
sind mehr oder weniger fertige und abgeschlossene Programme. Ein Beispiel:
Die Datei hss.lib enthält Worte um die HSS-Funktionen von Administra
anzusprechen. Mit diesen Funktionen kann man nun ein Modul (Programm) wie einen
HSS-Soundplayer schreiben.
Im Gegensatz dazu die Datei splay.mod: Mit diesem Modul wird ein HSS-Soundplayer
ins System eingefügt, welcher Funktionen aus der hss.lib verwendet.
Die Datei benötigt man aber mehr oder weniger nur zur Entwicklung, ein fertiges
Modul wie splay.mod enthält dann schon die die entsprechenden HSS-Worte die
benötigt werden.
Die ifnot: ... Anweisung sorgt dabei dafür, dass keine Funktionen doppelt in das
Wörterbuch compiliert werden. Das ist quasi ein verteiltes und fein granuliertes
Konzept analog zu einer DLL. Die Forth-Version funktioniert dabei aber im
Gegensatz zu DLL's nicht auf Bibliotheks-, sondern auf Funktionsebene.
*.mod Module, Forth-Erweiterungen für das System
*.lib Bibliotheken, grundlegende Wortsammlungen
*.adm Administra-Code (z.Bsp. admsid.adm für SIDCog-Code)
*.bel Bellatrix-Code
*.bin Spin-Code, im Normalfall zur Ausführung in Regnatix
basics.f - (mod:basics) Hive-Core für PropForth
ari.lib - (lib:ari) Zusätzliche arithmetische Funktionen
cog.lib - (lib:cog) Zusätzliche COG-Funktionen
adm.lib - (lib:adm) Administra-Chipmanagment-Funktionen
hss.lib - (lib:hss) Bibliothek für Hydra-Sound-System
sfx.lib - (lib:sfx) Soundeffekt-Bibliothek
wav.lib - (lib:wav) Wave-Soundbibliothek
bel.lib - (lib:bel) Bellatrix-Chipmanagment-Funktionen
key.lib - (lib:key) Tastatur-Bibliothek
scr.lib - (lib:scr) Screen-Bibliothek
sd0.lib - (lib:sd0) SD-Card-Bibliothek
debug.f - Nützliche Worte zur Fehlersuche und Entwicklung
rom.f - EEPROM-Dateisystem
tools.f - Nützliche Tools (cat, less, dm?...)
hplay.f - HSS-Player
wplay.f - WAV-Player
splay.f - SID-Player
Administra-Codedateien im SYS-Verzeichnis:
admled.adm Testprogramm - HBeat-LED blinken lassen
admnet.adm Netzwerk-Version (wird von ftp und irc benötigt)
admsid.adm SidCog-Version (wird von splay benötigt)
admsys.adm Standardcode für ADM mit SD/HSS/WAV
admym.adm Yamaha-Soundchip-Version
aterm96.adm Mini-OS für Administra (Testzwecke)
Reset-Fehlercodes:
------------------
0011FFFF - stack overflow
0012FFFF - return stack overflow
0021FFFF - stack underflow
0022FFFF - return stack underflow
8100FFFF - no free cogs
8200FFFF - no free main memory
8400FFFF - fl no free main memory
8500FFFF - no free cog memory
8800FFFF - eeprom write error
9000FFFF - eeprom read error
.err-Fehlercodes:
-----------------
0 no error
1 fsys unmounted
2 fsys corrupted
3 fsys unsupported
4 not found
5 file not found
6 dir not found
7 file read only
8 end of file
9 end of directory
10 end of root
11 dir is full
12 dir is not empty
13 checksum error
14 reboot error
15 bpb corrupt
16 fsi corrupt
17 dir already exist
18 file already exist
19 out of disk free space
20 disk io error
21 command not found
22 timeout
23 parameter error

View File

@ -0,0 +1,29 @@
Installation einfach (ohne FORTH)
=================================
Mikrocontroller flashen:
------------------------
\flash\administra\admflash.spin --> Administra
\flash\bellatrix\belflash.spin --> Bellatrix
\flash\regnatix\regflash.spin --> Regnatix
Erstellen der SDCard:
---------------------
Im Prinzip kann jede normale FAT16/32 Karte verwendet werden. Lange Dateinamen
werden nicht verwendet, Unterverzeichnisse sind kein Problem. Es ist sinnvoll,
alle Dateien aus dem Verzeichnis "bin\sd-card\" auf die SD-Karte zu kopieren.
Das Verzeichnis "system" hat eine besondere Bedeutung: Hier sollten sich die
Tools, Erweiterungen und Bibliotheken befinden.
Systemstart:
------------
Aus dem EEPROM wird der Loader gestartet und sofort die Kommandozeile "Regime"
aus der Datei reg.sys ausgeführt.

View File

@ -0,0 +1,52 @@
Installation mit FORTH
======================
Grundinstallation:
------------------
1. Mikrocontroller flashen:
\flash\administra\admflash.spin --> Administra
\flash\bellatrix\belflash.spin --> Bellatrix
\flash\regnatix\regforth.spin --> Regnatix
2. Der Schalter bleibt ab jetzt auf Regnatix stehen. Ein Terminalprogramm (ich
verwende Tera Term) starten und 57600 Baud auf die Schnittstelle vom Hive
(DIP steht auf Regnatix!) einstellen. Nach einem Reset meldet sich das
Propforth im Terminalprogramm auf dem Hostcomputer. Datei "forth\basics.mod"
in einem Editor öffnen, alles markieren, kopieren und im Terminal einfügen.
Der Quelltext wird jetzt im Forth compiliert. Sind alle Erweiterungen
compiliert, wird automatisch das Forth in den Flash geschrieben.
Nach einem automatischen Reset sollte sich das Forth jetzt komplett mit seinem
Prompt sowohl auf dem angeschlossenen VGA-Monitor, als auch im Terminal melden.
Im Prinzip benötigen wir nun das Terminalprogramm nicht mehr und können direkt
am Hive arbeiten. Später, wenn man in Forth programmiert, ist die vorhandene
Terminalschnittstelle aber manchmal sehr nützlich.
Erstellen der SDCard:
---------------------
Im Prinzip kann jede normale FAT16/32 Karte verwendet werden. Lange Dateinamen
werden nicht verwendet, Unterverzeichnisse sind kein Problem. Es ist sinnvoll,
alle Dateien aus dem Verzeichnis "bin\sd-card\" auf die SD-Karte zu kopieren.
Das Verzeichnis "system" hat eine besondere Bedeutung: Hier sollten sich die
Tools, Erweiterungen und Bibliotheken befinden. Im PropForth: Mit dem Kommando
"sys name.f" kann aus jedem anderen Verzeichnis ohne Wechsel eine Datei name.f
im Verzeichnis System geladen und compiliert werden.
Systemstart:
------------
Beim Systemstart wird immer das Forth aus dem EEPROM gestartet. So kann, wie
mit den klassischen Homecomputern, sofort unkompliziert programmiert werden.
Neben dem Forth gibt es im TriOS noch ein in Spin programmiertes Betriebssystem,
welches sich dem Benutzer durch den Kommandointerpreter Regime präsentiert. Aus
dem Forth kann diese mit dem Kommando "regime" gestartet werden. Im Gegenzug
kann im laufenden Regime mit dem Kommando "forth" wieder zur integrierten
Programmiersprache gewechselt werden.

106
doku/3-REGIME.md Normal file
View File

@ -0,0 +1,106 @@
3. Regime im Überblick
======================
Da wir ja drei verschiedene Teilsystem in unserem Computer haben, muss Regime
wissen, für welchen Chip eine ausführbare Datei bestimmt ist. Den Typ
ausführbarer Dateien kann Regime automatisch anhand der Dateinamenserweiterung
unterscheiden:
*.bin Regnatix-Code
*.bel Bellatrix-Code
*.adm Administra-Code
Dabei genügt es, den Namen ohne Erweiterung einzugeben. Dennoch kann es
vorkommen, das man eine normale Spin-Datei mit einer beliebigen Erweiterung
gespeichert hat. Diese Datei kann man dann mit den Kommandos rload, aload oder
bload ganz gezielt in einen Chip laden.
<dateiname> - bin/adm/bel-datei wird gestartet
mount - SD-aufwerk mounten
unmount - SD-Laufwerk freigeben
dir wh - Verzeichnis anzeigen
type <sd:fn> - Anzeige einer Textdatei
aload <sd:fn> - Administra-Code laden
bload <sd:fn> - Bellatrix-Code laden
rload <sd:fn> - Regnatix-Code laden
del <sd:fn> - Datei löschen
cls - Bildschirm löschen
free - Anzeige des freien Speichers auf SD-Card
attrib <sd:fn> ashr - Dateiattribute ändern
cd <sd:dir> - Verzeichnis wechseln
mkdir <sd:dir> - Verzeichnis erstellen
rename <sd:fn1> <sd:fn2> - datei/verzeichnis umbenennen
format <volname> - SD-Laufwerk formatieren
reboot - Hive neu starten
sysinfo - Systeminformationen
color <0..7> - Farbe wählen
cogs - Belegung der COG's anzeigen
dmlist - Anzeige der Verzeichnis-Marker
dm <r/s/u/a/b/c> - Marker-Verzeichnis wechseln
dmset <r/s/u/a/b/c> - Marker setzen
dmclr <r/s/u/a/b/c> - Marker löschen
forth - Forth starten
Marker:
r - Marker für Root-Verzeichnis
s - Marker für System-Verzeichnis
u - Marker für User-Verzeichnis
a/b/c - Benutzerdefinierte Verzeichnismarker
Die r, s, u-Marker werden vom System automatisch gesetzt und intern verwendet.
RAMDISK:
xload <sd:fn> - Datei von SD-Laufwerk in RAM laden
xsave <x:fn> - Datei aus RAM auf SD-Laufwerk speichern
xdir - Verzeichnis im RAM anzeigen
xrename <x:fn1> <x:fn2> - Datei im RAM umbenennen
xdel <x:fn> - Datei im RAM löschen
xtype <x:fn> - Textdatei im RAM anzeigen
EXTERNE KOMMANDOS:
------------------
Die meisten Kommandozeilentools zeigen mit dem Parameter /? eine Liste der
Optionen an.
beltest - Testprogramm für Bellatrix-Funktionen
charmap - Ausgabe des aktuellen nutzbaren Zeichensatzes
eram - Debugtool für eRAM/Ramdisk
flash - Flash-Tool für EEProms > 32 KByte
fm - [F]ile [M]anager
fterm - minimalstes Terminal für PropForth-Experimente
ftp - FTP-Downloadprogramm
g0test - Testprogramm der Grafikmodus 0 Funktionen (TV)
hplay - HSS-Player
ipconfig - Setup für Netzwerkparameter (IP/GW usw.)
irc - IRC-Client
keycode - Tastaturcodes anzeigen
m - Startcode für mental unter TriOS (sofern installiert)
man - Anzeige von Manual-Pages
perplex - PlexBus-Tool
ramtest - eRAM Testprogramm
rom - startet ein Image aus dem EEPROM > 32 KByte
sfxtool - HSS-Soundeffekte erstellen
splay - SID-Player
sysconf - Systemeinstellungen
tapecut - Tool um eine Containerdatei (Tape) für mental zu erzeugen
time - Zeit/Datum anzeigen bzw. im RTC setzen
websrv - Webserver (Demo)
wplay - WAV-Player
yplay - Yamaha-Soundchip-Player
Bellatrix-Codes:
vga - VGA 1024 x 768 Pixel, 64 x 24 Zeichen
htext - VGA 1024 x 768 Pixel, 128 x 48 Zeichen
tv - TV-Textmodus 40 x 13 Zeichen
Administra-Codes:
admay - Yamaha-Soundchip-Emulation
admnet - LAN + HSS-Light-Sound
admsid - SID-Chip-Emulation
admsys - HSS/WAV-Sound (Defaultcode)

149
doku/4-FORTH.md Normal file
View File

@ -0,0 +1,149 @@
Forth im Überblick:
===================
Einige nützliche Kommandos befinden sich in dem Modul tools.mod. In den meisten
Fällen ist es sinnvoll dieses Modul mit der Befehlssequenz
"sys tools.mod saveforth" fest im Forth einzubinden.
Wichtige Tastencodes:
---------------------
[ESC]-1 Screen 1, COG 1
[ESC]-2 Screen 2, COG 2
[ESC]-3 Screen 3, COG 3
[ESC]-b Break, Reset der aktuellen COG
[ESC]-r Reset, Neustart Regnatix
Wichtige Kommandos:
-------------------
load <name> - Datei laden und comilieren, Ausgabe Screen 3
dload <name> - wie load, aber Ausgabe aktueller Screen
sys <name> - Datei aus sys-Verzeichnis laden und compilieren
ls - Dateiliste
lsl - Dateiliste- Long-Format
cd <name> - in Verzeichniss wechseln
mount - SD-Card einbinden
unmount - SD-Card freigeben
words - Anzeige Wöterbuch
mod? - (tools.mod) Anzeige compilierter Erweiterungen
lib? - (tools.mod) Anzeige compilierter Bibliotheken
cog? - (tools.mod) Anzeige COG-Liste
cat <name> - (tools.mod) Ausgabe einer Textdatei
less <name> - (tools.mod) Zeilenweise Textausgabe
dm? - (tools.mod) Anzeige der Systemverzeichnisse
regime - CLI starten
aload <name> - Adminsitra-Code laden
bload <name> - Bellatrix-Code laden
spin <name> - Spin-Programm starten
Wichtige Dateien:
-----------------
Die Dateien *.mod und *.lib enthalten ganz normale Forth-Quelltexte. Damit hat
man schnell eine Übersicht über die grobe Funktion dieser Quellen: Lib's sind
halt reine Sammlungen von Worten zu einer bestimmten Funktionsgruppe und MOD's
sind mehr oder weniger fertige und abgeschlossene Programme. Ein Beispiel:
Die Datei hss.lib enthält Worte um die HSS-Funktionen von Administra
anzusprechen. Mit diesen Funktionen kann man nun ein Modul (Programm) wie einen
HSS-Soundplayer schreiben.
Im Gegensatz dazu die Datei splay.mod: Mit diesem Modul wird ein HSS-Soundplayer
ins System eingefügt, welcher Funktionen aus der hss.lib verwendet.
Die Datei benötigt man aber mehr oder weniger nur zur Entwicklung, ein fertiges
Modul wie splay.mod enthält dann schon die die entsprechenden HSS-Worte die
benötigt werden.
Die ifnot: ... Anweisung sorgt dabei dafür, dass keine Funktionen doppelt in das
Wörterbuch compiliert werden. Das ist quasi ein verteiltes und fein granuliertes
Konzept analog zu einer DLL. Die Forth-Version funktioniert dabei aber im
Gegensatz zu DLL's nicht auf Bibliotheks-, sondern auf Funktionsebene.
*.mod Module, Forth-Erweiterungen für das System
*.lib Bibliotheken, grundlegende Wortsammlungen
*.adm Administra-Code (z.Bsp. admsid.adm für SIDCog-Code)
*.bel Bellatrix-Code
*.bin Spin-Code, im Normalfall zur Ausführung in Regnatix
basics.f - (mod:basics) Hive-Core für PropForth
ari.lib - (lib:ari) Zusätzliche arithmetische Funktionen
cog.lib - (lib:cog) Zusätzliche COG-Funktionen
adm.lib - (lib:adm) Administra-Chipmanagment-Funktionen
hss.lib - (lib:hss) Bibliothek für Hydra-Sound-System
sfx.lib - (lib:sfx) Soundeffekt-Bibliothek
wav.lib - (lib:wav) Wave-Soundbibliothek
bel.lib - (lib:bel) Bellatrix-Chipmanagment-Funktionen
key.lib - (lib:key) Tastatur-Bibliothek
scr.lib - (lib:scr) Screen-Bibliothek
sd0.lib - (lib:sd0) SD-Card-Bibliothek
debug.f - Nützliche Worte zur Fehlersuche und Entwicklung
rom.f - EEPROM-Dateisystem
tools.f - Nützliche Tools (cat, less, dm?...)
hplay.f - HSS-Player
wplay.f - WAV-Player
splay.f - SID-Player
Administra-Codedateien im SYS-Verzeichnis:
admled.adm Testprogramm - HBeat-LED blinken lassen
admnet.adm Netzwerk-Version (wird von ftp und irc benötigt)
admsid.adm SidCog-Version (wird von splay benötigt)
admsys.adm Standardcode für ADM mit SD/HSS/WAV
admym.adm Yamaha-Soundchip-Version
aterm96.adm Mini-OS für Administra (Testzwecke)
Reset-Fehlercodes:
------------------
0011FFFF - stack overflow
0012FFFF - return stack overflow
0021FFFF - stack underflow
0022FFFF - return stack underflow
8100FFFF - no free cogs
8200FFFF - no free main memory
8400FFFF - fl no free main memory
8500FFFF - no free cog memory
8800FFFF - eeprom write error
9000FFFF - eeprom read error
.err-Fehlercodes:
-----------------
0 no error
1 fsys unmounted
2 fsys corrupted
3 fsys unsupported
4 not found
5 file not found
6 dir not found
7 file read only
8 end of file
9 end of directory
10 end of root
11 dir is full
12 dir is not empty
13 checksum error
14 reboot error
15 bpb corrupt
16 fsi corrupt
17 dir already exist
18 file already exist
19 out of disk free space
20 disk io error
21 command not found
22 timeout
23 parameter error

View File

@ -10,6 +10,7 @@ Funktionen. Als erste Anwendungen sind enthalten:
- Ein FTP-Client, welcher Dateien von einem FTP-Server downloaden und in der - Ein FTP-Client, welcher Dateien von einem FTP-Server downloaden und in der
RAM-Disk im eRAM oder auf SD-Card abspeichern kann. RAM-Disk im eRAM oder auf SD-Card abspeichern kann.
- Ein vollständiger IRC-Client - Ein vollständiger IRC-Client
- Die DEmo-Version eines Webservers
Zukünftige Erweiterungen, wie die Integration in Regime und direktes Starten Zukünftige Erweiterungen, wie die Integration in Regime und direktes Starten
von Programmen aus dem Netzwerk sind geplant. von Programmen aus dem Netzwerk sind geplant.
@ -125,7 +126,18 @@ abgespeichert. Von dort könnte sie direkt gestartet werden.
IRC-Client IRC-Client
---------- ----------
siehe IRC-CLIENT.md siehe [6-IRC-CLIENT.md]
Webserver
---------
Der Webserver wird aus Regime ohne Parameter gestartet:
websrv
Damit ist der Hive mittels Browser unter seiter mittels ipconfig eingestellten
Adresse erreichbar. Zur Demonstration wird die Hive-Id und eine sich ständig
ändernde Zufallszahl angezeigt.
Schlußbemerkung Schlußbemerkung

BIN
doku/trios-logo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -1,20 +1,22 @@
r57 - xx-xx-xxxx-joergd r57-nw1.5 - 23-07-2014-joergd
======================= =============================
Allgemein: Allgemein:
- alle Spin-Dateien verwenden einheitlich UTF8-Kodierung und ein Zeilenende - alle Spin-Dateien verwenden einheitlich UTF8-Kodierung und ein Zeilenende
mit Linefeed (LF) mit Linefeed (LF)
Administra: Administra:
- Netzwerk-fähig
- nur eine Source-Datei für alle Binaries, Funktionsauswahl über Defines - nur eine Source-Datei für alle Binaries, Funktionsauswahl über Defines
- Plexbus, DCF77 und Bluetooth aus Basic/Plexus hinzugefügt - DCF77 und Bluetooth aus Basic/Plexus hinzugefügt
Netzwerk-Clients: Netzwerk-Clients:
- ipconfig - ipconfig
- FTP-Client - FTP-Client
- IRC-Client - IRC-Client
Netzwerk-Server:
- Webserver (Demo)
fm, man: fm, man:
- Textdateien mit unterschiedlichem Zeilenende (CR, LF) werden unterstützt - Textdateien mit unterschiedlichem Zeilenende (CR, LF) werden unterstützt
@ -26,22 +28,67 @@ Make-Scripts:
- Linux-Version (make.sh) - Linux-Version (make.sh)
- Erstellung verschiedener Anministra-Binaries per Defines - Erstellung verschiedener Anministra-Binaries per Defines
- Erstellung beider Regime-Flash-Versionen (mit und ohne Forth) - Erstellung beider Regime-Flash-Versionen (mit und ohne Forth)
- Release-Script
r57 - 21-06-2014-dr235
======================
admflash:
- Plexbusroutinen eingefügt
- sd_del - Heartbeat-Sound angepasst
belflash:
- per Compilerflag wählbare Monitorsettings eingefügt (57/60hz)
basic.mod (propforth):
- Bei der Installation von TriOS mit Forth muss basic.mod nur noch eingefügt
werden, damit wird automatisch geflasht und neu gestartet
lib:
- adm-enc28j60 eingefügt, Treiber Netzwerkchip
- adm-socket eingefügt, Netzwerksocket
- adm-plx Code ausgebaut
- bel-vga Monitorsettings
- glob-con Plexbus/LAN-Konstanten eingefügt
- glob-led-engine - neue lib für hbeat-led-pwm
- gui-dlbox - Redraw beschleunigt
- gui-wbox - Warnbox ist jetzt auch mit tab & esc bedienbar
- m-glob-con - konstanten für sound und plexbus eingefügt
reg-ios:
- Testfunktion für RTC
- LAN-Funktionen eingefügt
- Plexbus Funktionen eingefügt
- printblk - Stringausgabe mit Längenangabe
system/administra:
- admnet eingefügt
system/regnatix:
- fm - Optimierungen und Detailverbesserungen
- perplex - Plexbus Tool zugefügt
- regime - sysinfo zeigt jetzt auch Devices am Plexbus an
- man - Systemklänge angepasst, damit nicht ständig der Heartbeat beim Lesen
läuft
- ramtest - Anpassungen Maske/Farben
Dokumentation:
- Neustrukturierung der Texte
r56 - 11-05-2013-dr235 r56 - 11-05-2013-dr235
====================== ======================
und weiter gehts mit dem Frühjahresputz: und weiter gehts mit dem Frühjahresputz:
- umstellung Administra-Codes (admflash, admay, admsid) auf externe - umstellung Administra-Codes (admflash, admay, admsid) auf externe
Konstantendefinitionen Konstantendefinitionen
belflash: belflash:
- fehler im loader behoben - fehler im loader behoben
lib: lib:
- gui-objekte für textoberfläche eingefügt: - gui-objekte für textoberfläche eingefügt:
gui-dlbox - Listenbox für Dateien gui-dlbox - Listenbox für Dateien
@ -50,7 +97,6 @@ lib:
gui-wbox - Warnbox mit Auswahloptionen gui-wbox - Warnbox mit Auswahloptionen
system/regnatix: system/regnatix:
- Filemanager fm zugefügt - Filemanager fm zugefügt
- Mental-Loader m zugefügt - Mental-Loader m zugefügt
- Tool zum erstellen von tapes (mental-containerdateien) zugefügt - Tool zum erstellen von tapes (mental-containerdateien) zugefügt
@ -58,7 +104,6 @@ system/regnatix:
- yplay: Konstanten ausgelagert - yplay: Konstanten ausgelagert
system/sonstiges: system/sonstiges:
- Manual zugefügt: error, fm - Manual zugefügt: error, fm

View File

@ -72,6 +72,7 @@ Komponenten : HSS 1.2 Andrew Arsenault Lizenz unklar
FATEngine 01/18/2009 Kwabena W. Agyeman MIT Lizenz FATEngine 01/18/2009 Kwabena W. Agyeman MIT Lizenz
RTCEngine 11/22/2009 Kwabena W. Agyeman MIT Lizenz RTCEngine 11/22/2009 Kwabena W. Agyeman MIT Lizenz
PropTCP 12/08/2009 Harrison Pham Lizenz unklar PropTCP 12/08/2009 Harrison Pham Lizenz unklar
Propeller Signal Generator v1.2 (C) 2012 Johannes Ahlebrand Parallax Object Exchange License
COG's : MANAGMENT 1 COG COG's : MANAGMENT 1 COG
FAT/RTC 1 COG FAT/RTC 1 COG
@ -90,7 +91,7 @@ Defines : __ADM_FAT enable FAT engine (sd card handling)
__ADM_SID enable SID player __ADM_SID enable SID player
__ADM_LAN enable LAN functions __ADM_LAN enable LAN functions
__ADM_RTC enable RTC functions (FAT engine inherits it also) __ADM_RTC enable RTC functions (FAT engine inherits it also)
__ADM_PLX enable plexbus __ADM_PLX enable Plexus functions
__ADM_DCF enable DCF77 receiver __ADM_DCF enable DCF77 receiver
__ADM_BLT enable Bluetooth __ADM_BLT enable Bluetooth
__ADM_COM enable serial port __ADM_COM enable serial port
@ -151,6 +152,7 @@ Logbuch :
17-04-2013-dr235 - konstanten für administra-funktionen komplett ausgelagert 17-04-2013-dr235 - konstanten für administra-funktionen komplett ausgelagert
22-12-2013-joergd - LAN Funktionen 22-12-2013-joergd - LAN Funktionen
17-12-2014-joergd - verschiedene Administra-Code-Versionen vereinheitlicht 17-12-2014-joergd - verschiedene Administra-Code-Versionen vereinheitlicht
29-11-2014-joergd - Signalgenerator (von zille für Plexus)
Kommandoliste : Kommandoliste :
@ -269,14 +271,14 @@ CHIP_SPEC = CHIP_SPEC_FAT|CHIP_SPEC_LDR|CHIP_SPEC_HSS|CHIP_SPEC_WAV|CHIP_SPEC_SI
' clk -------+| ' clk -------+|
' /wr ------+|| ' /wr ------+||
' /hs -----+||| +------------------------- /cs ' /hs -----+||| +------------------------- /cs
' |||| |+------------------------ adm-p22 ' |||| |+------------------------ adm-p22 (int2 - port 1/2)
' |||| ||+----------------------- adm-p21 (io) ' |||| ||+----------------------- adm-p21 (int1 - port 3)
' |||| |||+---------------------- adm-p20 (rx) ' |||| |||+---------------------- adm-p20 (scl)
' |||| ||||+--------------------- adm-p19 (tx) ' |||| ||||+--------------------- adm-p19 (sda)
' |||| ||||| +------+ d0..d7 ' |||| ||||| +------+ d0..d7
' |||| ||||| | | ' |||| ||||| | |
DB_IN = %00001001_00100000_00000000_00000000 'dira-wert für datenbuseingabe DB_IN = %00001001_00000000_00000000_00000000 'dira-wert für datenbuseingabe
DB_OUT = %00001001_00100000_00000000_11111111 'dira-wert für datenbusausgabe DB_OUT = %00001001_00000000_00000000_11111111 'dira-wert für datenbusausgabe
M1 = %00000010_00000000_00000000_00000000 'busclk=1? & /prop1=0? M1 = %00000010_00000000_00000000_00000000 'busclk=1? & /prop1=0?
M2 = %00000010_10000000_00000000_00000000 'maske: busclk & /cs (/prop1) M2 = %00000010_10000000_00000000_00000000 'maske: busclk & /cs (/prop1)
@ -347,11 +349,12 @@ OBJ
com : "adm-com" 'serielle schnittstelle com : "adm-com" 'serielle schnittstelle
#endif #endif
#ifdef __ADM_LAN #ifdef __ADM_LAN
sock : "driver_socket" 'LAN sock : "adm-socket" 'LAN
num : "glob-numbers" 'Number Engine num : "glob-numbers" 'Number Engine
#endif #endif
#ifdef __ADM_PLX #ifdef __ADM_PLX
plx : "adm-plx" 'PlexBux plx : "adm-plx" 'PlexBux
signal : "adm-signalgenerator"
#endif #endif
#ifdef __ADM_DCF #ifdef __ADM_DCF
dcf : "adm-dcf" 'DCF-77 dcf : "adm-dcf" 'DCF-77
@ -553,7 +556,21 @@ PUB main | cmd,err 'chip: kommandointerpret
gc#a_plxPing: plx_ping 'abfrage ob device vorhanden ist gc#a_plxPing: plx_ping 'abfrage ob device vorhanden ist
gc#a_plxSetAdr: plx_setAddr 'adressen adda/ports für poller setzen gc#a_plxSetAdr: plx_setAddr 'adressen adda/ports für poller setzen
' ---------------------------------------------- GAMEDEVICES ' ---------------------------------------------- GAMEDEVICES
gc#a_Joy: joy_get 'Joystick abfragen (1 x 8bit Port) gc#a_Joy: plx_get_joy 'Joystick abfragen (1 x 8bit Port)
gc#a_Paddle: plx_get_paddle 'Paddle abfragen (1 x 8bit Port 1 x Analog)
gc#a_Pad: plx_get_pad 'Pad abfragen (1 x 8bit Port 2 x Analog)
' ---------------------------------------------- Venatrix-Plexus
gc#a_VexPut: plx_put_vex 'Register im Venatrix-Plexus schreiben
gc#a_VexGet: plx_get_vex 'Register im Venatrix-Plexus lesen
' ---------------------------------------------- Funktionsgenerator
gc#a_StartFunctionGenerator: plx_startgenerator
gc#a_StopFunctionGenerator: plx_stopgenerator
gc#a_PulseWidth: signal.setPulseWidth(sub_getlong)
gc#a_Frequency_HZ: signal.setFrequency(sub_getlong)
gc#a_Frequency_Centihz: signal.setFrequencyCentiHertz(sub_getlong)
gc#a_SetWaveform: signal.setWaveform(bus_getchar)
gc#a_SetDampLevel: signal.setDampLevel(sub_getlong)
gc#a_SetParameter: signal.setParameters(bus_getchar, sub_getlong, sub_getlong, sub_getlong)
#endif '__ADM_PLX #endif '__ADM_PLX
' ---------------------------------------------- WAV-FUNKTIONEN ' ---------------------------------------------- WAV-FUNKTIONEN
@ -655,7 +672,7 @@ PRI init_chip | err,i,j 'chip: initialisierung d
clr_dmarker 'dir-marker löschen clr_dmarker 'dir-marker löschen
sdfat.FATEngine sdfat.FATEngine
repeat repeat
waitcnt(cnt + clkfreq/10) waitcnt(cnt + clkfreq)
until sd_mount("B") == 0 until sd_mount("B") == 0
'err := sd_mount("B") 'err := sd_mount("B")
'siglow(err) 'siglow(err)
@ -694,8 +711,11 @@ PRI init_chip | err,i,j 'chip: initialisierung d
#endif '__ADM_COM #endif '__ADM_COM
#ifdef __ADM_PLX #ifdef __ADM_PLX
'plx-bus initialisieren
plx.init 'defaultwerte setzen, poller-cog starten plx.init 'defaultwerte setzen, poller-cog starten
plx.run 'plexbus freigeben (poller läuft) plx.run 'plexbus freigeben (poller läuft)
FunctionGenerator:=0 'Funktionsgenerator aus
#endif '__ADM_PLX #endif '__ADM_PLX
#ifdef __ADM_LAN #ifdef __ADM_LAN
@ -1378,7 +1398,7 @@ PRI sd_del | err 'sdcard: eine datei oder
sub_getstr sub_getstr
err := \sdfat.deleteEntry(@tbuf) err := \sdfat.deleteEntry(@tbuf)
sighigh(err) 'fehleranzeige siglow(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden bus_putchar(err) 'ergebnis der operation senden
PRI sd_rename | err 'sdcard: datei oder verzeichnis umbenennen PRI sd_rename | err 'sdcard: datei oder verzeichnis umbenennen
@ -2373,6 +2393,11 @@ CON ''------------------------------------------------- PLX-Funktionen
#ifdef __ADM_PLX #ifdef __ADM_PLX
VAR
byte FunctionGenerator 'On/Off Marker Funktionsgenerator
PRI plx_in | addr 'port einlesen PRI plx_in | addr 'port einlesen
addr := bus_getchar addr := bus_getchar
@ -2382,15 +2407,13 @@ PRI plx_out | addr, data 'port ausgeben
addr := bus_getchar addr := bus_getchar
data := bus_getchar data := bus_getchar
plx.halt
plx.out(addr,data) plx.out(addr,data)
plx.run
PRI plx_ch | addr, chan 'ad-wandler auslesen PRI plx_ch | addr, chan 'ad-wandler auslesen
addr := bus_getchar addr := bus_getchar
chan := bus_getchar chan := bus_getchar
plx.ad_ch(addr,chan) bus_putchar(plx.ad_ch(addr,chan))
PRI plx_getReg | reg 'poller-register lesen PRI plx_getReg | reg 'poller-register lesen
@ -2426,13 +2449,55 @@ PRI plx_setAddr | adda, ports 'adressen adda/ports fü
ports := bus_getchar 'address ports ports := bus_getchar 'address ports
plx.setadr(adda,ports) plx.setadr(adda,ports)
PRI joy_get | reg 'Joystick abfragen (1 x 8bit Port) PRI plx_get_joy 'Joystick abfragen (1 x 8bit Port)
reg:=bus_getchar '0-6 bus_putchar(!plx.getreg(plx#R_INP0))
if reg>3 and reg<7
bus_putchar(!plx.getreg(reg)) PRI plx_get_paddle 'Paddle abfragen (1 x 8bit Port 1 x Analog)
else
bus_putchar(plx.getreg(reg)) bus_putchar(!plx.getreg(plx#R_INP0))
bus_putchar(plx.getreg(plx#R_PAD0))
PRI plx_get_pad 'Pad abfragen (1 x 8bit Port 2 x Analog)
bus_putchar(!plx.getreg(plx#R_INP0))
bus_putchar(plx.getreg(plx#R_PAD0))
bus_putchar(plx.getreg(plx#R_PAD1))
PRI plx_put_vex | data, reg, addr 'Register im Venatrix-Plexus schreiben
data := bus_getchar 'datum empfangen
reg := bus_getchar 'registernummer empfangen
addr := bus_getchar 'device-adresse ampfangen
plx.vexput(data,reg,addr)
PRI plx_get_vex | reg, addr 'Register im Venatrix-Plexus lesen
reg := bus_getchar 'registernummer empfangen
addr := bus_getchar 'device-adresse empfangen
bus_putchar(plx.vexget(reg,addr))
PRI plx_startgenerator
ifnot FunctionGenerator
#ifdef __ADM_SID
sid1.stop
sid2.stop
#endif '__ADM_SID
signal.start(gc#A_SOUNDL, gc#A_SOUNDR, 32)
FunctionGenerator:=1
PRI plx_stopgenerator
if FunctionGenerator
signal.stop
#ifdef __ADM_SID
'SID soundsystem initialisieren
sidreg1 := sid1.start(gc#A_SOUNDL,0) 'erste sidcog starten, adresse der register speichern
waitcnt(cnt+(clkfreq>>8)) '
sidreg2 := sid2.start(gc#A_SOUNDR,0) 'zweite sidcog starten
#endif '__ADM_SID
FunctionGenerator:=0
CON ''------------------------------------------------- End of DCF77 FUNCTIONS CON ''------------------------------------------------- End of DCF77 FUNCTIONS
@ -2455,6 +2520,21 @@ DAT
strNVRAMFile byte "nvram.sav",0 'contains the 56 bytes of NVRAM, if RTC is not available strNVRAMFile byte "nvram.sav",0 'contains the 56 bytes of NVRAM, if RTC is not available
PRI lan_txflush | handleidx
''funktionsgruppe : lan
''funktion : Warten, bis Sendepuffer geleert ist
''eingabe : -
''ausgabe : -
''busprotokoll : [070][get.handleidx][put.ok]
'' : handleidx - lfd. Nr. der Verbindung
'' : ok - Sendepuffer leer (Wert egal)
handleidx := bus_getchar
\sock.flush(sockhandle[handleidx])
bus_putchar(TRUE)
PRI lan_start | hiveid, hivestr, strpos, macpos, i, a PRI lan_start | hiveid, hivestr, strpos, macpos, i, a
''funktionsgruppe : lan ''funktionsgruppe : lan
''funktion : Netzwerk starten ''funktion : Netzwerk starten
@ -2512,7 +2592,7 @@ PRI lan_start | hiveid, hivestr, strpos, macpos, i, a
byte[hivestr+strpos] := 0 byte[hivestr+strpos] := 0
macpos-- macpos--
sock.start(A_NETCS,A_NETSCK,A_NETSI,A_NETSO, -1, @mac_addr, @ip_addr) \sock.start(A_NETCS,A_NETSCK,A_NETSI,A_NETSO, -1, @mac_addr, @ip_addr)
lan_started := true lan_started := true
@ -2524,7 +2604,7 @@ PRI lan_stop
''busprotokoll : [072] ''busprotokoll : [072]
if lan_started if lan_started
sock.stop \sock.stop
lan_started := false lan_started := false
PRI lan_connect | ipaddr, remoteport, handle, handleidx, i PRI lan_connect | ipaddr, remoteport, handle, handleidx, i
@ -2547,8 +2627,8 @@ PRI lan_connect | ipaddr, remoteport, handle, handleidx, i
quit quit
i++ i++
ifnot (handle := sock.connect(ipaddr, remoteport, @bufmain[i*rxlen], rxlen, @buftx[i*txlen], txlen)) == -102 ifnot (handle := \sock.connect(ipaddr, remoteport, @bufmain[i*rxlen], rxlen, @buftx[i*txlen], txlen)) == -102
sock.resetBuffers(handle) \sock.resetBuffers(handle)
handleidx := handle.byte[0] 'extract the handle index from the lower 8 bits handleidx := handle.byte[0] 'extract the handle index from the lower 8 bits
sockhandle[handleidx] := handle 'komplettes handle zu handle index speichern sockhandle[handleidx] := handle 'komplettes handle zu handle index speichern
bufidx[i] :=handleidx bufidx[i] :=handleidx
@ -2559,22 +2639,36 @@ PRI lan_connect | ipaddr, remoteport, handle, handleidx, i
PRI lan_listen | port, handle, handleidx, i PRI lan_listen | port, handle, handleidx, i
''funktionsgruppe : lan ''funktionsgruppe : lan
''funktion : Port für eingehende TCP-Verbindung öffnen ''funktion : Port für eingehende TCP-Verbindung öffnen
'' bei bereits bestehendem Socket nur handleidx zurücksenden
''eingabe : - ''eingabe : -
''ausgabe : - ''ausgabe : -
''busprotokoll : [074][sub_getword.port][put.handleidx] ''busprotokoll : [074][get.handleidx][sub_getword.port][put.handleidx]
'' : handleidx - lfd. Nr. der bestehenden Verbindung ($FF wenn neu)
'' : port - zu öffnende Portnummer '' : port - zu öffnende Portnummer
'' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle) '' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle)
handleidx := bus_getchar
port := sub_getword port := sub_getword
'freien Pufferabschnitt suchen if handleidx <> $FF 'bestehender (kein neuer) Socket
if \sock.isValidHandle(sockhandle[handleidx]) 'Socket gültig
bus_putchar(handleidx) 'alten handleidx zurücksenden
return
i := 0 i := 0
if handleidx == $FF 'neue Verbindung
repeat sock#sNumSockets repeat sock#sNumSockets
'freien Pufferabschnitt suchen
if bufidx[i] == $FF '0xFF: nicht zugewiesen if bufidx[i] == $FF '0xFF: nicht zugewiesen
quit quit
i++ i++
else 'bereits aufgebaute, abgebrochende Verbindung
repeat sock#sNumSockets
if bufidx[i] == handleidx 'zum Handle gehörender Buffer
quit
i++
ifnot (handle := sock.listen(port, @bufmain[i*rxlen], rxlen, @buftx[i*txlen], txlen)) == -102 ifnot (handle := \sock.listen(port, @bufmain[i*rxlen], rxlen, @buftx[i*txlen], txlen)) == -102
handleidx := handle.byte[0] 'extract the handle index from the lower 8 bits handleidx := handle.byte[0] 'extract the handle index from the lower 8 bits
sockhandle[handleidx] := handle 'komplettes handle zu handle index speichern sockhandle[handleidx] := handle 'komplettes handle zu handle index speichern
bufidx[i] :=handleidx bufidx[i] :=handleidx
@ -2596,7 +2690,7 @@ PRI lan_waitconntimeout | handleidx, timeout, t, connected
timeout := sub_getword timeout := sub_getword
t := cnt t := cnt
repeat until (connected := sock.isConnected(sockhandle[handleidx])) or (((cnt - t) / (clkfreq / 1000)) > timeout) repeat until (connected := \sock.isConnected(sockhandle[handleidx])) or (((cnt - t) / (clkfreq / 1000)) > timeout)
bus_putchar(connected) bus_putchar(connected)
@ -2610,14 +2704,15 @@ PRI lan_close | handleidx, i
handleidx := bus_getchar handleidx := bus_getchar
sock.close(sockhandle[handleidx]) \sock.close(sockhandle[handleidx])
'reservierten Pufferabschnitt freigeben 'reservierten Pufferabschnitt freigeben
i := 0 i := 0
repeat sock#sNumSockets repeat sock#sNumSockets
if bufidx[i++] == handleidx '0xFF: nicht zugewiesen if bufidx[i] == handleidx '0xFF: nicht zugewiesen
bufidx[i++] := $FF bufidx[i] := $FF
quit quit
i++
PRI lan_rxtime | handleidx, timeout, t, rxbyte PRI lan_rxtime | handleidx, timeout, t, rxbyte
@ -2636,7 +2731,7 @@ PRI lan_rxtime | handleidx, timeout, t, rxbyte
timeout := sub_getword timeout := sub_getword
t := cnt t := cnt
repeat until (rxbyte := sock.readByteNonBlocking(sockhandle[handleidx])) => 0 or (not sock.isConnected(sockhandle[handleidx])) or (cnt - t) / (clkfreq / 1000) > timeout repeat until (rxbyte := \sock.readByteNonBlocking(sockhandle[handleidx])) => 0 or (not \sock.isConnected(sockhandle[handleidx])) or (cnt - t) / (clkfreq / 1000) > timeout
bus_putchar(rxbyte) bus_putchar(rxbyte)
@ -2656,8 +2751,8 @@ PRI lan_rxdata | handleidx, len, rxbyte, error
repeat len repeat len
ifnot error ifnot error
repeat while (rxbyte := sock.readByteNonBlocking(sockhandle[handleidx])) < 0 repeat while (rxbyte := \sock.readByteNonBlocking(sockhandle[handleidx])) < 0
ifnot sock.isConnected(sockhandle[handleidx]) ifnot \sock.isConnected(sockhandle[handleidx])
error := sock#ERRSOCKETCLOSED error := sock#ERRSOCKETCLOSED
quit quit
bus_putchar(rxbyte) bus_putchar(rxbyte)
@ -2681,8 +2776,8 @@ PRI lan_txdata | handleidx, len, txbyte, error
repeat len repeat len
txbyte := bus_getchar txbyte := bus_getchar
ifnot error ifnot error
repeat while sock.writeByteNonBlocking(sockhandle[handleidx], txbyte) < 0 repeat while \sock.writeByteNonBlocking(sockhandle[handleidx], txbyte) < 0
ifnot sock.isConnected(sockhandle[handleidx]) ifnot \sock.isConnected(sockhandle[handleidx])
error := sock#ERRSOCKETCLOSED error := sock#ERRSOCKETCLOSED
quit quit
@ -2699,7 +2794,7 @@ PRI lan_rxbyte
'' : rxbyte - empfangenes Zeichen oder '' : rxbyte - empfangenes Zeichen oder
'' : sock#RETBUFFEREMPTY (-1) wenn kein Zeichen vorhanden '' : sock#RETBUFFEREMPTY (-1) wenn kein Zeichen vorhanden
bus_putchar(sock.readByteNonBlocking(sockhandle[bus_getchar])) bus_putchar(\sock.readByteNonBlocking(sockhandle[bus_getchar]))
PRI lan_isconnected PRI lan_isconnected
''funktionsgruppe : lan ''funktionsgruppe : lan
@ -2710,7 +2805,7 @@ PRI lan_isconnected
'' : handleidx - lfd. Nr. der Verbindung '' : handleidx - lfd. Nr. der Verbindung
'' : connected - TRUE wenn verbunden, sonst FALSE '' : connected - TRUE wenn verbunden, sonst FALSE
bus_putchar(sock.isConnected(sockhandle[bus_getchar])) bus_putchar(\sock.isConnected(sockhandle[bus_getchar]))
DAT DAT
long ' long alignment for addresses long ' long alignment for addresses

View File

@ -72,6 +72,7 @@ Logbuch :
21-10-2012-uheld - Window-Funktionen 21-10-2012-uheld - Window-Funktionen
28-11-2012-uheld - wahlweise Einbindung von VGA- oder TV-Treiber über #define 28-11-2012-uheld - wahlweise Einbindung von VGA- oder TV-Treiber über #define
15-04-2013-dr235 - konstanten für bellatrix-funktionen komplett ausgelagert 15-04-2013-dr235 - konstanten für bellatrix-funktionen komplett ausgelagert
22.02.2014-dr235 - per compilerflag wählbare monitorsettings eingefügt (57/60hz)
Notizen: Notizen:
- setheader - setheader
@ -132,6 +133,14 @@ $0A..FF CHAR Zeichenausgabe
'#define __TV '#define __TV
'#define __VGA '#define __VGA
'Hier sind verschiedene Timings für den Monitor wählbar.
'Die Settings selbst befinden sich in der Datei /lib/bel-vga.spin und
'können dort auch um weitere Optionen erweitert werden.
#define __VGA_MONSET1 '60Hz
'#define __VGA_MONSET2 '57Hz
CON CON
_CLKMODE = XTAL1 + PLL16X _CLKMODE = XTAL1 + PLL16X

View File

@ -55,9 +55,9 @@ word[7] - DCURR - Stack pointer. This is the initial value of the stack pointer.
CON ' KONFIGURATION CON ' KONFIGURATION
{
Achtung: Nur eine Konfiguration wählen! Beim Bauen mittels Makefiles keines aktivieren"
} 'Achtung: Nur eine Konfiguration wählen! Beim Bauen mittels Makefiles keines aktivieren!
'#define forth ' forth + spin-loader '#define forth ' forth + spin-loader
'#define regime ' spin-loader OHNE FORTH, reg.sys wird sofort automatisch gestartet '#define regime ' spin-loader OHNE FORTH, reg.sys wird sofort automatisch gestartet

View File

@ -481,5 +481,9 @@ wvariable lcog \ nummer interaktiven cog
: _ob onboot ; : _ob onboot ;
: onboot _ob start ; : onboot _ob start ;
saveforth
reboot

View File

@ -28,26 +28,26 @@ Notizen :
OBJ OBJ
gc : "m-glob-con" gc : "glob-con"
CON CON
SCL = gc#adm_scl SCL = gc#adm_scl
SDA = gc#adm_sda SDA = gc#adm_sda
' VNX = gc#adm_int1
' portadressen sepia ' portadressen sepia
'pcf8574 %0100_ABC_0 'pcf8574 %0100_ABC_0
PORT1 = %0100_000 '$20 PORT1 = %0100_000 '$20
PORT2 = %0100_001 '$21 PORT2 = %0100_001 '$21
PORT3 = %0100_010 '$22 PORT3 = %0100_010 '$22
{
'pcf8574a %0111_ABC_0 'pcf8574a %0111_ABC_0
PORT1 = %0111_000 '$38 ' PORT1 = %0111_000 '$38
PORT2 = %0111_001 '$39 ' PORT2 = %0111_001 '$39
PORT3 = %0111_010 '$3A ' PORT3 = %0111_010 '$3A
}
' ad/da-wandler-adresse ' ad/da-wandler-adresse
'pcf8591 %1001_ABC_R 'pcf8591 %1001_ABC_R
@ -84,7 +84,7 @@ CON
R_INP0 = 4 R_INP0 = 4
R_INP1 = 5 R_INP1 = 5
R_INP2 = 6 R_INP2 = 6
' R_VNX = 7
VAR VAR
@ -120,11 +120,7 @@ PUB init 'plx: io-system initiali
'pollcog starten 'pollcog starten
plxcogid := cognew(poller,@plxstack) plxcogid := cognew(poller,@plxstack)
pub plxstop
if(plxcogid)
cogstop(plxcogid~ - 1)
lockret(-1 + plxlock~)
PRI poller 'plx: pollcog PRI poller 'plx: pollcog
repeat repeat
@ -134,18 +130,14 @@ PRI poller 'plx: pollcog
'analoge eingänge pollen 'analoge eingänge pollen
plxreg[R_PAD0] := ad_ch(adr_adda,0) plxreg[R_PAD0] := ad_ch(adr_adda,0)
plxreg[R_PAD1] := ad_ch(adr_adda,1) plxreg[R_PAD1] := ad_ch(adr_adda,1)
lockclr(plxlock) 'bus freigeben
repeat until not lockset(plxlock) 'auf freien bus warten
plxreg[R_PAD2] := ad_ch(adr_adda,2) plxreg[R_PAD2] := ad_ch(adr_adda,2)
plxreg[R_PAD3] := ad_ch(adr_adda,3) plxreg[R_PAD3] := ad_ch(adr_adda,3)
lockclr(plxlock) 'bus freigeben
repeat until not lockset(plxlock) 'auf freien bus warten
'digitale eingabeports pollen 'digitale eingabeports pollen
plxreg[R_INP0] := in(adr_port ) plxreg[R_INP0] := in(adr_port )
plxreg[R_INP1] := in(adr_port+1) plxreg[R_INP1] := in(adr_port+1)
plxreg[R_INP2] := in(adr_port+2) plxreg[R_INP2] := in(adr_port+2)
'semaphore freigeben 'semaphore freigeben
lockclr(plxlock) 'bus freigeben lockclr(plxlock) 'bus freigeben
@ -211,11 +203,27 @@ PUB ping(adr):ack 'plx: device anpingen
PUB setadr(adradda,adrport) PUB setadr(adradda,adrport)
'halt halt
adr_adda := adradda adr_adda := adradda
adr_port := adrport adr_port := adrport
ad_init(adr_adda) ad_init(adr_adda)
'run run
PUB vexput(data,regnr,adr):ack 'plx: register in venatrix-plexus setzen
start
ack := write(adr << 1)
ack := (ack << 1) | write(regnr)
ack := (ack << 1) | write(data)
stop
PUB vexget(regnr,adr):data|ack 'plx: regsiter aus venatrix-plexus auslesen
start
write((adr << 1) + 1)
write(regnr)
data := read(0)
stop
CON 'I2C-FUNKTIONEN CON 'I2C-FUNKTIONEN

View File

@ -0,0 +1,189 @@
{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Propeller Signal Generator v1.2 (C) 2012 Johannes Ahlebrand │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ TERMS OF USE: Parallax Object Exchange 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. │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
}
CON MUTE = 14, SAW = 16, TRIANGLE = 18, SQUARE = 22, NOISE = 25, SINE = 32, USER = 42, PW50 = 1<<31, PW25 = 1<<30, PW12_5 = 1<<29, freqRef = 536870912
VAR
byte cog
long waveform, frequency, damplevel, pulseWidth, userWaveformP, userWaveformSize
PUB start(outPin, invertedPin, syncPin)
' ┌──────────────────────────────────────────────────────────────┐
' │ Starts PSG in a single cog │
' ├──────────────────────────────────────────────────────────────┤
' │ outPin - The pin to output the signal on │
' │ invertedPin - The pin to output the inverted signal on │
' │ syncPin - The pin to output the synchronization signal on│
' └──────────────────────────────────────────────────────────────┘
stop
waveform := MUTE
regCounter := $1C000000 | outPin | (invertedPin<<9)
noiseValue := $10000000 '| syncPin
delayLine := (1<<invertedPin) | (1<<outPin) '| (1<<syncPin)
cog := cognew(@PSG, @waveform) + 1
PUB stop
' ┌──────────────────────────────────────────────────────────────┐
' │ Stops PSG │
' └──────────────────────────────────────────────────────────────┘
if cog
cogstop(cog~ -1)
cog := 0
PUB setWaveform(waveformType)
' ┌──────────────────────────────────────────────────────────────┐
' │ Set waveform type │
' ├──────────────────────────────────────────────────────────────┤
' │ waveformType - Which waveform from the list below to use │
' │ │
' │ #MUTE = No signal │
' │ #SAW = Saw wave │
' │ #TRIANGLE = Triangle wave │
' │ #SQUARE = Square wave │
' │ #NOISE = Noise wave │
' │ #SINE = Sine wave │
' │ #USER = User definable waveform │
' └──────────────────────────────────────────────────────────────┘
waveform := waveformType
PUB setFrequency(freq)
' ┌──────────────────────────────────────────────────────────────┐
' │ Set frequency │
' ├──────────────────────────────────────────────────────────────┤
' │ freq - The frequency in hertz (0 Hz to 7500000 Hz) │
' └──────────────────────────────────────────────────────────────┘
setFrequencyCentiHertz(freq * 100)
PUB setFrequencyCentiHertz(freq)
' ┌──────────────────────────────────────────────────────────────┐
' │ Set frequency │
' ├──────────────────────────────────────────────────────────────┤
' │ freq - The frequency in centi hertz (0 Hz to 750000000 cHz) │
' └──────────────────────────────────────────────────────────────┘
frequency := freqRef / (1000000000 / freq)
PUB setPulseWidth(pulseWidthVal)
' ┌──────────────────────────────────────────────────────────────┐
' │ Set the pulse width (square only) │
' ├──────────────────────────────────────────────────────────────┤
' │ pulseWidthVal - The 32 bit pulse width value │
' │ │
' │ Predefined pulse widths │
' │ ─────────────────────── │
' │ #PW50 = 50% (1<<31) │
' │ #PW25 = 25% (1<<30) │
' │ #PW12_5 = 12.5% (1<<29) │
' └──────────────────────────────────────────────────────────────┘
pulseWidth := pulseWidthVal
PUB setDampLevel(dampLev)
' ┌──────────────────────────────────────────────────────────────┐
' │ Set damp level │
' ├──────────────────────────────────────────────────────────────┤
' │ dampLev - The damp level (Each step equals 6 dB) │
' └──────────────────────────────────────────────────────────────┘
damplevel := dampLev
PUB setUserWaveform(address, size)
' ┌──────────────────────────────────────────────────────────────┐
' │ Set user definable waveform │
' ├──────────────────────────────────────────────────────────────┤
' │ address - The address to the waveform in memory │
' │ size - The size of the waveform (2^size) │
' └──────────────────────────────────────────────────────────────┘
userWaveformP := address
userWaveformSize := 31 - size
PUB setParameters(waveformType, frequencyInHertz, dampLev, pulseWidthValue)
' ┌──────────────────────────────────────────────────────────────┐
' │ A convenient method to set all parametes at once │
' └──────────────────────────────────────────────────────────────┘
setWaveform(waveformType)
setFrequency(frequencyInHertz)
setPulseWidth(pulseWidthValue)
setDampLevel(dampLev)
DAT org 0
PSG mov ctra, regCounter
out mov ctrb, noiseValue
waitCounter mov dira, delayLine
'───────────────────────────────────────────────────────────
mainLoop cmp :par, stopValue wz
if_z movd :par, #waveform_
if_z mov regCounter, par
:par rdlong waveform_ + 6, regCounter
add :par, val512
add regCounter, #4
sar out, damplevel_
add out, dcOffset
mov frqa, out
mov frqb, frequency_
jmp waveform_
'───────────────────────────────────────────────────────────
Mute_ mov out, #0
jmp #mainLoop
Saw_ mov out, phsb
jmp #mainLoop
Triangle_ absneg out, phsb
shl out, #1 wc
sub out, dcOffset
jmp #mainLoop
Square_ sub pulseWidth_, phsb nr, wc
negc out, maxAmplitude
jmp #mainLoop
Noise_ mov out, noiseValue
mov delayLine, phsb nr, wc
rcr delayLine, #16
cmp delayLine, cmpVal wz
if_z add noiseValue, cnt
if_z ror noiseValue, noiseValue
jmp #mainLoop
Sine_ mov out, phsb wc
shr out, #19
test out, sin_90 wz
negnz out, out
or out, sin_table
shl out, #1
rdword out, out
negc out, out
shl out, #15
jmp #mainLoop
User_ mov out, phsb
shr out, userWaveformSize_
add out, userWaveformP_
rdword out, out
shl out, #16
jmp #mainLoop
'───────────────────────────────────────────────────────────
stopValue rdlong waveform_ + 6, regCounter
sin_90 long $0800
sin_table long $E000>>1
cmpVal long $FFFF
dcOffset long 1<<31
maxAmplitude long(1<<31)-1
val512 long 1<<9
regCounter long 1
noiseValue long 1
delayLine long 1
waveform_ res 1
frequency_ res 1
damplevel_ res 1
pulseWidth_ res 1
userWaveformP_ res 1
userWaveformSize_ res 1

View File

@ -60,7 +60,7 @@ CON
ERRSOCKETCLOSED = ERR - 3 ' socket closed, could not perform operation ERRSOCKETCLOSED = ERR - 3 ' socket closed, could not perform operation
OBJ OBJ
nic : "driver_enc28j60" nic : "adm-enc28j60"
'ser : "SerialMirror" 'ser : "SerialMirror"
'stk : "Stack Length" 'stk : "Stack Length"

View File

@ -20,8 +20,9 @@
CON CON
' 1024 x 768 @ 60Hz settings
' 1024 x 768 @ H:48KHz V:60Hz settings
#ifdef __VGA_MONSET1
hp = 1024 'horizontal pixels hp = 1024 'horizontal pixels
vp = 768 'vertical pixels vp = 768 'vertical pixels
hf = 24 'horizontal front porch pixels hf = 24 'horizontal front porch pixels
@ -31,6 +32,20 @@ CON
vs = 6 'vertical sync lines vs = 6 'vertical sync lines
vb = 29 'vertical back porch lines vb = 29 'vertical back porch lines
pr = 65 'pixel rate in MHz at 80MHz system clock (5MHz granularity) pr = 65 'pixel rate in MHz at 80MHz system clock (5MHz granularity)
#endif __VGA_MONSET1
' 1024 x 768 @ H:45KHz V:57Hz settings
#ifdef __VGA_MONSET2
hp = 1024 'horizontal pixels
vp = 768 'vertical pixels
hf = 16 'horizontal front porch pixels
hs = 96 'horizontal sync pixels
hb = 176 'horizontal back porch pixels
vf = 1 'vertical front porch lines
vs = 3 'vertical sync lines
vb = 28 'vertical back porch lines
pr = 60 'pixel rate in MHz at 80MHz system clock (5MHz granularity)
#endif __VGA_MONSET2
ht = hp + hf + hs + hb 'total scan line pixels ht = hp + hf + hs + hb 'total scan line pixels

View File

@ -52,9 +52,6 @@ FL_SEL = %0000_0001 'eintrag ist selektiert
FL_FOCUS = %0000_0001 'box ist selektiert FL_FOCUS = %0000_0001 'box ist selektiert
DR_SD = 0
DR_RAM = 1
DR_BLK = 2
PUB dummy PUB dummy

View File

@ -47,6 +47,12 @@ CON 'Signaldefinitionen --------------------------------------------------------
#21, A_Bluetooth_Line 'Key-Line des HC05-Bluetooth-Moduls #21, A_Bluetooth_Line 'Key-Line des HC05-Bluetooth-Moduls
#23, A_SELECT 'administra-auswahlsignal #23, A_SELECT 'administra-auswahlsignal
'plexbus
adm_sda = 19 'i2c-datenpin
adm_scl = 20 'i2c-clockpin
adm_int1 = 21 'interrupt port 1&2
adm_int2 = 22 'interrupt port 3
CON 'KEY_CODES ------------------------------------------------------------------------------------- CON 'KEY_CODES -------------------------------------------------------------------------------------
KEY_CTRL = 2 KEY_CTRL = 2
@ -198,7 +204,8 @@ A_BLT = %00000000_00000000_00001000_00000000
a_DCF_GetYear '77 a_DCF_GetYear '77
' ---------------------------------------------- LAN-FUNKTIONEN ' ---------------------------------------------- LAN-FUNKTIONEN
#81, a_lanStart 'Start Network #80, a_lanTXFlush 'Warten, bis Sendepuffer geleert ist
a_lanStart 'Start Network
a_lanStop 'Stop Network a_lanStop 'Stop Network
a_lanConnect 'ausgehende TCP-Verbindung öffnen a_lanConnect 'ausgehende TCP-Verbindung öffnen
a_lanListen 'auf eingehende TCP-Verbindung lauschen a_lanListen 'auf eingehende TCP-Verbindung lauschen
@ -253,6 +260,14 @@ A_BLT = %00000000_00000000_00001000_00000000
a_Pad 'Pad abfragen (1 x 8bit Port 2 x Analog) a_Pad 'Pad abfragen (1 x 8bit Port 2 x Analog)
a_SetJoy 'Port für Joystick setzen a_SetJoy 'Port für Joystick setzen
a_SetPad '137 'Chan für Pad setzen a_SetPad '137 'Chan für Pad setzen
' ---------------------------------------------- Venatrix-Propeller-Slave
a_VexPut 'Register im Venatrix-Plexus schreiben
a_VexGet '139 'Register im Venatrix-Plexus lesen
' ---------------------------------------------- AY-SOUNDFUNKTIONEN
#147, a_ayStart
a_ayStop
a_ayUpdateRegisters '149
' ---------------------------------------------- WAV-FUNKTIONEN ' ---------------------------------------------- WAV-FUNKTIONEN
#150, a_sdwStart 'spielt wav-datei direkt von sd-card ab #150, a_sdwStart 'spielt wav-datei direkt von sd-card ab
@ -314,10 +329,22 @@ A_BLT = %00000000_00000000_00001000_00000000
a_s_beep a_s_beep
a_s_dmpreg '199 'soundinformationen senden a_s_dmpreg '199 'soundinformationen senden
' ---------------------------------------------- AY-SOUNDFUNKTIONEN ' ############################################## mehrfach verwendete Funktionen
#200, a_ayStart ' 200 ... 254 können mehrfach verwendet,
a_ayStop ' dürfen aber nur einmal
a_ayUpdateRegisters ' eingebunden werden
' ---------------------------------------------- Funktionsgenerator
#210, a_startFunctionGenerator
a_stopFunctionGenerator
a_PulseWidth
a_Frequency_HZ
a_Frequency_Centihz
a_SetWaveform
a_SetDampLevel
a_SetUserWaveform
a_setParameter
CON 'BELLATRIX-FUNKTIONEN -------------------------------------------------------------------------- CON 'BELLATRIX-FUNKTIONEN --------------------------------------------------------------------------

View File

@ -14,7 +14,7 @@ Chip : Regnatix
Typ : Programm Typ : Programm
Version : Version :
Subversion : Subversion :
Funktion : Funktion : Fenster mit Dateiliste
Komponenten : - Komponenten : -
COG's : - COG's : -
Logbuch : Logbuch :
@ -79,10 +79,28 @@ PUB redraw | i
i++ i++
ios.printnl ios.printnl
PUB setpos(pos) PUB setpos(npos)|opos,i,col,row
box_pos := pos opos := box_pos
redraw box_pos := npos
' redrawx(npos,opos)
ios.winset(box_win)
'alte position neu zeichnen
row := opos / box_cols
col := (opos - (row * box_cols)) * (fm#MAX_LEN + 2)
ios.wincursety(row)
ios.wincursetx(col)
print_file(box_view + opos, opos)
'neue position neu zeichnen
row := npos / box_cols
col := (npos - (row * box_cols)) * (fm#MAX_LEN + 2)
ios.wincursety(row)
ios.wincursetx(col)
print_file(box_view + npos, npos)
PUB setview(view) PUB setview(view)

View File

@ -14,7 +14,7 @@ Chip : Regnatix
Typ : Programm Typ : Programm
Version : Version :
Subversion : Subversion :
Funktion : Funktion : Eingabedialog String
Komponenten : - Komponenten : -
COG's : - COG's : -
Logbuch : Logbuch :

View File

@ -14,7 +14,7 @@ Chip : Regnatix
Typ : Programm Typ : Programm
Version : Version :
Subversion : Subversion :
Funktion : Funktion : Infodialog mit Fortschrittsbalken
Komponenten : - Komponenten : -
COG's : - COG's : -
Logbuch : Logbuch :

View File

@ -14,7 +14,7 @@ Chip : Regnatix
Typ : Programm Typ : Programm
Version : Version :
Subversion : Subversion :
Funktion : Funktion : Warndialog mit zwei Buttons
Komponenten : - Komponenten : -
COG's : - COG's : -
Logbuch : Logbuch :
@ -66,8 +66,12 @@ PUB draw(stradr1,stradr2,stradr3):button | key,bnr
case key case key
gc#KEY_CURLEFT: bnr := 1 gc#KEY_CURLEFT: bnr := 1
gc#KEY_CURRIGHT: bnr := 2 gc#KEY_CURRIGHT: bnr := 2
gc#KEY_TAB: case bnr
1: bnr := 2
2: bnr := 1
gc#KEY_ESC: bnr := 0
until key == gc#KEY_RETURN until (key == gc#KEY_RETURN) or (key == gc#KEY_ESC)
return bnr return bnr
PRI draw_buttons(stradr2,stradr3,bnr) PRI draw_buttons(stradr2,stradr3,bnr)

View File

@ -46,6 +46,12 @@ con ' signaldefinitionen
#10, ADM_SDD0,ADM_SDCLK,ADM_SDCMD,ADM_SDD3 'sd-cardreader (4 pin) #10, ADM_SDD0,ADM_SDCLK,ADM_SDCMD,ADM_SDD3 'sd-cardreader (4 pin)
#23, ADM_SELECT 'administra-auswahlsignal #23, ADM_SELECT 'administra-auswahlsignal
'plexbus
adm_sda = 19 'i2c-datenpin
adm_scl = 20 'i2c-clockpin
adm_int1 = 21 'interrupt port 1&2
adm_int2 = 22 'interrupt port 3
con ' administra-funktionen con ' administra-funktionen
ADM_OPT = 0 ADM_OPT = 0
@ -85,32 +91,44 @@ ADM_COM_RX = 41 'com: zeichen empfangen
adm_m_run = 50 'plx: polling aktivieren adm_m_run = 50 'plx: polling aktivieren
adm_m_halt = 51 'plx: polling anhalten adm_m_halt = 51 'plx: polling anhalten
adm_m_setctrl = 52 adm_m_in = 52
adm_m_in = 53 adm_m_out = 53
adm_m_out = 54 adm_m_adch = 54
adm_m_ad_ch = 55 adm_m_getreg = 55
adm_m_getreg = 56 adm_m_setreg = 56
adm_m_setreg = 57 adm_m_start = 57
adm_m_start = 58 adm_m_stop = 58
adm_m_stop = 59 adm_m_write = 59
adm_m_write = 60 adm_m_read = 60
adm_m_read = 61 adm_m_ping = 61
adm_m_ping = 62 adm_m_setadr = 62
adm_m_joy = 63 adm_m_joy = 63
adm_m_paddle = 64 adm_m_paddle = 64
adm_m_pad = 65 adm_m_pad = 65
adm_m_setjoy = 66 adm_m_setjoy = 66
adm_m_setpad = 67 adm_m_setpad = 67
adm_m_chan = 70
adm_m_regclr = 71
adm_m_setvol = 72
adm_m_play = 73
adm_m_noteon = 74
adm_m_noteoff = 75
adm_m_setfreq = 76
adm_m_setwave = 77
adm_m_setpw = 78
adm_m_setadsr = 79
adm_m_setres = 80
adm_m_setcoff = 81
adm_m_setfmask = 82
adm_m_setftype = 83
adm_m_ringmod = 84
adm_m_sync = 85
adm_m_getspec = 97 'spezifikation abfragen adm_m_getspec = 97 'spezifikation abfragen
adm_m_getver = 98 'codeversion abfragen adm_m_getver = 98 'codeversion abfragen
adm_m_reboot = 99 'neu starten adm_m_reboot = 99 'neu starten
'plexbus
adm_sda = 19 'i2c-datenpin
adm_scl = 20 'i2c-clockpin
adm_int1 = 21 'interrupt port 1&2
adm_int2 = 22 'interrupt port 3
con ' bellatrix-funktionen con ' bellatrix-funktionen

View File

@ -28,6 +28,7 @@ Administra
scr : Screeninterface scr : Screeninterface
hss : Hydra-Soundsystem hss : Hydra-Soundsystem
sfx : Sound-FX sfx : Sound-FX
plx : Gamedevices & Plexbus
Bellatrix Bellatrix
key : Keyboardroutinen key : Keyboardroutinen
@ -484,7 +485,7 @@ PUB admload(stradr)|dmu 'chip-mgr: neuen adminis
''busprotokoll : [096][sub_putstr.fn] ''busprotokoll : [096][sub_putstr.fn]
'' : fn - dateiname des neuen administra-codes '' : fn - dateiname des neuen administra-codes
bus_putchar1(gc#a_mgrALoad) 'aktuelles userdir retten bus_putchar1(gc#a_mgrALoad)
bus_putstr1(stradr) bus_putstr1(stradr)
waitcnt(cnt + clkfreq*3) 'warte bis administra fertig ist waitcnt(cnt + clkfreq*3) 'warte bis administra fertig ist
@ -1035,6 +1036,19 @@ PUB rtcTest: available 'Test if RTC Chip is ava
CON ''------------------------------------------------- LAN_FUNKTIONEN CON ''------------------------------------------------- LAN_FUNKTIONEN
PUB lan_txflush(handleidx)
''funktionsgruppe : lan
''funktion : Warten, bis Sendepuffer geleert ist
''eingabe : -
''ausgabe : -
''busprotokoll : [070][put.handleidx][get.ok]
'' : handleidx - lfd. Nr. der Verbindung
'' : ok - Sendepuffer leer (Wert egal)
bus_putchar1(gc#a_lanTXFlush)
bus_putchar1(handleidx)
bus_getchar1
PUB lanstart 'LAN starten PUB lanstart 'LAN starten
''funktionsgruppe : lan ''funktionsgruppe : lan
''funktion : Netzwerk starten ''funktion : Netzwerk starten
@ -1074,16 +1088,18 @@ PUB lan_connect(ipaddr, remoteport): handleidx
bus_putword1(remoteport) bus_putword1(remoteport)
handleidx := bus_getchar1 handleidx := bus_getchar1
PUB lan_listen(port): handleidx PUB lan_listen(oldhandleidx, port): handleidx
''funktionsgruppe : lan ''funktionsgruppe : lan
''funktion : Port für eingehende TCP-Verbindung öffnen ''funktion : Port für eingehende TCP-Verbindung öffnen
''eingabe : - ''eingabe : -
''ausgabe : - ''ausgabe : -
''busprotokoll : [074][sub_putword.port][get.handleidx] ''busprotokoll : [074][put.handleidx][sub_putword.port][get.handleidx]
'' : oldhandleidx - lfd. Nr. der bestehenden Verbindung ($FF wenn neu)
'' : port - zu öffnende Portnummer '' : port - zu öffnende Portnummer
'' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle) '' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle)
bus_putchar1(gc#a_lanListen) bus_putchar1(gc#a_lanListen)
bus_putchar1(oldhandleidx)
bus_putword1(port) bus_putword1(port)
handleidx := bus_getchar1 handleidx := bus_getchar1
@ -1493,22 +1509,22 @@ PUB sid_sdmpplay(stradr): err 'sid: dmp-datei stereo a
bus_putstr1(stradr) bus_putstr1(stradr)
err := bus_getchar1 err := bus_getchar1
PUB sid_dmpstop PUB sid_dmpstop 'sid: dmp-player anhalten
bus_putchar1(gc#a_s_dmpstop) bus_putchar1(gc#a_s_dmpstop)
PUB sid_dmppause PUB sid_dmppause 'sid: dmp-player pausieren
bus_putchar1(gc#a_s_dmppause) bus_putchar1(gc#a_s_dmppause)
PUB sid_dmpstatus: status PUB sid_dmpstatus: status 'sid: dmp-player status abfragen
bus_putchar1(gc#a_s_dmpstatus) bus_putchar1(gc#a_s_dmpstatus)
status := bus_getchar1 status := bus_getchar1
PUB sid_dmppos: wert PUB sid_dmppos: wert 'sid: dmp-player playposition abfragen
bus_putchar1(gc#a_s_dmppos) bus_putchar1(gc#a_s_dmppos)
wert := bus_getlong1 wert := bus_getlong1
bus_getlong1 bus_getlong1
PUB sid_dmplen: wert PUB sid_dmplen: wert 'sid: dmp-datei länge abfragen
bus_putchar1(gc#a_s_dmppos) bus_putchar1(gc#a_s_dmppos)
bus_getlong1 bus_getlong1
wert := bus_getlong1 wert := bus_getlong1
@ -1726,6 +1742,98 @@ PUB com_rx:char 'com: zeichen empfangen
bus_putchar1(gc#a_comRx) bus_putchar1(gc#a_comRx)
char := bus_getchar1 char := bus_getchar1
CON ''------------------------------------------------- Plexbus und Gamedevices
PUB plxrun 'plx: bus freigeben, poller starten
bus_putchar1(gc#a_plxRun)
PUB plxhalt 'plx: bus anfordern, poller anhalten
bus_putchar1(gc#a_plxHalt)
PUB plxin(adr):wert 'plx: port einlesen
bus_putchar1(gc#a_plxIn)
bus_putchar1(adr)
wert := bus_getchar1
PUB plxout(adr,wert) 'plx: port ausgeben
bus_putchar1(gc#a_plxOut)
bus_putchar1(adr)
bus_putchar1(wert)
PUB plxch(adr,chan):wert 'plx: ad-wandlerkanal abfragen
bus_putchar1(gc#a_plxCh)
bus_putchar1(adr)
bus_putchar1(chan)
wert := bus_getchar1
PUB plxgetreg(regnr):wert 'plx: poller-register lesen
bus_putchar1(gc#a_plxGetReg)
bus_putchar1(regnr)
wert := bus_getchar1
PUB plxsetreg(regnr,wert) 'plx: poller-register schreiben
bus_putchar1(gc#a_plxSetReg)
bus_putchar1(regnr)
bus_putchar1(wert)
PUB plxstart 'plx: i2c-dialog starten
bus_putchar1(gc#a_plxStart)
PUB plxstop 'plx: i2c-dialog beenden
bus_putchar1(gc#a_plxStop)
PUB plxwrite(wert):ack 'plx: i2c byte schreiben
bus_putchar1(gc#a_plxWrite)
bus_putchar1(wert)
ack := bus_getchar1
PUB plxread(ack):wert 'plx: i2c byte lesen
bus_putchar1(gc#a_plxRead)
bus_putchar1(ack)
wert := bus_getchar1
PUB plxping(adr):ack 'plx: device abfragen
bus_putchar1(gc#a_plxPing)
bus_putchar1(adr)
ack := bus_getchar1
PUB plxsetadr(adradda,adrport) 'plx: adressen adda/port für poller setzen
bus_putchar1(gc#a_plxSetAdr)
bus_putchar1(adradda)
bus_putchar1(adrport)
PUB joy:wert 'game: joystick abfragen
bus_putchar1(gc#a_Joy)
wert := bus_getchar1
PUB paddle:wert 'game: paddle abfrage
bus_putchar1(gc#a_Paddle)
wert := wert + bus_getchar1 << 8
wert := wert + bus_getchar1
PUB pad:wert 'game: pad abfrage
bus_putchar1(gc#a_Pad)
wert := wert + bus_getchar1 << 16
wert := wert + bus_getchar1 << 8
wert := wert + bus_getchar1
OBJ '' B E L L A T R I X OBJ '' B E L L A T R I X
CON ''------------------------------------------------- CHIP-MANAGMENT CON ''------------------------------------------------- CHIP-MANAGMENT
@ -1950,6 +2058,10 @@ PUB printcstr(eadr) | i,len 'screen: bildschirmausga
eadr++ eadr++
bus_putchar2(ram_rdbyte(1,eadr)) bus_putchar2(ram_rdbyte(1,eadr))
PUB printblk(stringptr,strlen) 'screen: bildschirmausgabe eines strings definierter länge
repeat strlen
bus_putchar2(byte[stringptr++])
PUB printdec(value) | i 'screen: dezimalen zahlenwert auf bildschirm ausgeben PUB printdec(value) | i 'screen: dezimalen zahlenwert auf bildschirm ausgeben
{{printdec(value) - screen: dezimale bildschirmausgabe zahlenwertes}} {{printdec(value) - screen: dezimale bildschirmausgabe zahlenwertes}}

View File

@ -28,7 +28,7 @@ REM ----------------------------------------------------------------
REM Flashdateien erzeugen REM Flashdateien erzeugen
REM --> \bin\flash REM --> \bin\flash
%BSTC% -L %libpath% %D% -D __ADM_FAT -D __ADM_HSS -D __ADM_HSS_PLAY -D __ADM_WAV -D __ADM_RTC -D __ADM_COM -b -O a .\flash\administra\admflash.spin %BSTC% -L %libpath% %D% -D __ADM_FAT -D __ADM_HSS -D __ADM_HSS_PLAY -D __ADM_WAV -D __ADM_RTC -D __ADM_COM -D __ADM_PLX -b -O a .\flash\administra\admflash.spin
copy admflash.binary %flash% copy admflash.binary %flash%
move admflash.binary %sdsys%\admsys.adm move admflash.binary %sdsys%\admsys.adm

53
make.sh
View File

@ -4,8 +4,6 @@
##D="-D __DEBUG -D __LANG_EN" ##D="-D __DEBUG -D __LANG_EN"
##D="-D __LANG_EN" ##D="-D __LANG_EN"
D="-D __LANG_DE" D="-D __LANG_DE"
OPT="-O a"
##OPT=""
# Pfade # Pfade
bin="../Bin" bin="../Bin"
@ -15,7 +13,6 @@ sdsys="${bin}/sdcard/system"
flash="${bin}/flash" flash="${bin}/flash"
libpath="lib" libpath="lib"
BSTC="bstc" BSTC="bstc"
##BSTC="../open-source-spin-compiler-read-only/openspin"
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# Alte Versionen löschen # Alte Versionen löschen
@ -28,47 +25,47 @@ mkdir ${flash}
# Flashdateien erzeugen # Flashdateien erzeugen
# --> bin/flash # --> bin/flash
${BSTC} -L ${libpath} ${D} -D __ADM_FAT -D __ADM_HSS -D __ADM_HSS_PLAY -D __ADM_WAV -D __ADM_RTC -D __ADM_COM -b ${OPT} -o flash/administra/admflash.binary flash/administra/admflash.spin ${BSTC} -L ${libpath} ${D} -D __ADM_FAT -D __ADM_HSS -D __ADM_HSS_PLAY -D __ADM_WAV -D __ADM_RTC -D __ADM_COM -D __ADM_PLX -b -O a flash/administra/admflash.spin
cp flash/administra/admflash.binary ${flash} cp admflash.binary ${flash}
mv flash/administra/admflash.binary ${sdsys}/admsys.adm mv admflash.binary ${sdsys}/admsys.adm
${BSTC} -L ${libpath} ${D} -D __VGA -b ${OPT} -o flash/bellatrix/belflash.binary flash/bellatrix/belflash.spin ${BSTC} -L ${libpath} ${D} -D __VGA -b -O a flash/bellatrix/belflash.spin
cp flash/bellatrix/belflash.binary ${flash} cp belflash.binary ${flash}
mv flash/bellatrix/belflash.binary ${sdsys}/vga.bel mv belflash.binary ${sdsys}/vga.bel
${BSTC} -L ${libpath} ${D} -D __TV -b ${OPT} -o flash/bellatrix/belflash.binary flash/bellatrix/belflash.spin ${BSTC} -L ${libpath} ${D} -D __TV -b -O a flash/bellatrix/belflash.spin
mv flash/bellatrix/belflash.binary ${sdsys}/tv.bel mv belflash.binary ${sdsys}/tv.bel
${BSTC} -L ${libpath} ${D} -D regime -b ${OPT} -o flash/regnatix/regflash.binary flash/regnatix/regflash.spin ${BSTC} -L ${libpath} ${D} -D regime -b -O a flash/regnatix/regflash.spin
mv flash/regnatix/regflash.binary ${flash} mv regflash.binary ${flash}
${BSTC} -L ${libpath} ${D} -D forth -b ${OPT} -o flash/regnatix/regflash.binary flash/regnatix/regflash.spin ${BSTC} -L ${libpath} ${D} -D forth -b -O a flash/regnatix/regflash.spin
mv flash/regnatix/regflash.binary ${flash}/regforth.binary mv regflash.binary ${flash}/regforth.binary
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# Startdateie erzeugen # Startdateie erzeugen
# reg.sys (Regime) # reg.sys (Regime)
# --> bin/sdcard\ # --> bin/sdcard\
${BSTC} -L ${libpath} ${D} -b ${OPT} -o system/regnatix/regime.binary system/regnatix/regime.spin ${BSTC} -L ${libpath} ${D} -b -O a system/regnatix/regime.spin
mv system/regnatix/regime.binary ${sd}/reg.sys mv regime.binary ${sd}/reg.sys
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# Slave-Dateien erzeugen # Slave-Dateien erzeugen
# admsid, admay, admnet # admsid, admay, admnet
# htxt, g0key # htxt, g0key
${BSTC} -L ${libpath} ${D} -D __ADM_FAT -D __ADM_SID -b ${OPT} -o flash/administra/admflash.binary flash/administra/admflash.spin ${BSTC} -L ${libpath} ${D} -D __ADM_FAT -D __ADM_SID -b -O a flash/administra/admflash.spin
mv flash/administra/admflash.binary ${sdsys}/admsid.adm mv admflash.binary ${sdsys}/admsid.adm
${BSTC} -L ${libpath} ${D} -D __ADM_FAT -D __ADM_AYS -b ${OPT} -o flash/administra/admflash.binary flash/administra/admflash.spin ${BSTC} -L ${libpath} ${D} -D __ADM_FAT -D __ADM_AYS -b -O a flash/administra/admflash.spin
mv flash/administra/admflash.binary ${sdsys}/admay.adm mv admflash.binary ${sdsys}/admay.adm
${BSTC} -L ${libpath} ${D} -D __ADM_FAT -D __ADM_HSS -D __ADM_LAN -D __ADM_RTC -D __ADM_COM -b ${OPT} -o flash/administra/admflash.binary flash/administra/admflash.spin ${BSTC} -L ${libpath} ${D} -D __ADM_FAT -D __ADM_HSS -D __ADM_LAN -D __ADM_RTC -D __ADM_COM -b -O a flash/administra/admflash.spin
mv flash/administra/admflash.binary ${sdsys}/admnet.adm mv admflash.binary ${sdsys}/admnet.adm
${BSTC} -L ${libpath} ${D} -b ${OPT} -o system/bellatrix/bel-htext/htext.binary system/bellatrix/bel-htext/htext.spin ${BSTC} -L ${libpath} ${D} -b -O a system/bellatrix/bel-htext/htext.spin
mv system/bellatrix/bel-htext/htext.binary ${sdsys}/htext.bel mv htext.binary ${sdsys}/htext.bel
${BSTC} -L ${libpath} ${D} -b ${OPT} -o system/bellatrix/bel-g0/g0key.binary system/bellatrix/bel-g0/g0key.spin ${BSTC} -L ${libpath} ${D} -b -O a system/bellatrix/bel-g0/g0key.spin
mv system/bellatrix/bel-g0/g0key.binary ${sdsys}/g0key.bel mv g0key.binary ${sdsys}/g0key.bel
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# Systemdateien erzeugen # Systemdateien erzeugen
@ -77,7 +74,7 @@ mv system/bellatrix/bel-g0/g0key.binary ${sdsys}/g0key.bel
# --> bin/sdcard/system/ # --> bin/sdcard/system/
for FILE in system/regnatix/*.spin ; do for FILE in system/regnatix/*.spin ; do
${BSTC} -L ${libpath} ${D} -b ${OPT} ${FILE} ${BSTC} -L ${libpath} ${D} -b -O a ${FILE}
BASE="`basename ${FILE} .spin`" BASE="`basename ${FILE} .spin`"
mv "${BASE}.binary" "${sdsys}/${BASE}.bin" mv "${BASE}.binary" "${sdsys}/${BASE}.bin"
done done

38
release.sh Executable file
View File

@ -0,0 +1,38 @@
#! /bin/sh
# Definitionen
VERSION="57-Network-1.5"
# Pfade
ARCHIV="HIVE-TriOS-R${VERSION}"
MAKE="./make.sh"
BIN="Bin"
# ----------------------------------------------------------------
# Alte Versionen löschen
rm -rf ../${BIN}
rm -f "../${ARCHIV}-bin.zip"
rm -f "../${ARCHIV}-src.zip"
# ----------------------------------------------------------------
# Binaries erstellen
${MAKE}
# ----------------------------------------------------------------
# Archive erstellen
mkdir -p .tmp/doku
for file in *.md ; do cp "$file" .tmp/"${file/.md}".txt ; done
for file in doku/*.md ; do cp "$file" .tmp/"${file/.md}".txt ; done
cd .tmp
zip -r9 ../../${ARCHIV}-bin.zip *
zip -r9 ../../${ARCHIV}-src.zip *
cd ..
rm -rf .tmp
zip -r9 ../${ARCHIV}-src.zip flash forth lib system make*
cd ..
zip -r9 ${ARCHIV}-bin.zip ${BIN}

View File

@ -18,21 +18,23 @@ Funktion :
Komponenten : - Komponenten : -
COG's : - COG's : -
Logbuch : Logbuch :
27-04-2013-dr235 - erste version
01-11-2013-dr235 - redraw/geschwindigkeit verbessert
- div. kleine Optimierungen und Detailverbesserungen
Kommandoliste : Kommandoliste :
Notizen : Notizen :
- view nach f9
- tab in wbox
}} }}
OBJ OBJ
ios : "reg-ios" ios : "reg-ios"
dlbox[2] : "gui-dlbox" dlbox[2] : "gui-dlbox" 'die beiden dateifenster
pbar : "gui-pbar" pbar : "gui-pbar" 'progress-bar
wbox : "gui-wbox" wbox : "gui-wbox" 'warnbox
input : "gui-input" input : "gui-input" 'eingabedialog
fm : "fm-con" fm : "fm-con"
gc : "glob-con" gc : "glob-con"
str : "glob-string" str : "glob-string"
@ -53,26 +55,20 @@ VAR
byte w_pos[2] 'positionen im fenster byte w_pos[2] 'positionen im fenster
byte w_view[2] 'startposition des fensters byte w_view[2] 'startposition des fensters
byte w_cols[2] 'anzahl der spalten im fenster byte w_cols[2] 'anzahl der spalten im fenster
byte w_drives[2] 'zugeordnete drives
byte w0_list[fm#MAX_BUFFER] 'aktuelles verzeichnis byte w0_list[fm#MAX_BUFFER] 'verzeichnisliste sdcard
byte w0_flags[fm#MAX_FILES] 'selected, directory usw. byte w0_flags[fm#MAX_FILES] 'flags (selktiert, typ)
long w0_len[fm#MAX_FILES] 'dateilängen long w0_len[fm#MAX_FILES] 'dateilängen
byte w0_number 'anzahl der files byte w0_number 'anzahl der dateien
byte w1_list[fm#MAX_BUFFER] byte w1_list[fm#MAX_BUFFER] 'verzeichnisliste ramdrive
byte w1_flags[fm#MAX_FILES] byte w1_flags[fm#MAX_FILES] 'flags
long w1_len[fm#MAX_FILES] long w1_len[fm#MAX_FILES] 'dateilängen
byte w1_number byte w1_number 'anzahl der dateien
PUB main | key PUB main | key
init init
dlbox[0].focus
dlbox[0].draw
dlbox[1].draw
info_print
repeat repeat
key := ios.keywait key := ios.keywait
case key case key
@ -85,7 +81,7 @@ PUB main | key
gc#KEY_RETURN: f_open gc#KEY_RETURN: f_open
gc#KEY_BS: f_back gc#KEY_BS: f_back
gc#KEY_SPACE: f_select gc#KEY_SPACE: f_select
gc#KEY_ESC: gc#KEY_ESC: f_menu
gc#KEY_TAB: f_focus gc#KEY_TAB: f_focus
gc#KEY_POS1: f_pos1 gc#KEY_POS1: f_pos1
gc#KEY_F01: f_view gc#KEY_F01: f_view
@ -98,6 +94,9 @@ PUB main | key
gc#KEY_F08: f_selall gc#KEY_F08: f_selall
gc#KEY_F09: f_full gc#KEY_F09: f_full
gc#KEY_F10: f_quit gc#KEY_F10: f_quit
"m": f_menu
"q": f_quit
PRI init PRI init
@ -112,8 +111,6 @@ PRI init
w_view[0] := w_view[1] := 0 w_view[0] := w_view[1] := 0
w_cols[0] := (fm#W1X2-fm#W1X1)/(fm#MAX_LEN+2) w_cols[0] := (fm#W1X2-fm#W1X1)/(fm#MAX_LEN+2)
w_cols[1] := (fm#W2X2-fm#W2X1)/(fm#MAX_LEN+2) w_cols[1] := (fm#W2X2-fm#W2X1)/(fm#MAX_LEN+2)
w_drives[0] := fm#DR_SD
w_drives[1] := fm#DR_RAM
fname[0] := 0 fname[0] := 0
frame_draw frame_draw
@ -128,19 +125,24 @@ PRI init
wbox.define(5,fm#W4X1,fm#W4Y1,fm#W4X2,fm#W4Y2) wbox.define(5,fm#W4X1,fm#W4Y1,fm#W4X2,fm#W4Y2)
input.define(6,fm#W4X1,fm#W4Y1,fm#W4X2,fm#W4Y2,12) input.define(6,fm#W4X1,fm#W4Y1,fm#W4X2,fm#W4Y2,12)
dlbox[0].focus
dlbox[0].draw
dlbox[1].draw
info_print
PRI f_mount
PRI f_mount 'fkt: mount/unmount sd-card
if fl_mounted if fl_mounted
ios.sdunmount ios.sdunmount
repeat repeat
wbox.draw(@str5,@str2,@str3) == 1 wbox.draw(@str5,@str2,@str6)
while ios.sdmount while ios.sdmount
dlbox[0].draw dlbox[0].draw
dlbox[1].draw dlbox[1].draw
info_print info_print
PRI f_mkdir PRI f_mkdir 'fkt: verzeichnis erstellen
ios.sdnewdir(input.draw(string("Name eingeben : "))) ios.sdnewdir(input.draw(string("Name eingeben : ")))
w0_clrlist w0_clrlist
@ -149,22 +151,24 @@ PRI f_mkdir
dlbox[1].draw dlbox[1].draw
info_print info_print
PRI f_selall | i PRI f_selall | i 'fkt: alle dateien im verzeichnis selektieren
i := 0 i := 0
case w_sel case w_sel
0: repeat w0_number 0: i := 2 'std-einträge . .. auslassen
repeat w0_number
w0_flags[i++] ^= fm#FL_SEL w0_flags[i++] ^= fm#FL_SEL
1: repeat w1_number 1: i := 0
repeat w1_number
w1_flags[i++] ^= fm#FL_SEL w1_flags[i++] ^= fm#FL_SEL
dlbox[w_sel].redraw dlbox[w_sel].redraw
PRI f_pos1 PRI f_pos1 'fkt: homeposition im fenster
w_pos[w_sel] := 0 w_pos[w_sel] := 0
dlbox[w_sel].setpos(w_pos[w_sel]) dlbox[w_sel].setpos(w_pos[w_sel])
PRI f_full PRI f_full 'fkt: fenster maximieren
if w_sel if w_sel
dlbox[1].defocus dlbox[1].defocus
@ -181,7 +185,7 @@ PRI f_full
dlbox[1].draw dlbox[1].draw
w_sel := 0 w_sel := 0
PRI f_open PRI f_open 'fkt: verzeichnis öffnen
'nur fenster 1 und verzeichnisse 'nur fenster 1 und verzeichnisse
if (w_sel == 0) & (w0_flags[w_view[w_sel] + w_pos[w_sel]] & fm#FL_DIR) if (w_sel == 0) & (w0_flags[w_view[w_sel] + w_pos[w_sel]] & fm#FL_DIR)
@ -191,7 +195,7 @@ PRI f_open
dlbox[w_sel].draw dlbox[w_sel].draw
info_print info_print
PRI f_back PRI f_back 'fkt: verzeichnisebene zurück
ios.sdchdir(string("..")) ios.sdchdir(string(".."))
w0_clrlist w0_clrlist
@ -199,7 +203,7 @@ PRI f_back
dlbox[w_sel].redraw dlbox[w_sel].redraw
info_print info_print
PRI f_curup PRI f_curup 'fkt: cursor hoch
if w_pos[w_sel] > 1 if w_pos[w_sel] > 1
w_pos[w_sel] -= dlbox[w_sel].getcols w_pos[w_sel] -= dlbox[w_sel].getcols
@ -207,7 +211,7 @@ PRI f_curup
info_print info_print
dir := 0 dir := 0
PRI f_curdown PRI f_curdown 'fkt: cursor runter
if w_pos[w_sel] < (fm#WROWS * w_cols[w_sel] - dlbox[w_sel].getcols) if w_pos[w_sel] < (fm#WROWS * w_cols[w_sel] - dlbox[w_sel].getcols)
w_pos[w_sel] += dlbox[w_sel].getcols w_pos[w_sel] += dlbox[w_sel].getcols
@ -215,7 +219,7 @@ PRI f_curdown
info_print info_print
dir := 1 dir := 1
PRI f_curleft PRI f_curleft 'fkt: cursor links
if w_pos[w_sel] if w_pos[w_sel]
w_pos[w_sel]-- w_pos[w_sel]--
@ -223,7 +227,7 @@ PRI f_curleft
info_print info_print
dir := 0 dir := 0
PRI f_curright PRI f_curright 'fkt: cursor rechts
if w_pos[w_sel] < (fm#WROWS * w_cols[w_sel] - 1) if w_pos[w_sel] < (fm#WROWS * w_cols[w_sel] - 1)
w_pos[w_sel]++ w_pos[w_sel]++
@ -231,7 +235,7 @@ PRI f_curright
info_print info_print
dir := 1 dir := 1
PRI f_pageup PRI f_pageup 'fkt: seite zurück
if (w_view[w_sel] - fm#WROWS * w_cols[w_sel]) => 0 if (w_view[w_sel] - fm#WROWS * w_cols[w_sel]) => 0
w_view[w_sel] -= fm#WROWS * w_cols[w_sel] w_view[w_sel] -= fm#WROWS * w_cols[w_sel]
@ -240,7 +244,7 @@ PRI f_pageup
w_pos[w_sel] := fm#WROWS * w_cols[w_sel] - 1 w_pos[w_sel] := fm#WROWS * w_cols[w_sel] - 1
dlbox[w_sel].setpos(w_pos[w_sel]) dlbox[w_sel].setpos(w_pos[w_sel])
PRI f_pagedown | number PRI f_pagedown | number 'fkt: seite weiter
case w_sel case w_sel
0: number := w0_number 0: number := w0_number
@ -252,18 +256,22 @@ PRI f_pagedown | number
w_pos[w_sel] := 0 w_pos[w_sel] := 0
dlbox[w_sel].setpos(w_pos[w_sel]) dlbox[w_sel].setpos(w_pos[w_sel])
PRI f_select | i PRI f_select | i 'fkt: datei selektieren
i := w_view[w_sel] + w_pos[w_sel] i := w_view[w_sel] + w_pos[w_sel]
'flag in liste setzen
case w_sel case w_sel
0: w0_flags[i] ^= fm#FL_SEL 0: w0_flags[i] ^= fm#FL_SEL
1: w1_flags[i] ^= fm#FL_SEL 1: w1_flags[i] ^= fm#FL_SEL
dlbox[w_sel].redraw 'aktuelle position neu zeichnen
dlbox[w_sel].setpos(w_pos[w_sel])
'cursor bewegen
case dir case dir
0: f_curleft 0: f_curleft
1: f_curright 1: f_curright
dlbox[w_sel].setpos(w_pos[w_sel])
PRI f_focus PRI f_focus 'fkt: fokus auf anderes fenster
ifnot fl_full ifnot fl_full
dlbox[w_sel].defocus dlbox[w_sel].defocus
@ -274,14 +282,27 @@ ifnot fl_full
dlbox[w_sel].focus dlbox[w_sel].focus
info_print info_print
PRI f_quit PRI f_quit 'fkt: fm beenden
if wbox.draw(@str7,@str3,@str2) == 2
ios.sddmset(ios#DM_USER) 'regime soll in diesem verzeichnis landen ios.sddmset(ios#DM_USER) 'regime soll in diesem verzeichnis landen
ios.winset(0) ios.winset(0)
ios.screeninit ios.screeninit
ios.stop ios.stop
else
dlbox[0].draw
dlbox[1].draw
info_print
PRI f_load | i PRI f_menu 'fkt: extra-menü aufrufen
wbox.draw(string("Menü: Nicht implementiert!"),string("ok"),@str6)
dlbox[0].draw
dlbox[1].draw
info_print
PRI f_load | i 'fkt: sdcard --> ramdrive
pbar.setmaxbar(w0_number) pbar.setmaxbar(w0_number)
i := 0 i := 0
@ -297,7 +318,7 @@ PRI f_load | i
dlbox[0].draw dlbox[0].draw
dlbox[1].draw dlbox[1].draw
PRI f_save | i PRI f_save | i 'fkt: ramdrive --> sdcard
pbar.setmaxbar(w1_number) pbar.setmaxbar(w1_number)
i := 0 i := 0
@ -313,7 +334,7 @@ PRI f_save | i
dlbox[0].draw dlbox[0].draw
dlbox[1].draw dlbox[1].draw
PRI f_del | i PRI f_del | i 'fkt: dateien löschen
if wbox.draw(@str1,@str2,@str3) == 1 if wbox.draw(@str1,@str2,@str3) == 1
pbar.setmaxbar(w0_number) pbar.setmaxbar(w0_number)
@ -331,7 +352,7 @@ dlbox[0].draw
dlbox[1].draw dlbox[1].draw
info_print info_print
PRI f_empty PRI f_empty 'fkt: ramdrive löschen
if wbox.draw(@str4,@str2,@str3) == 1 if wbox.draw(@str4,@str2,@str3) == 1
ios.ram_wrlong(ios#sysmod,ios#SYSVAR,ios#RAMEND) 'Zeiger auf letzte freie Speicherzelle setzen ios.ram_wrlong(ios#sysmod,ios#SYSVAR,ios#RAMEND) 'Zeiger auf letzte freie Speicherzelle setzen
@ -348,7 +369,13 @@ dlbox[w_sel].setview(w_view[1])
info_print info_print
PRI f_view | n,stradr,ch,lch PRI f_view 'fkt: textdatei anzeigen
case w_sel
0: f_view0
1: f_view1
PRI f_view0 | n,stradr,ch,lch 'fkt: texdatei von sd anzeigen
ios.winset(3) ios.winset(3)
ios.curoff ios.curoff
@ -370,6 +397,7 @@ PRI f_view | n,stradr,ch,lch
ios.sdclose ios.sdclose
ios.printcls ios.printcls
dlbox[0].redraw dlbox[0].redraw
ifnot fl_full
dlbox[1].redraw dlbox[1].redraw
return return
else else
@ -387,7 +415,49 @@ PRI f_view | n,stradr,ch,lch
dlbox[1].draw dlbox[1].draw
info_print info_print
PRI w0_clrlist | i
PRI f_view1 | n,stradr,fn,len,ch,lch 'fkt: textdatei von ramdrive anzeigen
ios.winset(3)
ios.curoff
ios.printcls
stradr := get_fname(w_view[w_sel] + w_pos[w_sel])
n := 1
lch := 0
fn := ios.rd_open(stradr) 'datei öffnen
ifnot fn == -1
len := ios.rd_len(fn)
repeat len 'text ausgeben
ch := ios.printchar(ios.rd_get(fn))
if ch == ios#CHAR_NL OR ch == $0a 'CR or NL
if ch == lch OR (lch <> ios#CHAR_NL AND lch <> $0a)
ios.printnl
lch := ch
if ++n == (fm#W3Y2 - 2)
n := 1
if ios.keywait == "q"
ios.rd_close(fn)
ios.printcls
dlbox[0].redraw
ifnot fl_full
dlbox[1].redraw
return
else
lch := 0
else
ios.printchar(ch)
lch := ch
ios.print(string(13,"[EOF]"))
ios.keywait
ios.sdclose 'datei schließen
ios.printcls
dlbox[0].draw
dlbox[1].draw
info_print
PRI w0_clrlist | i 'fenster 0: dateiliste löschen
i := 0 i := 0
repeat fm#MAX_FILES repeat fm#MAX_FILES
@ -400,7 +470,7 @@ PRI w0_clrlist | i
i++ i++
PRI w1_clrlist | i PRI w1_clrlist | i 'fenster 1: dateiliste löschen
i := 0 i := 0
repeat fm#MAX_FILES repeat fm#MAX_FILES
@ -412,7 +482,7 @@ PRI w1_clrlist | i
w1_list[i] := " " w1_list[i] := " "
i++ i++
PRI w0_readdir | stradr,i,j PRI w0_readdir | stradr,i,j 'fenster 0: dateiliste einlesen
i := 0 i := 0
ios.sddir ios.sddir
@ -429,10 +499,11 @@ PRI w0_readdir | stradr,i,j
w0_number := i w0_number := i
PRI w1_readdir | stradr,i,j PRI w1_readdir | stradr,i,j 'fenster 1: dateiliste einlesen
i := 0 i := 0
ios.rd_dir ios.rd_dir
ios.rd_next 'ramdrive-label überspringen
repeat while (stradr := ios.rd_next) repeat while (stradr := ios.rd_next)
j := 0 j := 0
repeat fm#MAX_LEN repeat fm#MAX_LEN
@ -442,7 +513,7 @@ PRI w1_readdir | stradr,i,j
w1_len[i] := ios.rd_dlen w1_len[i] := ios.rd_dlen
w1_number := i w1_number := i
PRI get_fname(fnr):adrdat | i,stradr PRI get_fname(fnr):adrdat | i,stradr 'datei: dateinamen aus liste holrn
i := fm#MAX_LEN * fnr i := fm#MAX_LEN * fnr
case w_sel case w_sel
@ -456,7 +527,7 @@ PRI get_fname(fnr):adrdat | i,stradr
fname[i] := 0 fname[i] := 0
return @fname return @fname
PRI load(stradr) | len,fnr,i PRI load(stradr) | len,fnr,i 'datei: datei --> ramdrive
ifnot ios.sdopen("r",stradr) 'datei öffnen ifnot ios.sdopen("r",stradr) 'datei öffnen
len := ios.sdfattrib(ios#F_SIZE) len := ios.sdfattrib(ios#F_SIZE)
@ -468,7 +539,7 @@ PRI load(stradr) | len,fnr,i
ios.sdclose ios.sdclose
ios.rd_close(fnr) ios.rd_close(fnr)
PRI save(stradr) | fnr,len,i PRI save(stradr) | fnr,len,i 'datei: ramdrive --> datei
fnr := ios.rd_open(stradr) fnr := ios.rd_open(stradr)
ifnot fnr == -1 ifnot fnr == -1
@ -481,7 +552,7 @@ PRI save(stradr) | fnr,len,i
ios.rd_close(fnr) ios.rd_close(fnr)
PRI frame_draw PRI frame_draw 'screen: bildschirmmaske ausgeben
ios.winset(0) ios.winset(0)
ios.curoff ios.curoff
@ -498,7 +569,7 @@ PRI frame_draw
ios.printq(string(" 1: View | 2: Del | 3: SD>>RAM ◀▶ 4: SD<<RAM | 5: RAM Clear ")) ios.printq(string(" 1: View | 2: Del | 3: SD>>RAM ◀▶ 4: SD<<RAM | 5: RAM Clear "))
ios.setcolor(fm#COL_DEFAULT) ios.setcolor(fm#COL_DEFAULT)
PRI info_print | pos,len PRI info_print | pos,len 'screen: infozeile ausgeben
pos := w_view[w_sel] + w_pos[w_sel] pos := w_view[w_sel] + w_pos[w_sel]
case w_sel case w_sel
@ -521,7 +592,7 @@ PRI info_print | pos,len
ios.printdec(ios.ram_getfree) ios.printdec(ios.ram_getfree)
ios.print(string(" Bytes free")) ios.print(string(" Bytes free"))
PRI testvideo 'passt div. variablen an videomodus an PRI testvideo 'screen: passt div. variablen an videomodus an
vidmod := ios.belgetspec & 1 vidmod := ios.belgetspec & 1
rows := ios.belgetrows 'zeilenzahl bei bella abfragen rows := ios.belgetrows 'zeilenzahl bei bella abfragen
@ -531,13 +602,15 @@ PRI pause(sec)
waitcnt(cnt+clkfreq*sec) waitcnt(cnt+clkfreq*sec)
DAT DAT 'strings
str1 byte "Dateien löschen?",0 str1 byte "Dateien löschen?",0
str2 byte "Ja",0 str2 byte "Ja",0
str3 byte "Nein",0 str3 byte "Nein",0
str4 byte "RAMDrive löschen?",0 str4 byte "RAMDrive löschen?",0
str5 byte "SD-Card mounten?",0 str5 byte "SD-Card mounten?",0
str6 byte 0
str7 byte "Programm beenden?",0
DAT DAT

View File

@ -39,7 +39,7 @@ OBJ
str: "glob-string" str: "glob-string"
num: "glob-numbers" 'Number Engine num: "glob-numbers" 'Number Engine
gc : "glob-con" gc : "glob-con"
led: "led-engine" led: "glob-led-engine"
CON CON

View File

@ -55,6 +55,7 @@ PUB main | i,n,len,ch,lch
repeat i from 0 to 3 'extender anhängen repeat i from 0 to 3 'extender anhängen
byte[@parastr][len + i] := byte[@ext1][i] byte[@parastr][len + i] := byte[@ext1][i]
byte[@parastr][len + i] := 0 byte[@parastr][len + i] := 0
ios.admsetsyssnd(0) 'systemklänge aus (nervt!)
ifnot ios.sdopen("r",@parastr) ifnot ios.sdopen("r",@parastr)
repeat 'text ausgeben repeat 'text ausgeben
ch := ios.sdgetc ch := ios.sdgetc
@ -78,6 +79,7 @@ PUB main | i,n,len,ch,lch
'ios.print(string("Hilfetexte : ",$0d)) 'ios.print(string("Hilfetexte : ",$0d))
cmd_dir_w(1) cmd_dir_w(1)
ios.sdclose 'datei schließen ios.sdclose 'datei schließen
ios.admsetsyssnd(1) 'systemklänge wieder ein
ios.sddmact(ios#DM_USER) 'u-marker aktivieren ios.sddmact(ios#DM_USER) 'u-marker aktivieren
ios.stop ios.stop

View File

@ -0,0 +1,495 @@
{{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 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 : blexbus-tool
Chip : Regnatix
Typ : Programm
Version :
Subversion :
Logbuch :
31-10-2013-dr235 - erste version
Kommandoliste:
Notizen:
}}
OBJ
ios: "reg-ios"
num: "glob-numbers"
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
OS_TIBLEN = 64 'gr??e des inputbuffers
VAR
'systemvariablen
byte tib[OS_TIBLEN] 'tastatur-input-buffer
byte cmdstr[OS_TIBLEN] 'kommandostring f?r interpreter
byte token1[OS_TIBLEN] 'parameterstring 1 für interpreter
byte token2[OS_TIBLEN] 'parameterstring 2 für interpreter
byte tibpos 'aktuelle position im tib
long ppos 'puffer für adresse
long pcnt 'puffer für zeilenzahl
byte device 'adresse des geöffneten devices
byte polling 'status polling
byte open 'status device
PUB main | wflag
ios.start 'ios initialisieren
polling := 1
ios.plxRun
ios.printnl
' ios.print(string("Perplex - PlexBus-Tool - DR235",$0d,$0d))
repeat
os_cmdinput 'kommandoeingabe
os_cmdint 'kommandozeileninterpreter
PUB os_cmdinput | charc 'sys: stringeingabe eine zeile
''funktionsgruppe : sys
''funktion : stringeingabe eine zeile
''eingabe : -
''ausgabe : -
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
ios.print(@prompt2)
tibpos := 0 'tibposition auf anfang setzen
repeat until (charc := ios.keywait) == $0D 'tasten einlesen bis return
if (tibpos + 1) < OS_TIBLEN 'zeile noch nicht zu lang?
case charc
ios#CHAR_BS: 'backspace
if tibpos > 0 'noch nicht anfang der zeile erreeicht?
tib[tibpos--] := 0 'ein zeichen aus puffer entfernen
ios.printbs 'backspace an terminal senden
other: 'zeicheneingabe
tib[tibpos++] := charc 'zeichen speichern
ios.printchar(charc) 'zeichen ausgeben
ios.printnl
tib[tibpos] := 0 'string abschließen
tibpos := charc := 0 'werte rücksetzen
PUB os_nxtoken1: stradr 'sys: token 1 von tib einlesen
''funktionsgruppe : sys
''funktion : nächsten token im eingabestring suchen und stringzeiger übergeben
''eingabe : -
''ausgabe : stradr - adresse auf einen string mit dem gefundenen token
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
'' : token - tokenstring
stradr := os_tokenize(@token1)
PUB os_nxtoken2: stradr 'sys: token 2 von tib einlesen
''funktionsgruppe : sys
''funktion : nächsten token im eingabestring suchen und stringzeiger übergeben
''eingabe : -
''ausgabe : stradr - adresse auf einen string mit dem gefundenen token
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
'' : token - tokenstring
stradr := os_tokenize(@token2)
PUB os_tokenize(token):stradr | i 'sys: liest nächsten token aus tib
i := 0
if tib[tibpos] <> 0 'abbruch bei leerem string
repeat until tib[tibpos] > ios#CHAR_SPACE 'führende leerzeichen ausbenden
tibpos++
repeat until (tib[tibpos] == ios#CHAR_SPACE) or (tib[tibpos] == 0) 'wiederholen bis leerzeichen oder stringende
byte[token][i] := tib[tibpos]
tibpos++
i++
else
token := 0
byte[token][i] := 0
stradr := token
PUB os_nextpos: tibpos2 'sys: setzt zeiger auf nächste position
''funktionsgruppe : sys
''funktion : tibpos auf nächstes token setzen
''eingabe : -
''ausgabe : tibpos2 - position des nächsten tokens in tib
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
if tib[tibpos] <> 0
repeat until tib[tibpos] > ios#CHAR_SPACE 'führende leerzeichen ausbenden
tibpos++
return tibpos
PUB os_cmdint 'sys: kommandointerpreter
''funktionsgruppe : sys
''funktion : kommandointerpreter; zeichenkette ab tibpos wird als kommando interpretiert
'' : tibpos wird auf position hinter token gesetzt
''eingabe : -
''ausgabe : -
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
repeat 'kommandostring kopieren
cmdstr[tibpos] := tib[tibpos]
tibpos++
until (tib[tibpos] == ios#CHAR_SPACE) or (tib[tibpos] == 0) 'wiederholen bis leerzeichen oder stringende
cmdstr[tibpos] := 0 'kommandostring abschließen
os_cmdexec(@cmdstr) 'interpreter aufrufen
tibpos := 0 'tastaturpuffer zurücksetzen
tib[0] := 0
PUB os_cmdexec(stradr) 'sys: kommando im ?bergebenen string wird als kommando interpretiert
{{os_smdexec - das kommando im ?bergebenen string wird als kommando interpretiert
stradr: adresse einer stringvariable die ein kommando enth?lt}}
if strcomp(stradr,string("help")) 'help
ios.print(@help1)
elseif strcomp(stradr,string("open"))
plx_open
elseif strcomp(stradr,string("close"))
plx_close
elseif strcomp(stradr,string("put"))
plx_put
elseif strcomp(stradr,string("get"))
plx_get
elseif strcomp(stradr,string("map"))
plx_map
elseif strcomp(stradr,string("scan"))
plx_scan
elseif strcomp(stradr,string("test"))
plx_test
elseif strcomp(stradr,string("test#"))
plx_testnr
elseif strcomp(stradr,string("game"))
plx_game
elseif strcomp(stradr,string("setgame"))
plx_setgame
elseif strcomp(stradr,string("polloff"))
plx_polloff
elseif strcomp(stradr,string("pollon"))
plx_pollon
elseif strcomp(stradr,string("debug"))
plx_debug
elseif strcomp(stradr,string("status"))
plx_status
elseif strcomp(stradr,string("plexuswr"))
plx_plexuswr
elseif strcomp(stradr,string("bye"))
ios.stop
else 'kommando nicht gefunden
ios.print(stradr)
ios.print(@prompt3)
ios.printnl
PRI plx_debug|wert,i
' ios.plxOut($22,cnt)
' irgendwie funktionieren die direkten i2c-operationen noch nicht
' von administra aus funktioniert das gleiche konstrukt
' ???
ios.plxHalt
repeat
ios.plxStart
ios.plxWrite($22 << 1)
ios.plxWrite(i++)
ios.plxStop
waitcnt(cnt+clkfreq/3)
ios.printhex(i,2)
ios.printchar(" ")
PRI plx_plexuswr|regadr,regval
device := num.FromStr(os_nxtoken1,num#HEX)
regadr := num.FromStr(os_nxtoken1,num#HEX)
regval := num.FromStr(os_nxtoken1,num#HEX)
ios.plxHalt
waitcnt(cnt+clkfreq)
ios.plxStart
ios.plxWrite(device << 1)
ios.plxWrite(regadr)
ios.plxWrite(regval)
ios.plxStop
waitcnt(cnt+clkfreq)
ios.plxRun
PRI plx_status
ios.printnl
ios.print(string("Device : "))
ios.printhex(device,2)
if open
ios.print(string(" open"))
else
ios.print(string(" close"))
ios.printnl
ios.print(string("Polling : "))
if polling
ios.print(string("ON"))
else
ios.print(string("OFF"))
ios.printnl
ios.printnl
PRI plx_polloff
ios.plxHalt
ios.print(string("Poller wurde angehalten!",$0d))
polling := 0
PRI plx_pollon
ios.plxRun
ios.print(string("Poller wurde gestartet!",$0d))
polling := 1
open := 0
PRI plx_game|dev,i
i := 0
ios.curoff
ios.printcls
repeat
dev := ios.pad
ios.curhome
ios.printnl
ios.print(string("Scan : "))
ios.printdec(i++)
ios.printnl
ios.print(string("Input : ["))
ios.printbin(dev,24)
ios.printchar("]")
ios.printnl
ios.printnl
print_joystick(dev >> 16 & $FF)
ios.printnl
print_paddle(0,dev >> 8 & $FF)
print_paddle(1,dev & $FF)
until ios.key
ios.printnl
ios.curon
PRI plx_setgame|adradda,adrport
adradda := num.FromStr(os_nxtoken1,num#HEX)
adrport := num.FromStr(os_nxtoken1,num#HEX)
ios.plxsetadr(adradda,adrport)
PRI plx_test
testsepia($48,$20)
PRI plx_testnr|adradda,adrport
adradda := num.FromStr(os_nxtoken1,num#HEX)
adrport := num.FromStr(os_nxtoken1,num#HEX)
testsepia(adradda,adrport)
PRI plx_map|ack,adr,n,i
ios.plxHalt
n := 0
i := 0
ios.curoff
ios.printcls
repeat
ios.curhome
ios.printnl
ios.print(string(" 0123456789ABCDEF"))
ios.printnl
repeat adr from 0 to 127
ack := ios.plxping(adr)
if n == 0
ios.printhex(adr,2)
ios.printchar(" ")
if ack
ios.printqchar("┼")
else
ios.printqchar("•")
if n++ == 15
ios.printnl
n := 0
ios.printnl
ios.print(string("Scan : "))
ios.printdec(i++)
until ios.key
ios.printnl
ios.curon
ios.plxRun
PRI plx_scan|ack,adr
ios.plxHalt
ios.printnl
repeat adr from 0 to 127
ack := ios.plxping(adr)
ifnot ack
ios.print(string("Ping : $"))
ios.printhex(adr,2)
ios.print(string(" : "))
ios.printdec(adr)
ios.printnl
ios.printnl
ios.plxRun
PRI plx_open|ack
device := num.FromStr(os_nxtoken1,num#HEX)
ios.plxHalt
ios.plxStart
ifnot ios.plxWrite(device << 1)
ios.print(string("Device geöffnet, Polling aus!"))
polling := 0
open := 1
else
ios.print(string("Device nicht vorhanden!"))
ios.plxRun
polling := 1
open := 0
ios.printnl
PRI plx_close
ios.plxRun
ios.print(string("Device geschlossen, Polling an!"))
ios.printnl
polling := 1
open := 0
PRI plx_put|wert
if open
wert := num.FromStr(os_nxtoken1,num#HEX)
ios.plxOut(device,wert)
else
ios.print(string("Kein Device geöffnet!"))
ios.printnl
PRI plx_get
if open
ios.print(string("Get : "))
ios.printhex(ios.plxIn(device),2)
ios.printnl
else
ios.print(string("Kein Device geöffnet!"))
ios.printnl
PRI print_chan(cnr,wert)
ios.print(string("A/D "))
ios.printdec(cnr)
ios.printchar(" ")
ios.printhex(wert,2)
ios.printchar(" ")
ios.printchar("[")
repeat wert>>3
ios.printqchar("‣")
repeat (255-wert)>>3
ios.printqchar(" ")
ios.printchar("]")
ios.printnl
PRI print_port(pnr,wert)
ios.print(string("Port "))
ios.printdec(pnr)
ios.print(string(" ["))
repeat 8
if wert & 1
ios.printqchar("‣")
else
ios.printqchar(" ")
wert := wert >> 1
ios.printchar("]")
ios.printnl
PRI print_paddle(cnr,wert)
ios.print(string("Paddle "))
ios.printdec(cnr)
ios.printchar(" ")
ios.printhex(wert,2)
ios.printchar(" ")
ios.printchar("[")
repeat wert>>3
ios.printqchar("‣")
repeat (255-wert)>>3
ios.printqchar(" ")
ios.printchar("]")
ios.printnl
PRI print_joystick(wert)
ios.print(string("Joystick "))
ios.print(string(" ["))
repeat 8
if wert & 1
ios.printqchar("‣")
else
ios.printqchar(" ")
wert := wert >> 1
ios.printchar("]")
ios.printnl
PRI testsepia(adda,port)
ios.plxHalt
ios.curoff
ios.printcls
repeat
ios.curhome
ios.printnl
print_port(1,ios.plxIn(port ))
print_port(2,ios.plxIn(port+1))
print_port(3,ios.plxIn(port+2))
ios.printnl
print_chan(0,ios.plxch(adda,0))
print_chan(1,ios.plxch(adda,1))
print_chan(2,ios.plxch(adda,2))
print_chan(3,ios.plxch(adda,3))
ios.plxout(port+2,!(cnt>>23))
until ios.key
ios.printnl
ios.curon
ios.plxRun
DAT
prompt1 byte "ok ", $0d, 0
prompt2 byte "plx: ", 0
prompt3 byte "? ",0
wait1 byte "<WEITER? */q:>",0
help1 file "perplex.txt"
byte $0d,0

View File

@ -0,0 +1,17 @@
openwr <adr> - slave schreibend öffnen
openrd <adr> - slave lesend öffnen
close - slave schließen
put <wert> - zeichen zu plexus senden
get - zeichen von plexus empfangen
map - slavemap anzeigen
scan - anzeige aller slaveadressen
test - test für interne sepia-karte
test# adda port - test für spezifische sepia-karte
game - gamedevice abfragen (pollregister)
setgame adda port - adressen für poller setzen adda/port
polloff - polling anhalten
pollon - polling starten
bye - programm beenden
Parameter hexadezimal!

View File

@ -79,13 +79,15 @@ PUB main | tast
PUB statistik 'ausgabe der fehlerstatistik PUB statistik 'ausgabe der fehlerstatistik
cnt_err := cnt_err + cnt_test1 + cnt_test2 + cnt_test3 + cnt_testx cnt_err := cnt_err + cnt_test1 + cnt_test2 + cnt_test3 + cnt_testx
ios.setcolor(4) ios.setcolor(0)
ios.printcls ios.printcls
ios.printnl ios.printnl
ios.print(string("Statistik eRAM-Test:", $0d, $0d)) ios.print(string("Statistik eRAM-Test:", $0d, $0d))
ios.print(string("Testdurchläufe : ")) ios.print(string("Testdurchläufe : "))
ios.printdec(cnt_loop) ios.printdec(cnt_loop)
ios.printnl ios.printnl
ios.printnl
ios.setcolor(4)
ios.print(string("Fehler Gesamt : ")) ios.print(string("Fehler Gesamt : "))
ios.printdec(cnt_err) ios.printdec(cnt_err)
ios.printnl ios.printnl
@ -102,9 +104,6 @@ PUB statistik 'ausgabe der fehlerstati
ios.printdec(cnt_testx) ios.printdec(cnt_testx)
ios.printnl ios.printnl
ios.printnl ios.printnl
ios.print(string("Aktueller Test:", $0d))
ios.printnl
ios.printnl
cnt_test1 := 0 cnt_test1 := 0
cnt_test2 := 0 cnt_test2 := 0
cnt_test3 := 0 cnt_test3 := 0

View File

@ -687,7 +687,7 @@ PRI cmd_color 'cmd: zeichenfarbe wähl
ios.setcolor(str.decimalToNumber(act_color := os_nxtoken1)) ios.setcolor(str.decimalToNumber(act_color := os_nxtoken1))
PRI cmd_sysinfo 'cmd: systeminformationen anzeigen PRI cmd_sysinfo|ack,adr 'cmd: systeminformationen anzeigen
ios.printnl ios.printnl
os_printstr(@msg22,@syst) os_printstr(@msg22,@syst)
@ -716,6 +716,18 @@ PRI cmd_sysinfo 'cmd: systeminformatione
else else
os_printstr(@msg36,@msg38) os_printstr(@msg36,@msg38)
ios.printnl
ios.print(@msg39)
ios.plxHalt
repeat adr from 0 to 127
ack := ios.plxping(adr)
ifnot ack
ios.print(string(" ["))
ios.printhex(adr,2)
ios.print(string("]"))
ios.printnl
ios.plxRun
PRI cmd_mount | err 'cmd: mount PRI cmd_mount | err 'cmd: mount
repeat 16 repeat 16
@ -873,7 +885,7 @@ PRI cmd_dir|fcnt,stradr,hflag 'cmd: verzeichnis anzeig
ios.print(@msg10) ios.print(@msg10)
ios.print(@msg5) ios.print(@msg5)
ios.print(ios.sdvolname) ios.print(ios.sdvolname)
ifnot ios.os_error(ios.sddir) 'verzeichnis öffnen ios.sddir 'verzeichnis öffnen
if str.findCharacter(stradr,"h") if str.findCharacter(stradr,"h")
hflag := 0 hflag := 0
if str.findCharacter(stradr,"w") if str.findCharacter(stradr,"w")
@ -1076,6 +1088,7 @@ msg35 byte "Bellatrix Auflösung Y :",0
msg36 byte "Bellatrix Videomodus : ",0 msg36 byte "Bellatrix Videomodus : ",0
msg37 byte "VGA",0 msg37 byte "VGA",0
msg38 byte "TV",0 msg38 byte "TV",0
msg39 byte "PlexBus Devices : ",0
ext1 byte ".BIN",0 ext1 byte ".BIN",0
ext2 byte ".ADM",0 ext2 byte ".ADM",0

385
system/regnatix/websrv.spin Normal file
View File

@ -0,0 +1,385 @@
{{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Autor: Jörg Deckert │
│ Copyright (c) 2014 Jörg Deckert │
│ See end of file for terms of use. │
│ Die Nutzungsbedingungen befinden sich am Ende der Datei │
└──────────────────────────────────────────────────────────────────────────────────────────────────────┘
Informationen : hive-project.de
Kontakt : joergd@bitquell.de
System : TriOS
Name : flash
Chip : Regnatix
Typ : Programm
Version :
Subversion :
Funktion : Webserver
Komponenten : -
COG's : -
Logbuch :
23.06.2014-joergd - erste Version
- Parameter für Benutzer und Paßwort
Kommandoliste :
Notizen :
}}
OBJ
ios: "reg-ios"
gc : "glob-con"
str: "glob-string"
num: "glob-numbers"
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
CON 'NVRAM Konstanten --------------------------------------------------------------------------
#4, NVRAM_IPADDR
#24, NVRAM_HIVE ' 4 Bytes
DAT
strNVRAMFile byte "nvram.sav",0 'contains the 56 bytes of NVRAM, if RTC is not available
VAR
byte handleidx 'Handle web connection
byte reqstr[32] ' request string
byte webbuff[128] ' incoming header buffer
byte rtcAvailable
long hiveid
long cog, random_value
PUB main
rr_start
ios.start
ifnot (ios.admgetspec & gc#A_LAN)
ios.sddmset(ios#DM_USER) 'u-marker setzen
ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren
ios.admload(string("admnet.adm")) 'versuche, admnet zu laden
ios.sddmact(ios#DM_USER) 'u-marker aktivieren
ifnot (ios.admgetspec & gc#A_LAN) 'wenn Laden fehlgeschlagen
ios.print(@strNoNetwork)
ios.stop 'Ende
ios.printnl
ios.lanstart 'LAN-Treiber initialisieren (eigene IP-Adresse usw. setzen)
handleidx := $FF
getcfg
ios.print(@strMsgEnd)
repeat
if ios.keystat > 0
ios.key
quit
if (handleidx := ios.lan_listen(handleidx,80)) <> $FF 'Empfangs-Socket auf Port 80 öffnen
if ios.lan_isconnected(handleidx) 'bei bestehender Verbindung...
if webThread == 0
ios.lan_txflush(handleidx)
ios.lan_close(handleidx)
handleidx := $FF
ios.stop
PRI webThread | i, j, uri, args
if webReadLine == 0 ' read the first header, quit if it is empty
return 0
bytemove(@reqstr, @webbuff, 32) ' copy the header to a temporary request string for later processing
' obtain get arguments
if (i := indexOf(@reqstr, string(".cgi?"))) <> -1 ' was the request for a *.cgi script with arguments?
args := @reqstr[i + 5] ' extract the argument
if (j := indexOf(args, string("="))) <> -1 ' find the end of the argument
byte[args][j] := 0 ' string termination
' read the rest of the headers
repeat until webReadLine == 0 ' read the rest of the headers, throwing them away
sendStr(string("HTTP/1.0 200 OK",13,10,13,10)) ' print the HTTP header
if indexOf(@reqstr, string("ajax.js")) <> -1 ' ajax.js
sendStr(@ajaxjs)
elseif indexOf(@reqstr, string("rand.cgi")) <> -1 ' rand.cgi
sendStr(str.trimCharacters(num.ToStr(long[rr_random_ptr], num#DEC)))
elseif indexOf(@reqstr, string("id.cgi")) <> -1 ' id.cgi
sendStr(str.trimCharacters(num.ToStr(hiveid, num#DEC)))
elseif indexOf(@reqstr, string("img.bin")) <> -1 ' img.bin
ios.lan_txdata(handleidx, 0, 32768)
else
' default page
sendStr(@strDefPage1)
sendStr(str.trimCharacters(num.ToStr(hiveid, num#DEC)))
sendStr(@strDefPage2)
return 0
PRI webReadLine | i, ch
repeat i from 0 to 126
ch := ios.lan_rxtime(handleidx, 500)
if ch == 13
ch := ios.lan_rxtime(handleidx, 500)
if ch == -1 or ch == 10
quit
webbuff[i] := ch
webbuff[i] := 0
return i
PRI sendStr (strSend) : error
#ifdef __DEBUG
ios.print(string(" > "))
ios.print(strSend)
ios.printnl
#endif
error := ios.lan_txdata(handleidx, strSend, strsize(strSend))
PRI indexOf(haystack, needle) | i, j
'' Searches for a 'needle' inside a 'haystack'
'' Returns starting index of 'needle' inside 'haystack'
repeat i from 0 to strsize(haystack) - strsize(needle)
repeat j from 0 to strsize(needle) - 1
if byte[haystack][i + j] <> byte[needle][j]
quit
if j == strsize(needle)
return i
return -1
PRI getcfg 'nvram: IP-Konfiguration anzeigen
if ios.rtcTest 'RTC chip available?
rtcAvailable := TRUE
else 'use configfile
rtcAvailable := FALSE
ios.sddmset(ios#DM_USER) 'u-marker setzen
ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren
if ios.sdopen("R",@strNVRAMFile)
ios.print(@strErrorOpen)
ios.sddmact(ios#DM_USER) 'u-marker aktivieren
return
ios.print(@strAddr)
listaddr(NVRAM_IPADDR)
ios.printnl
if rtcAvailable
hiveid := ios.getNVSRAM(NVRAM_HIVE)
hiveid += ios.getNVSRAM(NVRAM_HIVE+1) << 8
hiveid += ios.getNVSRAM(NVRAM_HIVE+2) << 16
hiveid += ios.getNVSRAM(NVRAM_HIVE+3) << 24
else
ios.sdseek(NVRAM_HIVE)
hiveid := ios.sdgetc
hiveid += ios.sdgetc << 8
hiveid += ios.sdgetc << 16
hiveid += ios.sdgetc << 24
ifnot rtcAvailable
ios.sdclose
ios.sddmact(ios#DM_USER) 'u-marker aktivieren
PRI listaddr (nvidx) | count 'IP-Adresse anzeigen
ifnot rtcAvailable
ios.sdseek(nvidx)
repeat count from 0 to 3
if(count)
ios.print(string("."))
if rtcAvailable
ios.print(str.trimCharacters(num.ToStr(ios.getNVSRAM(nvidx+count), num#DEC)))
else
ios.print(str.trimCharacters(num.ToStr(ios.sdgetc, num#DEC)))
DAT ' Locale
#ifdef __LANG_EN
'locale: english
strNoNetwork byte 13,"Administra doesn't provide network functions!",13,"Please load admnet.",13,0
strWaitConnection byte "Waiting for client connection...",13,0
strErrorNoSock byte "No free socket.",13,0
strErrorOpen byte "Can't open configuration file",13,0
strAddr byte 13,"Webserver startet, please use this URL to connect:",13," http://",0
strDefPage1 byte "<html><body><script language=javascript src=ajax.js></script><b>It Works!<br><br>Hive-ID: ",0
strDefPage2 byte "<br><br>Random Number:</b><div id=a></div><script language=javascript>ajax('rand.cgi', 'a', 10);</script></body></html>",0
strMsgEnd byte 13,13,"Press any key to quit",13,0
#else
'default locale: german
strNoNetwork byte 13,"Administra stellt keine Netzwerk-Funktionen zur Verfügung!",13,"Bitte admnet laden.",13,0
strWaitConnection byte "Warte auf Client-Verbindung...",13,0
strErrorNoSock byte "Kein Socket frei...",13,0
strErrorOpen byte "Kann Konfigurationsdatei nicht öffnen.",13,0
strAddr byte 13,"Webserver gestartet, zum Verbinden folgende URL verwenden:",13," http://",0
strDefPage1 byte "<html><body><script language=javascript src=ajax.js></script><b>Es funktioniert!<br><br>Hive-ID: ",0
strDefPage2 byte "<br><br>Zufallszahl:</b><div id=a></div><script language=javascript>ajax('rand.cgi', 'a', 10);</script></body></html>",0
strMsgEnd byte 13,13,"Zum Beenden beliebige Taste drücken",13,0
#endif
ajaxjs byte "var ajaxBusy=false;function ajax(a,b,c){if(ajaxBusy){return}ajaxBusy=true;var d;try{d=new XMLHttpRequest()}catch(e){d=new ActiveXObject('Microsoft.XMLHTTP')}var f=function(){if(d.readyState==4){if(b){document.getElementById(b).innerHTML=d.responseText}ajaxBusy=false;if(c>0){setTimeout('ajax(\''+a+'\',\''+b+'\','+c+')',c)}}};d.open('GET',a+'?'+(new Date()).getTime(),true);d.onreadystatechange=f;d.send(null)}"
byte 0
DAT 'lizenz
{{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 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. │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
}}
DAT
{{
┌───────────────────────────────────────────┬────────────────┬────────────────────────┬───────────────┐
│ Real Random v1.2 │ by Chip Gracey │ (C)2007 Parallax, Inc. │ 23 March 2007 │
├───────────────────────────────────────────┴────────────────┴────────────────────────┴───────────────┤
│ │
│ This object generates real random numbers by stimulating and tracking CTR PLL jitter. It requires │
│ one cog and at least 20MHz. │
│ │
├─────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Background and Detail: │
│ │
│ A real random number is impossible to generate within a closed digital system. This is because │
│ there are no reliably-random states within such a system at power-up, and after power-up, it │
│ behaves deterministically. Random values can only be 'earned' by measuring something outside of the │
│ digital system. │
│ │
│ In your programming, you might have used 'var?' to generate a pseudo-random sequence, but found the │
│ same pattern playing every time you ran your program. You might have then used 'cnt' to 'randomly' │
│ seed the 'var'. As long as you kept downloading to RAM, you saw consistently 'random' results. At │
│ some point, you probably downloaded to EEPROM to set your project free. But what happened nearly │
│ every time you powered it up? You were probably dismayed to discover the same sequence playing each │
│ time! The problem was that 'cnt' was always powering-up with the same initial value and you were │
│ then sampling it at a constant offset. This can make you wonder, "Where's the end to this madness? │
│ And will I ever find true randomness?". │
│ │
│ In order to have real random numbers, either some external random signal must be input, or some │
│ analog system must be used to generate random noise which can be measured. We're in luck here, │
│ because it turns out that the Propeller does have sufficiently-analog subsystems which can be │
│ exploited for this purpose -- each cog's CTR PLLs. These can be exercised internally to good │
│ effect, without any I/O activity. │
│ │
│ This object sets up a cog's CTRA PLL to run at the main clock's frequency. It then uses a pseudo- │
│ random sequencer to modulate the PLL's target phase. The PLL responds by speeding up and slowing │
│ down in a an endless effort to lock. This results in very unpredictable frequency jitter which is │
│ fed back into the sequencer to keep the bit salad tossing. The final output is a truly-random │
│ 32-bit unbiased value that is fully updated every ~100us, with new bits rotated in every ~3us. This │
│ value can be sampled by your application whenever a random number is needed. │
│ │
├─────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Revision History v1.0 released 21 March 2007 │
│ │
│ v1.1 Bias removal has been added to ensure true randomness. Released 22 March 2007. │
│ v1.2 Assembly code made more efficient. Documentation improved. Released 23 March 2007. │
│ │
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘
}}
PUB rr_start : okay
'' Start real random driver - starts a cog
'' returns false if no cog available
'Reset driver
rr_stop
'Launch real random cog
return cog := cognew(@entry, @random_value) + 1
'allow 5ms to launch and randomize
waitcnt(clkfreq / 200 + cnt)
PUB rr_stop
'' Stop real random driver - frees a cog
'If already running, stop real random cog
if cog
cogstop(cog~ - 1)
PUB rr_random_ptr : ptr
'' Returns the address of the long which receives the random value
''
'' A random bit is rotated into the long every ~3us, resuling in a
'' new long every ~100us, on average, at 80MHz. You may want to double
'' these times, though, to be sure that you are getting new bits. The
'' timing uncertainty comes from the unbiasing algorithm which throws
'' away identical bit pairs, and only outputs the different ones.
return @random_value
DAT
' ┌─────────────────────────┐
' │ Real Random Generator │
' └─────────────────────────┘
org
entry movi ctra,#%00001_111 'set ctra to internal pll mode, select x16 tap
movi frqa,#$020 'set frqa to system clock frequency / 16
movi vcfg,#$040 'set vcfg to discrete output, but without pins
mov vscl,#70 'set vscl to 70 pixel clocks per waitvid
:twobits waitvid 0,0 'wait for next 70-pixel mark ± jitter time
test phsa,#%10111 wc 'pseudo-randomly sequence phase to induce jitter
rcr phsa,#1 '(c holds random bit #1)
add phsa,cnt 'mix PLL jitter back into phase
rcl par,#1 wz, nr 'transfer c into nz (par shadow register = 0)
wrlong _random_value,par 'write random value back to spin variable
waitvid 0,0 'wait for next 70-pixel mark ± jitter time
test phsa,#%10111 wc 'pseudo-randomly sequence phase to induce jitter
rcr phsa,#1 '(c holds random bit #2)
add phsa,cnt 'mix PLL jitter back into phase
if_z_eq_c rcl _random_value,#1 'only allow different bits (removes bias)
jmp #:twobits 'get next two bits
_random_value res 1

View File

@ -1,7 +1,7 @@
/? : Hilfe /? : Hilfe
/l : Konfiguration anzeigen /l : Konfiguration anzeigen
----------- Administra-Funktionen ---------------- Administra-Funktionen
/ah 0|1 : hss ab-/anschalten /ah 0|1 : hss ab-/anschalten
/aw 0|1 : wav ab-/anschalten /aw 0|1 : wav ab-/anschalten
/as 0|1 : systemklänge ab-/anschalten /as 0|1 : systemklänge ab-/anschalten
@ -10,10 +10,10 @@
/ah 0..15 : hss-lautstärke /ah 0..15 : hss-lautstärke
/af : administra reset, flash booten /af : administra reset, flash booten
/at : transfergeschwindigkeit messen /at : transfergeschwindigkeit messen
----------- Bellatrix-Funktionen ---------------- Bellatrix-Funktionen
/ci : farbtabelle anzeigen /ci : farbtabelle anzeigen
/cs datei : farbtabelle speichern /cs datei : farbtabelle speichern
/cl datei : farbtabelle laden /cl datei : farbtabelle laden
----------- Port-Funktionen ---------------- Port-Funktionen
/po nr anz : Impulse an port ausgeben /po nr anz time : Impulse an port ausgeben
/pi : Status der Port abfragen /pi : Status der Port abfragen