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 2341 additions and 722 deletions

346
README.md
View File

@ -1,25 +1,36 @@
INHALT
======
HIVE TriOS
==========
1. Installation des Grundsystems
2. Regime im Überblick
3. Forth im Überblick
Beschreibung
------------
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
integrierte Programmiersprache. Als Standard wird das System ohne Forth
installiert. Die Installation ist so für den Einsteiger einfacher. Möchte
man auch PropForth installieren, muß nur eine Konfiguration geändert werden
und ein Basiswortschatz im Forth selbst kompiliert werden.
Binäres Archiv: HIVE-TriOS-Rxx-bin.zip
Source-Archiv: HIVE-TriOS-Rxx-src.zip
Git Repository: https://dev.bitquell.de/summary/HIVE/TriOS.git
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
werden. In den Einstellungen des Compilers (Tools/Compiler
Preferences/Search Paths) muss das lib-Verzeichnis eingetragen werden.
werden. In den Einstellungen des Compilers
(Tools/Compiler Preferences/Search Paths) muss das lib-Verzeichnis eingetragen
werden.
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.
Downloadlink BSTC: http://www.fnarfbargle.com/bst/bstc/Latest/
Installation ohne Forth (Standard):
-----------------------------------
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
Genaue Installation-Anleitungen und Einführungen befinden sich im Verzeichnis
"doku".

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
RAM-Disk im eRAM oder auf SD-Card abspeichern kann.
- Ein vollständiger IRC-Client
- Die DEmo-Version eines Webservers
Zukünftige Erweiterungen, wie die Integration in Regime und direktes Starten
von Programmen aus dem Netzwerk sind geplant.
@ -125,7 +126,18 @@ abgespeichert. Von dort könnte sie direkt gestartet werden.
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

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:
- alle Spin-Dateien verwenden einheitlich UTF8-Kodierung und ein Zeilenende
mit Linefeed (LF)
Administra:
- Netzwerk-fähig
- 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:
- ipconfig
- FTP-Client
- IRC-Client
Netzwerk-Server:
- Webserver (Demo)
fm, man:
- Textdateien mit unterschiedlichem Zeilenende (CR, LF) werden unterstützt
@ -26,22 +28,67 @@ Make-Scripts:
- Linux-Version (make.sh)
- Erstellung verschiedener Anministra-Binaries per Defines
- 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
======================
und weiter gehts mit dem Frühjahresputz:
- umstellung Administra-Codes (admflash, admay, admsid) auf externe
Konstantendefinitionen
belflash:
- fehler im loader behoben
lib:
- gui-objekte für textoberfläche eingefügt:
gui-dlbox - Listenbox für Dateien
@ -50,7 +97,6 @@ lib:
gui-wbox - Warnbox mit Auswahloptionen
system/regnatix:
- Filemanager fm zugefügt
- Mental-Loader m zugefügt
- Tool zum erstellen von tapes (mental-containerdateien) zugefügt
@ -58,7 +104,6 @@ system/regnatix:
- yplay: Konstanten ausgelagert
system/sonstiges:
- Manual zugefügt: error, fm

View File

@ -66,12 +66,13 @@ Funktion : Dieser Code wird von Administra nach einem Reset aus dem EEPr
- ein- und ausgehende Verbindungen öffnen
- Daten übertragen
Komponenten : HSS 1.2 Andrew Arsenault Lizenz unklar
SIDCog Ver. 080 Johannes Ahlebrand MIT Lizenz
DACEngine 01/11/2010 Kwabena W. Agyeman MIT Lizenz
FATEngine 01/18/2009 Kwabena W. Agyeman MIT Lizenz
RTCEngine 11/22/2009 Kwabena W. Agyeman MIT Lizenz
PropTCP 12/08/2009 Harrison Pham Lizenz unklar
Komponenten : HSS 1.2 Andrew Arsenault Lizenz unklar
SIDCog Ver. 080 Johannes Ahlebrand MIT Lizenz
DACEngine 01/11/2010 Kwabena W. Agyeman MIT Lizenz
FATEngine 01/18/2009 Kwabena W. Agyeman MIT Lizenz
RTCEngine 11/22/2009 Kwabena W. Agyeman MIT Lizenz
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
FAT/RTC 1 COG
@ -90,7 +91,7 @@ Defines : __ADM_FAT enable FAT engine (sd card handling)
__ADM_SID enable SID player
__ADM_LAN enable LAN functions
__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_BLT enable Bluetooth
__ADM_COM enable serial port
@ -151,6 +152,7 @@ Logbuch :
17-04-2013-dr235 - konstanten für administra-funktionen komplett ausgelagert
22-12-2013-joergd - LAN Funktionen
17-12-2014-joergd - verschiedene Administra-Code-Versionen vereinheitlicht
29-11-2014-joergd - Signalgenerator (von zille für Plexus)
Kommandoliste :
@ -269,14 +271,14 @@ CHIP_SPEC = CHIP_SPEC_FAT|CHIP_SPEC_LDR|CHIP_SPEC_HSS|CHIP_SPEC_WAV|CHIP_SPEC_SI
' clk -------+|
' /wr ------+||
' /hs -----+||| +------------------------- /cs
' |||| |+------------------------ adm-p22
' |||| ||+----------------------- adm-p21 (io)
' |||| |||+---------------------- adm-p20 (rx)
' |||| ||||+--------------------- adm-p19 (tx)
' |||| |+------------------------ adm-p22 (int2 - port 1/2)
' |||| ||+----------------------- adm-p21 (int1 - port 3)
' |||| |||+---------------------- adm-p20 (scl)
' |||| ||||+--------------------- adm-p19 (sda)
' |||| ||||| +------+ d0..d7
' |||| ||||| | |
DB_IN = %00001001_00100000_00000000_00000000 'dira-wert für datenbuseingabe
DB_OUT = %00001001_00100000_00000000_11111111 'dira-wert für datenbusausgabe
DB_IN = %00001001_00000000_00000000_00000000 'dira-wert für datenbuseingabe
DB_OUT = %00001001_00000000_00000000_11111111 'dira-wert für datenbusausgabe
M1 = %00000010_00000000_00000000_00000000 'busclk=1? & /prop1=0?
M2 = %00000010_10000000_00000000_00000000 'maske: busclk & /cs (/prop1)
@ -347,11 +349,12 @@ OBJ
com : "adm-com" 'serielle schnittstelle
#endif
#ifdef __ADM_LAN
sock : "driver_socket" 'LAN
sock : "adm-socket" 'LAN
num : "glob-numbers" 'Number Engine
#endif
#ifdef __ADM_PLX
plx : "adm-plx" 'PlexBux
signal : "adm-signalgenerator"
#endif
#ifdef __ADM_DCF
dcf : "adm-dcf" 'DCF-77
@ -398,232 +401,246 @@ PUB main | cmd,err 'chip: kommandointerpret
' ---------------------------------------------- SD-FUNKTIONEN
#ifdef __ADM_FAT
gc#a_sdMount: sd_mount("M") 'sd-card mounten '
gc#a_sdOpenDir: sd_opendir 'direktory öffnen
gc#a_sdNextFile: sd_nextfile 'verzeichniseintrag lesen
gc#a_sdOpen: sd_open 'datei öffnen
gc#a_sdClose: sd_close 'datei schließen
gc#a_sdGetC: sd_getc 'zeichen lesen
gc#a_sdPutC: sd_putc 'zeichen schreiben
gc#a_sdGetBlk: sd_getblk 'block lesen
gc#a_sdPutBlk: sd_putblk 'block schreiben
gc#a_sdSeek: sd_seek 'zeiger in datei positionieren
gc#a_sdFAttrib: sd_fattrib 'dateiattribute übergeben
gc#a_sdVolname: sd_volname 'volumelabel abfragen
gc#a_sdMount: sd_mount("M") 'sd-card mounten '
gc#a_sdOpenDir: sd_opendir 'direktory öffnen
gc#a_sdNextFile: sd_nextfile 'verzeichniseintrag lesen
gc#a_sdOpen: sd_open 'datei öffnen
gc#a_sdClose: sd_close 'datei schließen
gc#a_sdGetC: sd_getc 'zeichen lesen
gc#a_sdPutC: sd_putc 'zeichen schreiben
gc#a_sdGetBlk: sd_getblk 'block lesen
gc#a_sdPutBlk: sd_putblk 'block schreiben
gc#a_sdSeek: sd_seek 'zeiger in datei positionieren
gc#a_sdFAttrib: sd_fattrib 'dateiattribute übergeben
gc#a_sdVolname: sd_volname 'volumelabel abfragen
gc#a_sdCheckMounted: sd_checkmounted 'test ob volume gemounted ist
gc#a_sdCheckOpen: sd_checkopen 'test ob eine datei geöffnet ist
gc#a_sdCheckUsed: sd_checkused 'test wie viele sektoren benutzt sind
gc#a_sdCheckFree: sd_checkfree 'test wie viele sektoren frei sind
gc#a_sdNewFile: sd_newfile 'neue datei erzeugen
gc#a_sdNewDir: sd_newdir 'neues verzeichnis wird erzeugt
gc#a_sdDel: sd_del 'verzeichnis oder datei löschen
gc#a_sdRename: sd_rename 'verzeichnis oder datei umbenennen
gc#a_sdChAttrib: sd_chattrib 'attribute ändern
gc#a_sdChDir: sd_chdir 'verzeichnis wechseln
gc#a_sdFormat: sd_format 'medium formatieren
gc#a_sdUnmount: sd_unmount 'medium abmelden
gc#a_sdDmAct: sd_dmact 'dir-marker aktivieren
gc#a_sdDmSet: sd_dmset 'dir-marker setzen
gc#a_sdDmGet: sd_dmget 'dir-marker status abfragen
gc#a_sdDmClr: sd_dmclr 'dir-marker löschen
gc#a_sdDmPut: sd_dmput 'dir-marker status setzen
gc#a_sdEOF: sd_eof 'eof abfragen
gc#a_sdCheckOpen: sd_checkopen 'test ob eine datei geöffnet ist
gc#a_sdCheckUsed: sd_checkused 'test wie viele sektoren benutzt sind
gc#a_sdCheckFree: sd_checkfree 'test wie viele sektoren frei sind
gc#a_sdNewFile: sd_newfile 'neue datei erzeugen
gc#a_sdNewDir: sd_newdir 'neues verzeichnis wird erzeugt
gc#a_sdDel: sd_del 'verzeichnis oder datei löschen
gc#a_sdRename: sd_rename 'verzeichnis oder datei umbenennen
gc#a_sdChAttrib: sd_chattrib 'attribute ändern
gc#a_sdChDir: sd_chdir 'verzeichnis wechseln
gc#a_sdFormat: sd_format 'medium formatieren
gc#a_sdUnmount: sd_unmount 'medium abmelden
gc#a_sdDmAct: sd_dmact 'dir-marker aktivieren
gc#a_sdDmSet: sd_dmset 'dir-marker setzen
gc#a_sdDmGet: sd_dmget 'dir-marker status abfragen
gc#a_sdDmClr: sd_dmclr 'dir-marker löschen
gc#a_sdDmPut: sd_dmput 'dir-marker status setzen
gc#a_sdEOF: sd_eof 'eof abfragen
#ifdef __ADM_FAT_EXT
gc#a_sdPos: sd_pos 'Zeiger in Datei abfragen
gc#a_sdCopy: sd_copy 'Datei kopieren
gc#a_sdDirSize: sd_dirsize 'Dateigrösse ->ist quatsch
gc#a_sdPos: sd_pos 'Zeiger in Datei abfragen
gc#a_sdCopy: sd_copy 'Datei kopieren
gc#a_sdDirSize: sd_dirsize 'Dateigrösse ->ist quatsch
#endif '__ADM_FAT_EXT
#endif '__ADM_FAT
' ---------------------------------------------- Bluetooth-FUNKTIONEN
#ifdef __ADM_BLT
gc#a_bl_Command_On: blt_setCommandMode
gc#a_bl_Command_On: blt_setCommandMode
gc#a_bl_Command_Off: blt_setNormalMode
#endif '__ADM_BLT
' ---------------------------------------------- COM-FUNKTIONEN
#ifdef __ADM_COM
gc#a_comInit: com_init
gc#a_comTx: com_tx
gc#a_comRx: com_rx
gc#a_comTx: com_tx
gc#a_comRx: com_rx
#endif '__ADM_COM
' ---------------------------------------------- RTC-FUNKTIONEN
#ifdef __ADM_RTC
gc#a_rtcTest: rtc_test 'Test if RTC Chip is available
gc#a_rtcGetSeconds: rtc_getSeconds 'Returns the current second (0 - 59) from the real time clock.
gc#a_rtcGetMinutes: rtc_getMinutes 'Returns the current minute (0 - 59) from the real time clock.
gc#a_rtcGetHours: rtc_getHours 'Returns the current hour (0 - 23) from the real time clock.
gc#a_rtcGetDay: rtc_getDay 'Returns the current day (1 - 7) from the real time clock.
gc#a_rtcGetDate: rtc_getDate 'Returns the current date (1 - 31) from the real time clock.
gc#a_rtcGetMonth: rtc_getMonth 'Returns the current month (1 - 12) from the real time clock.
gc#a_rtcGetYear: rtc_getYear 'Returns the current year (2000 - 2099) from the real time clock.
gc#a_rtcSetSeconds: rtc_setSeconds 'Sets the current real time clock seconds. Seconds - Number to set the seconds to between 0 - 59.
gc#a_rtcSetMinutes: rtc_setMinutes 'Sets the current real time clock minutes. Minutes - Number to set the minutes to between 0 - 59.
gc#a_rtcSetHours: rtc_setHours 'Sets the current real time clock hours. Hours - Number to set the hours to between 0 - 23.
gc#a_rtcSetDay: rtc_setDay 'Sets the current real time clock day. Day - Number to set the day to between 1 - 7.
gc#a_rtcSetDate: rtc_setDate 'Sets the current real time clock date. Date - Number to set the date to between 1 - 31.
gc#a_rtcSetMonth: rtc_setMonth 'Sets the current real time clock month. Month - Number to set the month to between 1 - 12.
gc#a_rtcSetYear: rtc_setYear 'Sets the current real time clock year. Year - Number to set the year to between 2000 - 2099.
gc#a_rtcSetNVSRAM: rtc_setNVSRAM 'Sets the NVSRAM to the selected value (0 - 255) at the index (0 - 55).
gc#a_rtcGetNVSRAM: rtc_getNVSRAM 'Gets the selected NVSRAM value at the index (0 - 55).
gc#a_rtcPauseForSec: rtc_pauseForSeconds 'Pauses execution for a number of seconds. Returns a puesdo random value derived from the current clock frequency and the time when called. Number - Number of seconds to pause for between 0 and 2,147,483,647.
gc#a_rtcTest: rtc_test 'Test if RTC Chip is available
gc#a_rtcGetSeconds: rtc_getSeconds 'Returns the current second (0 - 59) from the real time clock.
gc#a_rtcGetMinutes: rtc_getMinutes 'Returns the current minute (0 - 59) from the real time clock.
gc#a_rtcGetHours: rtc_getHours 'Returns the current hour (0 - 23) from the real time clock.
gc#a_rtcGetDay: rtc_getDay 'Returns the current day (1 - 7) from the real time clock.
gc#a_rtcGetDate: rtc_getDate 'Returns the current date (1 - 31) from the real time clock.
gc#a_rtcGetMonth: rtc_getMonth 'Returns the current month (1 - 12) from the real time clock.
gc#a_rtcGetYear: rtc_getYear 'Returns the current year (2000 - 2099) from the real time clock.
gc#a_rtcSetSeconds: rtc_setSeconds 'Sets the current real time clock seconds. Seconds - Number to set the seconds to between 0 - 59.
gc#a_rtcSetMinutes: rtc_setMinutes 'Sets the current real time clock minutes. Minutes - Number to set the minutes to between 0 - 59.
gc#a_rtcSetHours: rtc_setHours 'Sets the current real time clock hours. Hours - Number to set the hours to between 0 - 23.
gc#a_rtcSetDay: rtc_setDay 'Sets the current real time clock day. Day - Number to set the day to between 1 - 7.
gc#a_rtcSetDate: rtc_setDate 'Sets the current real time clock date. Date - Number to set the date to between 1 - 31.
gc#a_rtcSetMonth: rtc_setMonth 'Sets the current real time clock month. Month - Number to set the month to between 1 - 12.
gc#a_rtcSetYear: rtc_setYear 'Sets the current real time clock year. Year - Number to set the year to between 2000 - 2099.
gc#a_rtcSetNVSRAM: rtc_setNVSRAM 'Sets the NVSRAM to the selected value (0 - 255) at the index (0 - 55).
gc#a_rtcGetNVSRAM: rtc_getNVSRAM 'Gets the selected NVSRAM value at the index (0 - 55).
gc#a_rtcPauseForSec: rtc_pauseForSeconds 'Pauses execution for a number of seconds. Returns a puesdo random value derived from the current clock frequency and the time when called. Number - Number of seconds to pause for between 0 and 2,147,483,647.
gc#a_rtcPauseForMSec: rtc_pauseForMilliseconds 'Pauses execution for a number of milliseconds. Returns a puesdo random value derived from the current clock frequency and the time when called. Number - Number of milliseconds to pause for between 0 and 2,147,483,647.
gc#a_rtcGetTime: rtc_getTime 'Returns the current hour, minute and second from the real time clock.
gc#a_rtcGetTime: rtc_getTime 'Returns the current hour, minute and second from the real time clock.
#endif '__ADM_RTC
' ---------------------------------------------- DCF77-FUNKTIONEN
#ifdef __ADM_DCF
gc#a_DCF_InSync: dcf_getInSync 'Sync-Status senden
gc#a_DCF_Update_Clock: dcf_updateRTC 'RTC Synchronisieren
gc#a_DCF_GetBitError: dcf_getBitError
gc#a_DCF_InSync: dcf_getInSync 'Sync-Status senden
gc#a_DCF_Update_Clock: dcf_updateRTC 'RTC Synchronisieren
gc#a_DCF_GetBitError: dcf_getBitError
gc#a_DCF_GetDatacount: dcf_getDataCount
gc#a_DCF_GetBitNumber: dcf_getBitNumber
gc#a_DCF_GetBitLevel: dcf_getBitLevel
gc#a_DCF_GetTimeZone: dcf_getTimeZone
gc#a_DCF_GetBitLevel: dcf_getBitLevel
gc#a_DCF_GetTimeZone: dcf_getTimeZone
gc#a_DCF_GetActiveSet: dcf_getActiveSet
gc#a_DCF_start: dcf_start 'DCF-Empfang starten
gc#a_DCF_stop: dcf_stop 'DCF-Empfang stoppen
gc#a_DCF_dcfon: dcf_state 'Status des DCF-Empfängers
gc#a_DCF_GetSeconds: dcf_getSeconds
gc#a_DCF_GetMinutes: dcf_getMinutes
gc#a_DCF_GetHours: dcf_getHours
gc#a_DCF_GetWeekDay: dcf_getWeekDay
gc#a_DCF_GetDay: dcf_getDay
gc#a_DCF_GetMonth: dcf_getMonth
gc#a_DCF_GetYear: dcf_getYear
gc#a_DCF_start: dcf_start 'DCF-Empfang starten
gc#a_DCF_stop: dcf_stop 'DCF-Empfang stoppen
gc#a_DCF_dcfon: dcf_state 'Status des DCF-Empfängers
gc#a_DCF_GetSeconds: dcf_getSeconds
gc#a_DCF_GetMinutes: dcf_getMinutes
gc#a_DCF_GetHours: dcf_getHours
gc#a_DCF_GetWeekDay: dcf_getWeekDay
gc#a_DCF_GetDay: dcf_getDay
gc#a_DCF_GetMonth: dcf_getMonth
gc#a_DCF_GetYear: dcf_getYear
#endif '__ADM_DCF
' ---------------------------------------------- LAN-FUNKTIONEN
#ifdef __ADM_LAN
gc#a_lanStart: lan_start 'Start Network
gc#a_lanStop:lan_stop 'Stop Network
gc#a_lanConnect: lan_connect 'ausgehende TCP-Verbindung öffnen
gc#a_lanListen: lan_listen 'auf eingehende TCP-Verbindung lauschen
gc#a_lanStart: lan_start 'Start Network
gc#a_lanStop: lan_stop 'Stop Network
gc#a_lanConnect: lan_connect 'ausgehende TCP-Verbindung öffnen
gc#a_lanListen: lan_listen 'auf eingehende TCP-Verbindung lauschen
gc#a_lanWaitConnTimeout: lan_waitconntimeout 'bestimmte Zeit auf Verbindung warten
gc#a_lanClose: lan_close 'TCP-Verbindung schließen
gc#a_lanRXTime: lan_rxtime 'bestimmte Zeit warten auf Byte aus Empfangspuffer
gc#a_lanRXData: lan_rxdata 'Daten aus Empfangspuffer lesen
gc#a_lanTXData: lan_txdata 'Daten senden
gc#a_lanRXByte: lan_rxbyte 'wenn vorhanden, Byte aus Empfangspuffer lesen
gc#a_lanIsConnected: lan_isconnected 'TRUE, wenn Socket verbunden, sonst FALSE
gc#a_lanClose: lan_close 'TCP-Verbindung schließen
gc#a_lanRXTime: lan_rxtime 'bestimmte Zeit warten auf Byte aus Empfangspuffer
gc#a_lanRXData: lan_rxdata 'Daten aus Empfangspuffer lesen
gc#a_lanTXData: lan_txdata 'Daten senden
gc#a_lanRXByte: lan_rxbyte 'wenn vorhanden, Byte aus Empfangspuffer lesen
gc#a_lanIsConnected: lan_isconnected 'TRUE, wenn Socket verbunden, sonst FALSE
#endif '__ADM_LAN
' ---------------------------------------------- CHIP-MANAGMENT
gc#a_mgrSetSound: mgr_setsound 'soundsubsysteme verwalten
gc#a_mgrGetSpec: mgr_getspec 'spezifikation abfragen
gc#a_mgrSetSound: mgr_setsound 'soundsubsysteme verwalten
gc#a_mgrGetSpec: mgr_getspec 'spezifikation abfragen
gc#a_mgrSetSysSound: mgr_setsyssound 'systemsound ein/ausschalten
gc#a_mgrGetSoundSys: mgr_getsoundsys 'abfrage welches soundsystem aktiv ist
gc#a_mgrALoad: mgr_aload 'neuen code booten
gc#a_mgrGetCogs: mgr_getcogs 'freie cogs abfragen
gc#a_mgrGetVer: mgr_getver 'codeversion abfragen
gc#a_mgrReboot: reboot 'neu starten
gc#a_mgrALoad: mgr_aload 'neuen code booten
gc#a_mgrGetCogs: mgr_getcogs 'freie cogs abfragen
gc#a_mgrGetVer: mgr_getver 'codeversion abfragen
gc#a_mgrReboot: reboot 'neu starten
' ---------------------------------------------- HSS-FUNKTIONEN
#ifdef __ADM_HSS
gc#a_hssLoad: hss_load 'hss-datei in puffer laden
gc#a_hssLoad: hss_load 'hss-datei in puffer laden
#ifdef __ADM_HSS_PLAY
gc#a_hssPlay: hss.hmus_load(@bgmusic) 'play
hss.hmus_play
gc#a_hssPlay: hss.hmus_load(@bgmusic) 'play
hss.hmus_play
#endif '__ADM_HSS_PLAY
gc#a_hssStop: hss.hmus_stop 'stop
gc#a_hssPause: hss.hmus_pause 'pause
gc#a_hssPeek: hss_peek 'register lesen
gc#a_hssIntReg: hss_intreg 'interfaceregister auslesen
gc#a_hssVol: hss_vol 'lautstärke setzen
gc#a_sfxFire: sfx_fire 'sfx abspielen
gc#a_hssStop: hss.hmus_stop 'stop
gc#a_hssPause: hss.hmus_pause 'pause
gc#a_hssPeek: hss_peek 'register lesen
gc#a_hssIntReg: hss_intreg 'interfaceregister auslesen
gc#a_hssVol: hss_vol 'lautstärke setzen
gc#a_sfxFire: sfx_fire 'sfx abspielen
gc#a_sfxSetSlot: sfx_setslot 'sfx-slot setzen
gc#a_sfxKeyOff: sfx_keyoff
gc#a_sfxStop: sfx_stop
gc#a_sfxKeyOff: sfx_keyoff
gc#a_sfxStop: sfx_stop
#endif '__ADM_HSS
' ---------------------------------------------- PLX-Funktionen
#ifdef __ADM_PLX
gc#a_plxRun: plx.run 'plx-bus freigeben
gc#a_plxHalt: plx.halt 'plx-bus anfordern
gc#a_plxIn: plx_in 'port einlesen
gc#a_plxOut: plx_out 'port ausgeben
gc#a_plxCh: plx_ch 'ad-wandler auslesen
gc#a_plxRun: plx.run 'plx-bus freigeben
gc#a_plxHalt: plx.halt 'plx-bus anfordern
gc#a_plxIn: plx_in 'port einlesen
gc#a_plxOut: plx_out 'port ausgeben
gc#a_plxCh: plx_ch 'ad-wandler auslesen
gc#a_plxGetReg: plx_getReg 'poller-register lesen
gc#a_plxSetReg: plx_setReg 'poller-register setzen
gc#a_plxStart: plx.start 'i2c-dialog starten
gc#a_plxStop: plx.stop 'i2c-dialog beenden
gc#a_plxWrite: plx_write 'i2c byte senden
gc#a_plxRead: plx_read 'i2c byte empfangen
gc#a_plxPing: plx_ping 'abfrage ob device vorhanden ist
gc#a_plxStart: plx.start 'i2c-dialog starten
gc#a_plxStop: plx.stop 'i2c-dialog beenden
gc#a_plxWrite: plx_write 'i2c byte senden
gc#a_plxRead: plx_read 'i2c byte empfangen
gc#a_plxPing: plx_ping 'abfrage ob device vorhanden ist
gc#a_plxSetAdr: plx_setAddr 'adressen adda/ports für poller setzen
' ---------------------------------------------- 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
' ---------------------------------------------- WAV-FUNKTIONEN
#ifdef __ADM_WAV
gc#a_sdwStart: sdw_start 'spielt wav-datei direkt von sd-card ab
gc#a_sdwStop: sdw_stop 'stopt wav-cog
gc#a_sdwStatus: sdw_status 'fragt status des players ab
gc#a_sdwLeftVol: sdw_leftvol 'lautstärke links
gc#a_sdwStart: sdw_start 'spielt wav-datei direkt von sd-card ab
gc#a_sdwStop: sdw_stop 'stopt wav-cog
gc#a_sdwStatus: sdw_status 'fragt status des players ab
gc#a_sdwLeftVol: sdw_leftvol 'lautstärke links
gc#a_sdwRightVol: sdw_rightvol 'lautstärke rechts
gc#a_sdwPause: sdw_pause 'player pause/weiter-modus
gc#a_sdwPause: sdw_pause 'player pause/weiter-modus
gc#a_sdwPosition: sdw_position
#endif '__ADM_WAV
' ---------------------------------------------- SIDCog: DMP-Player-Funktionen (SIDCog2)
#ifdef __ADM_SID
gc#a_s_mdmpplay: sid_mdmpplay 'dmp-file mono auf sid2 abspielen
gc#a_s_sdmpplay: sid_sdmpplay 'dmp-file stereo auf beiden sids abspielen
gc#a_s_dmpstop: sid_dmpstop 'dmp-player beenden
gc#a_s_dmppause: sid_dmppause 'dmp-player pausenmodus
gc#a_s_dmpstatus: sid_dmpstatus 'dmp-player statusabfrage
gc#a_s_dmppos: sid_dmppos 'player-position im dumpfile
gc#a_s_mute: sid_mute 'alle register löschen
gc#a_s_mdmpplay: sid_mdmpplay 'dmp-file mono auf sid2 abspielen
gc#a_s_sdmpplay: sid_sdmpplay 'dmp-file stereo auf beiden sids abspielen
gc#a_s_dmpstop: sid_dmpstop 'dmp-player beenden
gc#a_s_dmppause: sid_dmppause 'dmp-player pausenmodus
gc#a_s_dmpstatus: sid_dmpstatus 'dmp-player statusabfrage
gc#a_s_dmppos: sid_dmppos 'player-position im dumpfile
gc#a_s_mute: sid_mute 'alle register löschen
' ---------------------------------------------- SIDCog1-Funktionen
gc#a_s1_setRegister: sid1.setRegister(bus_getchar,bus_getchar)
gc#a_s1_updateRegisters: sid1.updateRegisters(sub_getdat(25,@s1buffer))
gc#a_s1_setVolume: sid1.setVolume(bus_getchar)
gc#a_s1_play: sid1.play(bus_getchar,sub_getlong,bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_noteOn: sid1.noteOn(bus_getchar, sub_getlong)
gc#a_s1_noteOff: sid1.noteOff(bus_getchar)
gc#a_s1_setFreq: sid1.setFreq(bus_getchar,sub_getlong)
gc#a_s1_setWaveform: sid1.setWaveform(bus_getchar,bus_getchar)
gc#a_s1_setPWM: sid1.setPWM(bus_getchar,sub_getlong)
gc#a_s1_setADSR: sid1.setADSR(bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_setResonance: sid1.setResonance(bus_getchar)
gc#a_s1_setCutoff: sid1.setCutoff(sub_getlong)
gc#a_s1_setFilterMask: sid1.setFilterMask(bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_setFilterType: sid1.setFilterType(bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_enableRingmod: sid1.enableRingmod(bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_setRegister: sid1.setRegister(bus_getchar,bus_getchar)
gc#a_s1_updateRegisters: sid1.updateRegisters(sub_getdat(25,@s1buffer))
gc#a_s1_setVolume: sid1.setVolume(bus_getchar)
gc#a_s1_play: sid1.play(bus_getchar,sub_getlong,bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_noteOn: sid1.noteOn(bus_getchar, sub_getlong)
gc#a_s1_noteOff: sid1.noteOff(bus_getchar)
gc#a_s1_setFreq: sid1.setFreq(bus_getchar,sub_getlong)
gc#a_s1_setWaveform: sid1.setWaveform(bus_getchar,bus_getchar)
gc#a_s1_setPWM: sid1.setPWM(bus_getchar,sub_getlong)
gc#a_s1_setADSR: sid1.setADSR(bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_setResonance: sid1.setResonance(bus_getchar)
gc#a_s1_setCutoff: sid1.setCutoff(sub_getlong)
gc#a_s1_setFilterMask: sid1.setFilterMask(bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_setFilterType: sid1.setFilterType(bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_enableRingmod: sid1.enableRingmod(bus_getchar,bus_getchar,bus_getchar)
gc#a_s1_enableSynchronization: sid1.enableSynchronization(bus_getchar,bus_getchar,bus_getchar)
' ---------------------------------------------- SIDCog2-Funktionen
gc#a_s2_setRegister: sid2.setRegister(bus_getchar,bus_getchar)
gc#a_s2_updateRegisters: sid2.updateRegisters(sub_getdat(25,@s1buffer))
gc#a_s2_setVolume: sid2.setVolume(bus_getchar)
gc#a_s2_play: sid2.play(bus_getchar,sub_getlong,bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_noteOn: sid2.noteOn(bus_getchar, sub_getlong)
gc#a_s2_noteOff: sid2.noteOff(bus_getchar)
gc#a_s2_setFreq: sid2.setFreq(bus_getchar,sub_getlong)
gc#a_s2_setWaveform: sid2.setWaveform(bus_getchar,bus_getchar)
gc#a_s2_setPWM: sid2.setPWM(bus_getchar,sub_getlong)
gc#a_s2_setADSR: sid2.setADSR(bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_setResonance: sid2.setResonance(bus_getchar)
gc#a_s2_setCutoff: sid2.setCutoff(sub_getlong)
gc#a_s2_setFilterMask: sid2.setFilterMask(bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_setFilterType: sid2.setFilterType(bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_enableRingmod: sid2.enableRingmod(bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_setRegister: sid2.setRegister(bus_getchar,bus_getchar)
gc#a_s2_updateRegisters: sid2.updateRegisters(sub_getdat(25,@s1buffer))
gc#a_s2_setVolume: sid2.setVolume(bus_getchar)
gc#a_s2_play: sid2.play(bus_getchar,sub_getlong,bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_noteOn: sid2.noteOn(bus_getchar, sub_getlong)
gc#a_s2_noteOff: sid2.noteOff(bus_getchar)
gc#a_s2_setFreq: sid2.setFreq(bus_getchar,sub_getlong)
gc#a_s2_setWaveform: sid2.setWaveform(bus_getchar,bus_getchar)
gc#a_s2_setPWM: sid2.setPWM(bus_getchar,sub_getlong)
gc#a_s2_setADSR: sid2.setADSR(bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_setResonance: sid2.setResonance(bus_getchar)
gc#a_s2_setCutoff: sid2.setCutoff(sub_getlong)
gc#a_s2_setFilterMask: sid2.setFilterMask(bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_setFilterType: sid2.setFilterType(bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_enableRingmod: sid2.enableRingmod(bus_getchar,bus_getchar,bus_getchar)
gc#a_s2_enableSynchronization: sid2.enableSynchronization(bus_getchar,bus_getchar,bus_getchar)
' ---------------------------------------------- SID Zusatzfunktionen
gc#a_s2_resetRegisters: sid2.resetRegisters
gc#a_s1_resetRegisters: sid1.resetRegisters
gc#a_s2_resetRegisters: sid2.resetRegisters
gc#a_s1_resetRegisters: sid1.resetRegisters
gc#a_s_beep: sid_beep
gc#a_s_dmpreg: sid_dmpreg 'soundinformationen senden
gc#a_s_dmpreg: sid_dmpreg 'soundinformationen senden
#endif '__ADM_SID
' ---------------------------------------------- AY-SOUNDFUNKTIONEN
#ifdef __ADM_AYS
gc#a_ayStart: ay_start
gc#a_ayStop: ay_stop
gc#a_ayStart: ay_start
gc#a_ayStop: ay_stop
gc#a_ayUpdateRegisters: ay_updateRegisters
#endif '__ADM_AYS
@ -655,7 +672,7 @@ PRI init_chip | err,i,j 'chip: initialisierung d
clr_dmarker 'dir-marker löschen
sdfat.FATEngine
repeat
waitcnt(cnt + clkfreq/10)
waitcnt(cnt + clkfreq)
until sd_mount("B") == 0
'err := sd_mount("B")
'siglow(err)
@ -694,8 +711,11 @@ PRI init_chip | err,i,j 'chip: initialisierung d
#endif '__ADM_COM
#ifdef __ADM_PLX
'plx-bus initialisieren
plx.init 'defaultwerte setzen, poller-cog starten
plx.run 'plexbus freigeben (poller läuft)
FunctionGenerator:=0 'Funktionsgenerator aus
#endif '__ADM_PLX
#ifdef __ADM_LAN
@ -1378,7 +1398,7 @@ PRI sd_del | err 'sdcard: eine datei oder
sub_getstr
err := \sdfat.deleteEntry(@tbuf)
sighigh(err) 'fehleranzeige
siglow(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
PRI sd_rename | err 'sdcard: datei oder verzeichnis umbenennen
@ -2373,6 +2393,11 @@ CON ''------------------------------------------------- PLX-Funktionen
#ifdef __ADM_PLX
VAR
byte FunctionGenerator 'On/Off Marker Funktionsgenerator
PRI plx_in | addr 'port einlesen
addr := bus_getchar
@ -2382,15 +2407,13 @@ PRI plx_out | addr, data 'port ausgeben
addr := bus_getchar
data := bus_getchar
plx.halt
plx.out(addr,data)
plx.run
PRI plx_ch | addr, chan 'ad-wandler auslesen
addr := bus_getchar
chan := bus_getchar
plx.ad_ch(addr,chan)
bus_putchar(plx.ad_ch(addr,chan))
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
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
if reg>3 and reg<7
bus_putchar(!plx.getreg(reg))
else
bus_putchar(plx.getreg(reg))
bus_putchar(!plx.getreg(plx#R_INP0))
PRI plx_get_paddle 'Paddle abfragen (1 x 8bit Port 1 x Analog)
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
@ -2455,6 +2520,21 @@ DAT
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
''funktionsgruppe : lan
''funktion : Netzwerk starten
@ -2512,7 +2592,7 @@ PRI lan_start | hiveid, hivestr, strpos, macpos, i, a
byte[hivestr+strpos] := 0
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
@ -2524,7 +2604,7 @@ PRI lan_stop
''busprotokoll : [072]
if lan_started
sock.stop
\sock.stop
lan_started := false
PRI lan_connect | ipaddr, remoteport, handle, handleidx, i
@ -2547,8 +2627,8 @@ PRI lan_connect | ipaddr, remoteport, handle, handleidx, i
quit
i++
ifnot (handle := sock.connect(ipaddr, remoteport, @bufmain[i*rxlen], rxlen, @buftx[i*txlen], txlen)) == -102
sock.resetBuffers(handle)
ifnot (handle := \sock.connect(ipaddr, remoteport, @bufmain[i*rxlen], rxlen, @buftx[i*txlen], txlen)) == -102
\sock.resetBuffers(handle)
handleidx := handle.byte[0] 'extract the handle index from the lower 8 bits
sockhandle[handleidx] := handle 'komplettes handle zu handle index speichern
bufidx[i] :=handleidx
@ -2559,22 +2639,36 @@ PRI lan_connect | ipaddr, remoteport, handle, handleidx, i
PRI lan_listen | port, handle, handleidx, i
''funktionsgruppe : lan
''funktion : Port für eingehende TCP-Verbindung öffnen
'' bei bereits bestehendem Socket nur handleidx zurücksenden
''eingabe : -
''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
'' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle)
handleidx := bus_getchar
port := sub_getword
'freien Pufferabschnitt suchen
i := 0
repeat sock#sNumSockets
if bufidx[i] == $FF '0xFF: nicht zugewiesen
quit
i++
if handleidx <> $FF 'bestehender (kein neuer) Socket
if \sock.isValidHandle(sockhandle[handleidx]) 'Socket gültig
bus_putchar(handleidx) 'alten handleidx zurücksenden
return
ifnot (handle := sock.listen(port, @bufmain[i*rxlen], rxlen, @buftx[i*txlen], txlen)) == -102
i := 0
if handleidx == $FF 'neue Verbindung
repeat sock#sNumSockets
'freien Pufferabschnitt suchen
if bufidx[i] == $FF '0xFF: nicht zugewiesen
quit
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
handleidx := handle.byte[0] 'extract the handle index from the lower 8 bits
sockhandle[handleidx] := handle 'komplettes handle zu handle index speichern
bufidx[i] :=handleidx
@ -2596,7 +2690,7 @@ PRI lan_waitconntimeout | handleidx, timeout, t, connected
timeout := sub_getword
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)
@ -2610,14 +2704,15 @@ PRI lan_close | handleidx, i
handleidx := bus_getchar
sock.close(sockhandle[handleidx])
\sock.close(sockhandle[handleidx])
'reservierten Pufferabschnitt freigeben
i := 0
repeat sock#sNumSockets
if bufidx[i++] == handleidx '0xFF: nicht zugewiesen
bufidx[i++] := $FF
if bufidx[i] == handleidx '0xFF: nicht zugewiesen
bufidx[i] := $FF
quit
i++
PRI lan_rxtime | handleidx, timeout, t, rxbyte
@ -2636,7 +2731,7 @@ PRI lan_rxtime | handleidx, timeout, t, rxbyte
timeout := sub_getword
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)
@ -2656,8 +2751,8 @@ PRI lan_rxdata | handleidx, len, rxbyte, error
repeat len
ifnot error
repeat while (rxbyte := sock.readByteNonBlocking(sockhandle[handleidx])) < 0
ifnot sock.isConnected(sockhandle[handleidx])
repeat while (rxbyte := \sock.readByteNonBlocking(sockhandle[handleidx])) < 0
ifnot \sock.isConnected(sockhandle[handleidx])
error := sock#ERRSOCKETCLOSED
quit
bus_putchar(rxbyte)
@ -2681,8 +2776,8 @@ PRI lan_txdata | handleidx, len, txbyte, error
repeat len
txbyte := bus_getchar
ifnot error
repeat while sock.writeByteNonBlocking(sockhandle[handleidx], txbyte) < 0
ifnot sock.isConnected(sockhandle[handleidx])
repeat while \sock.writeByteNonBlocking(sockhandle[handleidx], txbyte) < 0
ifnot \sock.isConnected(sockhandle[handleidx])
error := sock#ERRSOCKETCLOSED
quit
@ -2699,7 +2794,7 @@ PRI lan_rxbyte
'' : rxbyte - empfangenes Zeichen oder
'' : sock#RETBUFFEREMPTY (-1) wenn kein Zeichen vorhanden
bus_putchar(sock.readByteNonBlocking(sockhandle[bus_getchar]))
bus_putchar(\sock.readByteNonBlocking(sockhandle[bus_getchar]))
PRI lan_isconnected
''funktionsgruppe : lan
@ -2710,7 +2805,7 @@ PRI lan_isconnected
'' : handleidx - lfd. Nr. der Verbindung
'' : connected - TRUE wenn verbunden, sonst FALSE
bus_putchar(sock.isConnected(sockhandle[bus_getchar]))
bus_putchar(\sock.isConnected(sockhandle[bus_getchar]))
DAT
long ' long alignment for addresses

View File

@ -72,6 +72,7 @@ Logbuch :
21-10-2012-uheld - Window-Funktionen
28-11-2012-uheld - wahlweise Einbindung von VGA- oder TV-Treiber über #define
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:
- setheader
@ -132,6 +133,14 @@ $0A..FF CHAR Zeichenausgabe
'#define __TV
'#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
_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
{
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 regime ' spin-loader OHNE FORTH, reg.sys wird sofort automatisch gestartet

View File

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

View File

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

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
OBJ
nic : "driver_enc28j60"
nic : "adm-enc28j60"
'ser : "SerialMirror"
'stk : "Stack Length"

View File

@ -20,17 +20,32 @@
CON
' 1024 x 768 @ 60Hz settings
' 1024 x 768 @ H:48KHz V:60Hz settings
#ifdef __VGA_MONSET1
hp = 1024 'horizontal pixels
vp = 768 'vertical pixels
hf = 24 'horizontal front porch pixels
hs = 136 'horizontal sync pixels
hs = 136 'horizontal sync pixels
hb = 160 'horizontal back porch pixels
vf = 3 'vertical front porch lines
vs = 6 'vertical sync lines
vb = 29 'vertical back porch lines
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

View File

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

View File

@ -47,6 +47,12 @@ CON 'Signaldefinitionen --------------------------------------------------------
#21, A_Bluetooth_Line 'Key-Line des HC05-Bluetooth-Moduls
#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 -------------------------------------------------------------------------------------
KEY_CTRL = 2
@ -198,7 +204,8 @@ A_BLT = %00000000_00000000_00001000_00000000
a_DCF_GetYear '77
' ---------------------------------------------- LAN-FUNKTIONEN
#81, a_lanStart 'Start Network
#80, a_lanTXFlush 'Warten, bis Sendepuffer geleert ist
a_lanStart 'Start Network
a_lanStop 'Stop Network
a_lanConnect 'ausgehende TCP-Verbindung öffnen
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_SetJoy 'Port für Joystick 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
#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_dmpreg '199 'soundinformationen senden
' ---------------------------------------------- AY-SOUNDFUNKTIONEN
#200, a_ayStart
a_ayStop
a_ayUpdateRegisters
' ############################################## mehrfach verwendete Funktionen
' 200 ... 254 können mehrfach verwendet,
' dürfen aber nur einmal
' 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 --------------------------------------------------------------------------

View File

@ -14,7 +14,7 @@ Chip : Regnatix
Typ : Programm
Version :
Subversion :
Funktion :
Funktion : Fenster mit Dateiliste
Komponenten : -
COG's : -
Logbuch :
@ -79,10 +79,28 @@ PUB redraw | i
i++
ios.printnl
PUB setpos(pos)
PUB setpos(npos)|opos,i,col,row
box_pos := pos
redraw
opos := box_pos
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)

View File

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

View File

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

View File

@ -14,7 +14,7 @@ Chip : Regnatix
Typ : Programm
Version :
Subversion :
Funktion :
Funktion : Warndialog mit zwei Buttons
Komponenten : -
COG's : -
Logbuch :
@ -64,10 +64,14 @@ PUB draw(stradr1,stradr2,stradr3):button | key,bnr
draw_buttons(stradr2,stradr3,bnr)
key := ios.keywait
case key
gc#KEY_CURLEFT: bnr := 1
gc#KEY_CURRIGHT: bnr := 2
gc#KEY_CURLEFT: bnr := 1
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
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)
#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
ADM_OPT = 0
@ -85,32 +91,44 @@ ADM_COM_RX = 41 'com: zeichen empfangen
adm_m_run = 50 'plx: polling aktivieren
adm_m_halt = 51 'plx: polling anhalten
adm_m_setctrl = 52
adm_m_in = 53
adm_m_out = 54
adm_m_ad_ch = 55
adm_m_getreg = 56
adm_m_setreg = 57
adm_m_start = 58
adm_m_stop = 59
adm_m_write = 60
adm_m_read = 61
adm_m_ping = 62
adm_m_in = 52
adm_m_out = 53
adm_m_adch = 54
adm_m_getreg = 55
adm_m_setreg = 56
adm_m_start = 57
adm_m_stop = 58
adm_m_write = 59
adm_m_read = 60
adm_m_ping = 61
adm_m_setadr = 62
adm_m_joy = 63
adm_m_paddle = 64
adm_m_pad = 65
adm_m_setjoy = 66
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_getver = 98 'codeversion abfragen
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

View File

@ -28,6 +28,7 @@ Administra
scr : Screeninterface
hss : Hydra-Soundsystem
sfx : Sound-FX
plx : Gamedevices & Plexbus
Bellatrix
key : Keyboardroutinen
@ -484,7 +485,7 @@ PUB admload(stradr)|dmu 'chip-mgr: neuen adminis
''busprotokoll : [096][sub_putstr.fn]
'' : fn - dateiname des neuen administra-codes
bus_putchar1(gc#a_mgrALoad) 'aktuelles userdir retten
bus_putchar1(gc#a_mgrALoad)
bus_putstr1(stradr)
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
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
''funktionsgruppe : lan
''funktion : Netzwerk starten
@ -1074,16 +1088,18 @@ PUB lan_connect(ipaddr, remoteport): handleidx
bus_putword1(remoteport)
handleidx := bus_getchar1
PUB lan_listen(port): handleidx
PUB lan_listen(oldhandleidx, port): handleidx
''funktionsgruppe : lan
''funktion : Port für eingehende TCP-Verbindung öffnen
''eingabe : -
''ausgabe : -
''busprotokoll : [074][sub_putword.port][get.handleidx]
'' : port - zu öffnende Portnummer
'' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle)
''busprotokoll : [074][put.handleidx][sub_putword.port][get.handleidx]
'' : oldhandleidx - lfd. Nr. der bestehenden Verbindung ($FF wenn neu)
'' : port - zu öffnende Portnummer
'' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle)
bus_putchar1(gc#a_lanListen)
bus_putchar1(oldhandleidx)
bus_putword1(port)
handleidx := bus_getchar1
@ -1493,22 +1509,22 @@ PUB sid_sdmpplay(stradr): err 'sid: dmp-datei stereo a
bus_putstr1(stradr)
err := bus_getchar1
PUB sid_dmpstop
PUB sid_dmpstop 'sid: dmp-player anhalten
bus_putchar1(gc#a_s_dmpstop)
PUB sid_dmppause
PUB sid_dmppause 'sid: dmp-player pausieren
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)
status := bus_getchar1
PUB sid_dmppos: wert
PUB sid_dmppos: wert 'sid: dmp-player playposition abfragen
bus_putchar1(gc#a_s_dmppos)
wert := 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_getlong1
wert := bus_getlong1
@ -1726,6 +1742,98 @@ PUB com_rx:char 'com: zeichen empfangen
bus_putchar1(gc#a_comRx)
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
CON ''------------------------------------------------- CHIP-MANAGMENT
@ -1950,6 +2058,10 @@ PUB printcstr(eadr) | i,len 'screen: bildschirmausga
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
{{printdec(value) - screen: dezimale bildschirmausgabe zahlenwertes}}

View File

@ -28,7 +28,7 @@ REM ----------------------------------------------------------------
REM Flashdateien erzeugen
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%
move admflash.binary %sdsys%\admsys.adm

View File

@ -25,7 +25,7 @@ mkdir ${flash}
# Flashdateien erzeugen
# --> 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
cp admflash.binary ${flash}
mv admflash.binary ${sdsys}/admsys.adm

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 : -
COG's : -
Logbuch :
27-04-2013-dr235 - erste version
01-11-2013-dr235 - redraw/geschwindigkeit verbessert
- div. kleine Optimierungen und Detailverbesserungen
Kommandoliste :
Notizen :
- view nach f9
- tab in wbox
}}
OBJ
ios : "reg-ios"
dlbox[2] : "gui-dlbox"
pbar : "gui-pbar"
wbox : "gui-wbox"
input : "gui-input"
dlbox[2] : "gui-dlbox" 'die beiden dateifenster
pbar : "gui-pbar" 'progress-bar
wbox : "gui-wbox" 'warnbox
input : "gui-input" 'eingabedialog
fm : "fm-con"
gc : "glob-con"
str : "glob-string"
@ -53,51 +55,48 @@ VAR
byte w_pos[2] 'positionen im fenster
byte w_view[2] 'startposition des fensters
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_flags[fm#MAX_FILES] 'selected, directory usw.
byte w0_list[fm#MAX_BUFFER] 'verzeichnisliste sdcard
byte w0_flags[fm#MAX_FILES] 'flags (selktiert, typ)
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_flags[fm#MAX_FILES]
long w1_len[fm#MAX_FILES]
byte w1_number
byte w1_list[fm#MAX_BUFFER] 'verzeichnisliste ramdrive
byte w1_flags[fm#MAX_FILES] 'flags
long w1_len[fm#MAX_FILES] 'dateilängen
byte w1_number 'anzahl der dateien
PUB main | key
init
dlbox[0].focus
dlbox[0].draw
dlbox[1].draw
info_print
repeat
key := ios.keywait
case key
gc#KEY_CURUP: f_curup
gc#KEY_CURDOWN: f_curdown
gc#KEY_CURLEFT: f_curleft
gc#KEY_CURRIGHT: f_curright
gc#KEY_PAGEUP: f_pageup
gc#KEY_PAGEDOWN: f_pagedown
gc#KEY_RETURN: f_open
gc#KEY_BS: f_back
gc#KEY_SPACE: f_select
gc#KEY_ESC:
gc#KEY_TAB: f_focus
gc#KEY_POS1: f_pos1
gc#KEY_F01: f_view
gc#KEY_F02: f_del
gc#KEY_F03: f_load
gc#KEY_F04: f_save
gc#KEY_F05: f_empty
gc#KEY_F06: f_mount
gc#KEY_F07: f_mkdir
gc#KEY_F08: f_selall
gc#KEY_F09: f_full
gc#KEY_F10: f_quit
gc#KEY_CURUP: f_curup
gc#KEY_CURDOWN: f_curdown
gc#KEY_CURLEFT: f_curleft
gc#KEY_CURRIGHT: f_curright
gc#KEY_PAGEUP: f_pageup
gc#KEY_PAGEDOWN: f_pagedown
gc#KEY_RETURN: f_open
gc#KEY_BS: f_back
gc#KEY_SPACE: f_select
gc#KEY_ESC: f_menu
gc#KEY_TAB: f_focus
gc#KEY_POS1: f_pos1
gc#KEY_F01: f_view
gc#KEY_F02: f_del
gc#KEY_F03: f_load
gc#KEY_F04: f_save
gc#KEY_F05: f_empty
gc#KEY_F06: f_mount
gc#KEY_F07: f_mkdir
gc#KEY_F08: f_selall
gc#KEY_F09: f_full
gc#KEY_F10: f_quit
"m": f_menu
"q": f_quit
PRI init
@ -112,8 +111,6 @@ PRI init
w_view[0] := w_view[1] := 0
w_cols[0] := (fm#W1X2-fm#W1X1)/(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
frame_draw
@ -128,19 +125,24 @@ PRI init
wbox.define(5,fm#W4X1,fm#W4Y1,fm#W4X2,fm#W4Y2)
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
ios.sdunmount
repeat
wbox.draw(@str5,@str2,@str3) == 1
wbox.draw(@str5,@str2,@str6)
while ios.sdmount
dlbox[0].draw
dlbox[1].draw
info_print
PRI f_mkdir
PRI f_mkdir 'fkt: verzeichnis erstellen
ios.sdnewdir(input.draw(string("Name eingeben : ")))
w0_clrlist
@ -149,22 +151,24 @@ PRI f_mkdir
dlbox[1].draw
info_print
PRI f_selall | i
PRI f_selall | i 'fkt: alle dateien im verzeichnis selektieren
i := 0
case w_sel
0: repeat w0_number
0: i := 2 'std-einträge . .. auslassen
repeat w0_number
w0_flags[i++] ^= fm#FL_SEL
1: repeat w1_number
1: i := 0
repeat w1_number
w1_flags[i++] ^= fm#FL_SEL
dlbox[w_sel].redraw
PRI f_pos1
PRI f_pos1 'fkt: homeposition im fenster
w_pos[w_sel] := 0
dlbox[w_sel].setpos(w_pos[w_sel])
PRI f_full
PRI f_full 'fkt: fenster maximieren
if w_sel
dlbox[1].defocus
@ -181,7 +185,7 @@ PRI f_full
dlbox[1].draw
w_sel := 0
PRI f_open
PRI f_open 'fkt: verzeichnis öffnen
'nur fenster 1 und verzeichnisse
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
info_print
PRI f_back
PRI f_back 'fkt: verzeichnisebene zurück
ios.sdchdir(string(".."))
w0_clrlist
@ -199,7 +203,7 @@ PRI f_back
dlbox[w_sel].redraw
info_print
PRI f_curup
PRI f_curup 'fkt: cursor hoch
if w_pos[w_sel] > 1
w_pos[w_sel] -= dlbox[w_sel].getcols
@ -207,7 +211,7 @@ PRI f_curup
info_print
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)
w_pos[w_sel] += dlbox[w_sel].getcols
@ -215,7 +219,7 @@ PRI f_curdown
info_print
dir := 1
PRI f_curleft
PRI f_curleft 'fkt: cursor links
if w_pos[w_sel]
w_pos[w_sel]--
@ -223,7 +227,7 @@ PRI f_curleft
info_print
dir := 0
PRI f_curright
PRI f_curright 'fkt: cursor rechts
if w_pos[w_sel] < (fm#WROWS * w_cols[w_sel] - 1)
w_pos[w_sel]++
@ -231,7 +235,7 @@ PRI f_curright
info_print
dir := 1
PRI f_pageup
PRI f_pageup 'fkt: seite zurück
if (w_view[w_sel] - fm#WROWS * w_cols[w_sel]) => 0
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
dlbox[w_sel].setpos(w_pos[w_sel])
PRI f_pagedown | number
PRI f_pagedown | number 'fkt: seite weiter
case w_sel
0: number := w0_number
@ -252,18 +256,22 @@ PRI f_pagedown | number
w_pos[w_sel] := 0
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]
'flag in liste setzen
case w_sel
0: w0_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
0: f_curleft
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
dlbox[w_sel].defocus
@ -274,14 +282,27 @@ ifnot fl_full
dlbox[w_sel].focus
info_print
PRI f_quit
PRI f_quit 'fkt: fm beenden
ios.sddmset(ios#DM_USER) 'regime soll in diesem verzeichnis landen
ios.winset(0)
ios.screeninit
ios.stop
if wbox.draw(@str7,@str3,@str2) == 2
ios.sddmset(ios#DM_USER) 'regime soll in diesem verzeichnis landen
ios.winset(0)
ios.screeninit
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)
i := 0
@ -297,7 +318,7 @@ PRI f_load | i
dlbox[0].draw
dlbox[1].draw
PRI f_save | i
PRI f_save | i 'fkt: ramdrive --> sdcard
pbar.setmaxbar(w1_number)
i := 0
@ -313,7 +334,7 @@ PRI f_save | i
dlbox[0].draw
dlbox[1].draw
PRI f_del | i
PRI f_del | i 'fkt: dateien löschen
if wbox.draw(@str1,@str2,@str3) == 1
pbar.setmaxbar(w0_number)
@ -331,7 +352,7 @@ dlbox[0].draw
dlbox[1].draw
info_print
PRI f_empty
PRI f_empty 'fkt: ramdrive löschen
if wbox.draw(@str4,@str2,@str3) == 1
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
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.curoff
@ -370,7 +397,8 @@ PRI f_view | n,stradr,ch,lch
ios.sdclose
ios.printcls
dlbox[0].redraw
dlbox[1].redraw
ifnot fl_full
dlbox[1].redraw
return
else
lch := 0
@ -387,7 +415,49 @@ PRI f_view | n,stradr,ch,lch
dlbox[1].draw
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
repeat fm#MAX_FILES
@ -400,7 +470,7 @@ PRI w0_clrlist | i
i++
PRI w1_clrlist | i
PRI w1_clrlist | i 'fenster 1: dateiliste löschen
i := 0
repeat fm#MAX_FILES
@ -412,7 +482,7 @@ PRI w1_clrlist | i
w1_list[i] := " "
i++
PRI w0_readdir | stradr,i,j
PRI w0_readdir | stradr,i,j 'fenster 0: dateiliste einlesen
i := 0
ios.sddir
@ -429,10 +499,11 @@ PRI w0_readdir | stradr,i,j
w0_number := i
PRI w1_readdir | stradr,i,j
PRI w1_readdir | stradr,i,j 'fenster 1: dateiliste einlesen
i := 0
ios.rd_dir
ios.rd_next 'ramdrive-label überspringen
repeat while (stradr := ios.rd_next)
j := 0
repeat fm#MAX_LEN
@ -442,7 +513,7 @@ PRI w1_readdir | stradr,i,j
w1_len[i] := ios.rd_dlen
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
case w_sel
@ -456,7 +527,7 @@ PRI get_fname(fnr):adrdat | i,stradr
fname[i] := 0
return @fname
PRI load(stradr) | len,fnr,i
PRI load(stradr) | len,fnr,i 'datei: datei --> ramdrive
ifnot ios.sdopen("r",stradr) 'datei öffnen
len := ios.sdfattrib(ios#F_SIZE)
@ -468,7 +539,7 @@ PRI load(stradr) | len,fnr,i
ios.sdclose
ios.rd_close(fnr)
PRI save(stradr) | fnr,len,i
PRI save(stradr) | fnr,len,i 'datei: ramdrive --> datei
fnr := ios.rd_open(stradr)
ifnot fnr == -1
@ -481,7 +552,7 @@ PRI save(stradr) | fnr,len,i
ios.rd_close(fnr)
PRI frame_draw
PRI frame_draw 'screen: bildschirmmaske ausgeben
ios.winset(0)
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.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]
case w_sel
@ -521,7 +592,7 @@ PRI info_print | pos,len
ios.printdec(ios.ram_getfree)
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
rows := ios.belgetrows 'zeilenzahl bei bella abfragen
@ -531,13 +602,15 @@ PRI pause(sec)
waitcnt(cnt+clkfreq*sec)
DAT
DAT 'strings
str1 byte "Dateien löschen?",0
str2 byte "Ja",0
str3 byte "Nein",0
str4 byte "RAMDrive löschen?",0
str5 byte "SD-Card mounten?",0
str6 byte 0
str7 byte "Programm beenden?",0
DAT

View File

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

View File

@ -55,6 +55,7 @@ PUB main | i,n,len,ch,lch
repeat i from 0 to 3 'extender anhängen
byte[@parastr][len + i] := byte[@ext1][i]
byte[@parastr][len + i] := 0
ios.admsetsyssnd(0) 'systemklänge aus (nervt!)
ifnot ios.sdopen("r",@parastr)
repeat 'text ausgeben
ch := ios.sdgetc
@ -78,6 +79,7 @@ PUB main | i,n,len,ch,lch
'ios.print(string("Hilfetexte : ",$0d))
cmd_dir_w(1)
ios.sdclose 'datei schließen
ios.admsetsyssnd(1) 'systemklänge wieder ein
ios.sddmact(ios#DM_USER) 'u-marker aktivieren
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
cnt_err := cnt_err + cnt_test1 + cnt_test2 + cnt_test3 + cnt_testx
ios.setcolor(4)
ios.setcolor(0)
ios.printcls
ios.printnl
ios.print(string("Statistik eRAM-Test:", $0d, $0d))
ios.print(string("Testdurchläufe : "))
ios.printdec(cnt_loop)
ios.printnl
ios.printnl
ios.setcolor(4)
ios.print(string("Fehler Gesamt : "))
ios.printdec(cnt_err)
ios.printnl
@ -102,9 +104,6 @@ PUB statistik 'ausgabe der fehlerstati
ios.printdec(cnt_testx)
ios.printnl
ios.printnl
ios.print(string("Aktueller Test:", $0d))
ios.printnl
ios.printnl
cnt_test1 := 0
cnt_test2 := 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))
PRI cmd_sysinfo 'cmd: systeminformationen anzeigen
PRI cmd_sysinfo|ack,adr 'cmd: systeminformationen anzeigen
ios.printnl
os_printstr(@msg22,@syst)
@ -716,6 +716,18 @@ PRI cmd_sysinfo 'cmd: systeminformatione
else
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
repeat 16
@ -873,17 +885,17 @@ PRI cmd_dir|fcnt,stradr,hflag 'cmd: verzeichnis anzeig
ios.print(@msg10)
ios.print(@msg5)
ios.print(ios.sdvolname)
ifnot ios.os_error(ios.sddir) 'verzeichnis öffnen
if str.findCharacter(stradr,"h")
hflag := 0
if str.findCharacter(stradr,"w")
fcnt := cmd_dir_w(hflag)
else
fcnt := cmd_dir_l(hflag) 'dir l
ios.printnl
ios.print(@msg10)
ios.print(@msg9)
ios.printdec(fcnt)
ios.sddir 'verzeichnis öffnen
if str.findCharacter(stradr,"h")
hflag := 0
if str.findCharacter(stradr,"w")
fcnt := cmd_dir_w(hflag)
else
fcnt := cmd_dir_l(hflag) 'dir l
ios.printnl
ios.print(@msg10)
ios.print(@msg9)
ios.printdec(fcnt)
else
ios.os_error(1)
@ -1076,6 +1088,7 @@ msg35 byte "Bellatrix Auflösung Y :",0
msg36 byte "Bellatrix Videomodus : ",0
msg37 byte "VGA",0
msg38 byte "TV",0
msg39 byte "PlexBus Devices : ",0
ext1 byte ".BIN",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,19 +1,19 @@
/? : Hilfe
/l : Konfiguration anzeigen
----------- Administra-Funktionen
/ah 0|1 : hss ab-/anschalten
/aw 0|1 : wav ab-/anschalten
/as 0|1 : systemklänge ab-/anschalten
/al 0..100 : wav-lautstärke links
/ar 0..100 : wav-lautstärke rechts
/ah 0..15 : hss-lautstärke
/af : administra reset, flash booten
/at : transfergeschwindigkeit messen
----------- Bellatrix-Funktionen
/ci : farbtabelle anzeigen
/cs datei : farbtabelle speichern
/cl datei : farbtabelle laden
----------- Port-Funktionen
/po nr anz : Impulse an port ausgeben
/pi : Status der Port abfragen
/? : Hilfe
/l : Konfiguration anzeigen
---------------- Administra-Funktionen
/ah 0|1 : hss ab-/anschalten
/aw 0|1 : wav ab-/anschalten
/as 0|1 : systemklänge ab-/anschalten
/al 0..100 : wav-lautstärke links
/ar 0..100 : wav-lautstärke rechts
/ah 0..15 : hss-lautstärke
/af : administra reset, flash booten
/at : transfergeschwindigkeit messen
---------------- Bellatrix-Funktionen
/ci : farbtabelle anzeigen
/cs datei : farbtabelle speichern
/cl datei : farbtabelle laden
---------------- Port-Funktionen
/po nr anz time : Impulse an port ausgeben
/pi : Status der Port abfragen