TriOS-alt/flash/administra/admflash.spin

1552 lines
149 KiB
Plaintext
Raw Normal View History

2010-11-26 23:58:06 +01:00
<EFBFBD><EFBFBD>{{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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 : Administra-Flash
Chip : Administra
Typ : Flash
Version : 00
Subversion : 01
Funktion : Dieser Code wird von Administra nach einem Reset aus dem EEProm in den hRAM kopiert
und gestartet. Im Gegensatz zu Bellatrix und Regnatix, die einen Loader aus dem EEProm
laden und entsprechende Systemdateien vom SD-Cardlaufwerk booten, also im
wesentlichen vor dem Bootvorgang keine weiter Funktionalit<00>t als die Ladeprozedur
besitzen, mu<00> das EEProm-Bios von Administra mindestens die Funktionalit<00>t des
SD-Cardlaufwerkes zur Verf<00>gung stellen k<00>nnen. Es erscheint deshalb sinnvoll, dieses
BIOS gleich mit einem ausgewogenen Funktionsumfang auszustatten, welcher alle Funktionen
f<00>r das System bietet. Durch eine Bootoption kann dieses BIOS aber zur Laufzeit
ausgetauscht werden, um das Funktionssetup an konkrete Anforderungen anzupassen.
Chip-Managment-Funktionen
- Bootfunktion f<00>r Administra
- Abfrage und Verwaltung des aktiven Soundsystems
- Abfrage Version und Spezifikation
SD-Funktionen:
- FAT32 oder FAT16
- Partitionen bis 1TB und Dateien bis 2GB
- Verzeichnisse
- Verwaltung aller Dateiattribute
- DIR-Marker System
- Verwaltung eines Systemordners
- Achtung: Keine Verwaltung von mehreren ge<00>ffneten Dateien!
HSS-Funktionen:
- 4-Kanal Tracker Engine
- 2-Kanal Sound FX Synthesizer
- 1-Kanal 1Bit ADPCM Sample Engine
- Puffer f<00>r HSS-Datei; Modul ben<00>tigt w<00>hrend der Wiedergabe also keinen
exklusiven SD-Laufwerkszugriff
WAV-Funktionen:
- Wiedergabe von WAV-Dateien bis 22050 Hz direkt von SD-Card
- Achtung: Der WAV-Player belegt exclusiv das SDCard-Laufwerk - SD-Funktionen
w<00>hrendes des Abspielvorgangs f<00>hren zu einem undefinierten Verhalten von
Administra!
Komponenten : HSS 1.2 Andrew Arsenault Lizenz unklar
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
COG's : MANAGMENT 1 COG
FAT/RTC 1 COG
HSS 2 COG's
WAV 2 COG
-------------------
4 Cogs (WAV und HSS werden alternativ verwendet!)
Logbuch :
14-11-2008-dr235 - erste version erstellt
13-03-2009-dr235 - sd_eof eingef<00>gt
25-01-2009-dr235 - komfortableres interface f<00>r hss-player eingef<00>gt
19-03-2009-dr235 - seek, ftime, fattrib und fsize eingef<00>gt
22-08-2009-dr235 - getcogs eingef<00>gt
09-01-2010-dr235 - fehler in sfx_fire korrigiert
10-01-2010-dr235 - fehler in sdw_stop - hss wurde nicht wieder gestartet
15-03-2010-dr235 - start trios
21-03-2010-dr235 - screeninterface entfernt
24-03-2010-dr235 - start einbindung fatengine
- per flashcli laufen schon die ersten kommandos
25-03-2010-dr235 - umstellung fatengine auf fehlernummern
27-03-2010-dr235 - ich hab geburtstag :)
- test mount ok (fat16 + 32, div. sd-cards, fehlermeldungen)
- sd_volname eingef<00>gt + test
- sd_checkmounted/sd_checkused/sd_checkfree eingef<00>gt + test
- sd_checkopen eingef<00>gt (test sp<00>ter)
28-03-2010-dr235 - fehler in der anbindung sd_open --> openFile: der modus
wurde als 0-term-string <00>bergeben! <00>nderung in einen normalen
1-zeichen-parameter
02-04-2010-dr235 - sd_putblk/sd_getblk eingef<00>gt und getestet
03-04-2010-dr235 - sd_opendit, sd_nextfile, sd_fattrib umgearbeitet und getestet
04-04-2010-dr235 - sd_newdir, sd_del, sd_rename eingef<00>gt und getestet
- test sd_seek ok
- sd_chattrib, sd_chdir eingef<00>gt und getestet
- mgr_getver, mgr_getspec, mgr_getcogs eingef<00>gt + getestet
- mgr_aload eingef<00>gt und getestet
- administra hat jetzt einen bootloader! :)
08-04-2010-dr235 - erster test dir-marker-system
12-04-2010-dr235 - neues soundsystem f<00>r wav eingebunden
16-04-2010-dr235 - komplexfehler im wav-system aufgel<00>st
21-04-2010-dr235 - pausen-modus positionsabfrage im wav-player eingef<00>gt & getestet
29-04-2010-dr235 - wav-player: verwendung der dateigr<00><00>e statt dem headerwert, da einige
programme definitiv den headerwert falsch setzen!
09-06-2010-dr085 - frida hat den fehler gefunden, welcher eine korrekte funktion der fatengine
nach einem bootvorgang von administra verhinderte :)
13-06-2010-dr235 - fehler in sd_volname korrigiert
- free/used auf fast umgestellt
18-06-2010-dr085 - fehler bei der businitialisierung: beim systemstart wurde ein kurzer impuls
auf der hs-leitung erzeugt, wodurch ein buszyklus verloren ging (symptom:
flashte man admin, so lief das system erst nach einem reset an)
- fatengine: endg<00>ltige beseitigung der feherhaften volname-abfrage
27-06-2010-dr085 - automount nach boot
19-07-2010-dr235 - booten eines alternativen administra-codes: befindet sich auf der karte
in der root eine datei "adm.sys", so wird diese datei automatisch in
administra geladen
18-09-2010-dr235 - funktion zur abfrage von eof eingef<00>gt
29-10-2010-dr235 - grundlegende routinen f<00>r den plexbus eingef<00>gt
Kommandoliste :
Notizen :
Was fehlt noch:
- Umwandlung und Verwaltung der speziellen Puffer in einen universellen Heap
Bekannte Fehler:
sid1 - funktioniert noch nicht <00>ber das interface; stereo-dmp geht aber
}}
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
'signaldefinitionen administra
#0, D0,D1,D2,D3,D4,D5,D6,D7 'datenbus
#8, ADM_SOUNDL,ADM_SOUNDR 'sound (stereo 2 pin)
#10, ADM_SDD0,ADM_SDCLK,ADM_SDCMD,ADM_SDD3 'sd-cardreader (4 pin)
#23, ADM_SELECT 'administra-auswahlsignal
#24, HBEAT 'front-led
BUSCLK 'bustakt
BUS_WR '/wr - schreibsignal
BUS_HS ' '/hs - quittungssignal
' +----------
' | +------- system
' | | +---- version (<00>nderungen)
' | | | +- subversion (hinzuf<00>gungen)
CHIP_VER = $00_01_01_01
'
' +---------- com
' | +-------- i2c
' | |+------- rtc
' | ||+------ lan
' | |||+----- sid
' | ||||+---- wav
' | |||||+--- hss
' | ||||||+-- bootf<00>hig
' | |||||||+- dateisystem
CHIP_SPEC = %00000000_00000000_00000000_01001111
'
' hbeat --------+
' clk -------+|
' /wr ------+||
' /hs -----+||| +------------------------- /cs
' |||| |+------------------------ adm-p22
' |||| ||+----------------------- adm-p21 (io)
' |||| |||+---------------------- adm-p20 (rx)
' |||| ||||+--------------------- adm-p19 (tx)
' |||| ||||| +------+ d0..d7
' |||| ||||| | |
DB_IN = %00001001_00100000_00000000_00000000 'dira-wert f<00>r datenbuseingabe
DB_OUT = %00001001_00100000_00000000_11111111 'dira-wert f<00>r datenbusausgabe
M1 = %00000010_00000000_00000000_00000000 'busclk=1? & /prop1=0?
M2 = %00000010_10000000_00000000_00000000 'maske: busclk & /cs (/prop1)
M3 = %00000000_00000000_00000000_00000000 'busclk=0?
M4 = %00000010_00000000_00000000_00000000 'maske: busclk
LED_OPEN = HBEAT 'led-pin f<00>r anzeige "dateioperation"
SD_BASE = ADM_SDD0 'baspin cardreader
CNT_HBEAT = 5_000_0000 'blinkgeschw. front-led
MPLEN = 15000 'gr<00><00>e des hss-musikpuffers
'index f<00>r dmarker
#0, RMARKER 'root
SMARKER 'system
UMARKER 'programmverzeichnis
AMARKER
BMARKER
CMARKER
P_TX = 19 'pinbelegung plexbus
P_RX = 20
P_IO = 21
BAUDRATE = 19200 '9600 'baudrate plexbus (mit spin-routinen max. 19200)
T_OPEN = 1_000 'wartezeit open
C_TIMEOUT = 100 'zeitfaktor timeout
OBJ
sdfat : "admflash-fat" 'fatengine
hss : "admflash-hss" 'hydra-sound-system
wav : "admflash-wav" 'sd-wave
plx : "admflash-plx" 'spin-serial
'debugx : "pterm" 'debug
VAR
long dmarker[6] 'speicher f<00>r dir-marker
byte tbuf[20] 'stringpuffer
byte tbuf2[20]
byte bgmusic[MPLEN] 'hss-puffer
byte sfxdat[16 * 32] 'sfx-slotpuffer
' byte fl_eof '1 = eof
byte fl_syssnd '1 = systemt<00>ne an
' byte fl_syssndback
byte fl_sdwav
byte st_sound '0 = aus, 1 = hss, 2 = wav
' variablen f<00>r sdwav-player
long leftVolume
long rightVolume
long DACCog 'cog-nummer das da-wandlers
long PlayCog 'cog-nummer des players
long PlayStack[50] 'stack f<00>r player
byte runPlayerFlag 'flag um player zu steuern: 0:stop, 1: run, 2: pause
long wavLen 'l<00>nge der abgespielten wav / 512
long wavPointer 'aktuelle position des players / 512
CON ''------------------------------------------------- ADMINISTRA
PUB main | cmd,err 'chip: kommandointerpreter
''funktionsgruppe : chip
''funktion : kommandointerpreter
''eingabe : -
''ausgabe : -
init_chip 'bus/vga/keyboard/maus initialisieren
repeat
cmd := bus_getchar 'kommandocode empfangen
err := 0
case cmd
0: !outa[LED_OPEN] 'led blinken
' ---------------------------------------------- SD-FUNKTIONEN
1: sd_mount("M") 'sd-card mounten '
2: sd_opendir 'direktory <00>ffnen
3: sd_nextfile 'verzeichniseintrag lesen
4: sd_open 'datei <00>ffnen
5: sd_close 'datei schlie<00>en
6: sd_getc 'zeichen lesen
7: sd_putc 'zeichen schreiben
8: sd_getblk 'block lesen
9: sd_putblk 'block schreiben
10: sd_seek 'zeiger in datei positionieren
11: sd_fattrib 'dateiattribute <00>bergeben
12: sd_volname 'volumelabel abfragen
13: sd_checkmounted 'test ob volume gemounted ist
14: sd_checkopen 'test ob eine datei ge<00>ffnet ist
15: sd_checkused 'test wie viele sektoren benutzt sind
16: sd_checkfree 'test wie viele sektoren frei sind
17: sd_newfile 'neue datei erzeugen
18: sd_newdir 'neues verzeichnis wird erzeugt
19: sd_del 'verzeichnis oder datei l<00>schen
20: sd_rename 'verzeichnis oder datei umbenennen
21: sd_chattrib 'attribute <00>ndern
22: sd_chdir 'verzeichnis wechseln
23: sd_format 'medium formatieren
24: sd_unmount 'medium abmelden
25: sd_dmact 'dir-marker aktivieren
26: sd_dmset 'dir-marker setzen
27: sd_dmget 'dir-marker status abfragen
28: sd_dmclr 'dir-marker l<00>schen
29: sd_dmput 'dir-marker status setzen
30: sd_eof 'eof abfragen
' ---------------------------------------------- SD-FUNKTIONEN
31: plx_open 'plexus <00>ffnen
32: plx_close 'plexus schliessen
33: plx_put8 '8 bit senden
34: plx_get8 '8 bit empfangen
35: plx_reset 'plexbus r<00>cksetzen
' ---------------------------------------------- CHIP-MANAGMENT
92: mgr_setsound 'soundsubsysteme verwalten
93: mgr_getspec 'spezifikation abfragen
94: mgr_setsyssound 'systemsound ein/ausschalten
95: mgr_getsoundsys 'abfrage welches soundsystem aktiv ist
96: mgr_aload 'neuen code booten
97: mgr_getcogs 'freie cogs abfragen
98: mgr_getver 'codeversion abfragen
99: reboot 'neu starten
' ---------------------------------------------- HSS-FUNKTIONEN
100: hss_load 'hss-datei in puffer laden
101: hss.hmus_load(@bgmusic) 'play
hss.hmus_play
102: hss.hmus_stop 'stop
103: hss.hmus_pause 'pause
104: hss_peek 'register lesen
105: hss_intreg 'interfaceregister auslesen
106: hss_vol 'lautst<00>rke setzen
107: sfx_fire 'sfx abspielen
108: sfx_setslot 'sfx-slot setzen
109: sfx_keyoff
110: sfx_stop
' ---------------------------------------------- WAV-FUNKTIONEN
150: sdw_start 'spielt wav-datei direkt von sd-card ab
151: sdw_stop 'stopt wav-cog
152: sdw_status 'fragt status des players ab
153: sdw_leftvol 'lautst<00>rke links
154: sdw_rightvol 'lautst<00>rke rechts
155: sdw_pause 'player pause/weiter-modus
156: sdw_position
' ---------------------------------------------- DEBUG-FUNKTIONEN
255: mgr_debug 'debugfunktion
PUB init_chip | err 'chip: initialisierung des administra-chips
''funktionsgruppe : chip
''funktion : - initialisierung des businterface
'' - grundzustand definieren (hss aktiv, systemkl<00>nge an)
''eingabe : -
''ausgabe : -
'debugverbindung
'debugx.start(115200) ' Start des Debug-Terminals
'businterface initialisieren
outa[bus_hs] := 1 'handshake inaktiv ,frida
dira := db_in 'datenbus auf eingabe schalten ,frida
'grundzustand herstellen (hss aktiv + systemkl<00>nge an)
'hss starten
hss.start 'soundsystem starten
st_sound := 1 'hss aktiviert
fl_syssnd := 1 'systemsound an
'sd-card starten
clr_dmarker 'dir-marker l<00>schen
sdfat.FATEngine
err := sd_mount("B")
siglow(err)
'wav starten
leftVolume := 100
rightVolume := 100
PlayCog~
'plexbus initialisieren
dira[P_IO]~~ 'io auf ausgabe schalten
outa[P_IO]~~ 'io = 1 (inaktiv)
plx.init(P_RX,P_TX,BAUDRATE)
repeat 5
plx.tx(0)
'adm-code booten?
ifnot \sdfat.openFile(string("adm.sys"), "R") 'test ob adm.sys vorhanden ist
\sdfat.bootPartition(string("adm.sys"), ".") 'neuen code booten
PUB bus_putchar(zeichen) 'chip: ein byte <00>ber bus ausgeben
''funktionsgruppe : chip
''funktion : senderoutine f<00>r ein byte zu regnatix <00>ber den systembus
''eingabe : byte zeichen
''ausgabe : -
waitpeq(M1,M2,0) 'busclk=1? & /prop1=0?
dira := db_out 'datenbus auf ausgabe stellen
outa[7..0] := zeichen 'daten ausgeben
outa[bus_hs] := 0 'daten g<00>ltig
waitpeq(M3,M4,0) 'busclk=0?
outa[bus_hs] := 1 'daten ung<00>ltig
dira := db_in 'bus freigeben
PUB bus_getchar : zeichen 'chip: ein byte <00>ber bus empfangen
''funktionsgruppe : chip
''funktion : emfangsroutine f<00>r ein byte von regnatix <00>ber den systembus
''eingabe : -
''ausgabe : byte zeichen
waitpeq(M1,M2,0) 'busclk=1? & /prop1=0?
zeichen := ina[7..0] 'daten einlesen
outa[bus_hs] := 0 'daten quittieren
outa[bus_hs] := 1
waitpeq(M3,M4,0) 'busclk=0?
PUB sighigh(err) 'chip: schneller hbeat | fehlersound
''funktionsgruppe : chip
''funktion : schneller hbeat | fehlersound
''eingabe : -
''ausgabe : -
if fl_syssnd == 1
if err == 0
hss.sfx_play(1, @SoundFX3) 'Heartbeat High
else
hss.sfx_play(1, @SoundFX7) 'Error
PUB siglow(err) 'chip: langsamer hbeat | fehlersound
''funktionsgruppe : chip
''funktion : langsamer hbeat | fehlersound
''eingabe : -
''ausgabe : -
if fl_syssnd == 1
if err == 0
hss.sfx_play(1, @SoundFX4) 'Heartbeat High
else
hss.sfx_play(1, @SoundFX7) 'Error
PUB clr_dmarker| i 'chip: dmarker-tabelle l<00>schen
''funktionsgruppe : chip
''funktion : dmarker-tabelle l<00>schen
''eingabe : -
''ausgabe : -
i := 0
repeat 6 'alle dir-marker l<00>schen
dmarker[i++] := TRUE
CON ''------------------------------------------------- SUBPROTOKOLL-FUNKTIONEN
PUB sub_getstr | i,len 'sub: string einlesen
''funktionsgruppe : sub
''funktion : subprotokoll um einen string von regnatix zu empfangen und im
'' : textpuffer (tbuf) zu speichern
''eingabe : -
''ausgabe : -
''busprotokoll : [get.len][get.byte(1)]..[get.byte(len)]
'' : len - l<00>nge des dateinamens
repeat i from 0 to 19 'puffer l<00>schen und kopieren
tbuf2[i] := tbuf[i]
tbuf[i] := 0
len := bus_getchar 'l<00>ngenbyte name empfangen
repeat i from 0 to len - 1 'dateiname einlesen
tbuf[i] := bus_getchar
PUB sub_putstr(strptr)|len,i 'sub: string senden
''funktionsgruppe : sub
''funktion : subprotokoll um einen string an regnatix zu senden
''eingabe : strptr - zeiger auf einen string (0-term)
''ausgabe : -
''busprotokoll : [put.len][put.byte(1)]..[put.byte(len)]
'' : len - l<00>nge des dateinamens
len := strsize(strptr)
bus_putchar(len)
repeat i from 0 to len - 1 'string <00>bertragen
bus_putchar(byte[strptr][i])
PUB sub_putlong(wert) 'sub: long senden
''funktionsgruppe : sub
''funktion : subprotokoll um einen long-wert an regnatix zu senden
''eingabe : 32bit wert der gesendet werden soll
''ausgabe : -
''busprotokoll : [put.byte1][put.byte2][put.byte3][put.byte4]
'' : [ hsb ][ ][ ][ lsb ]
bus_putchar(wert >> 24) '32bit wert senden hsb/lsb
bus_putchar(wert >> 16)
bus_putchar(wert >> 8)
bus_putchar(wert)
PUB sub_getlong:wert 'sub: long empfangen
''funktionsgruppe : sub
''funktion : subprotokoll um einen long-wert von regnatix zu empfangen
''eingabe : -
''ausgabe : 32bit-wert der empfangen wurde
''busprotokoll : [get.byte1][get.byte2][get.byte3][get.byte4]
'' : [ hsb ][ ][ ][ lsb ]
wert := bus_getchar << 24 '32 bit empfangen hsb/lsb
wert := wert + bus_getchar << 16
wert := wert + bus_getchar << 8
wert := wert + bus_getchar
CON ''------------------------------------------------- CHIP-MANAGMENT-FUNKTIONEN
PUB mgr_setsound|sndstat 'cmgr: soundsubsysteme verwalten
''funktionsgruppe : cmgr
''funktion : soundsubsysteme an- bzw. abschalten
''eingabe : -
''ausgabe : -
''busprotokoll : [150][get.funktion][put.sndstat]
'' : funktion - 0: hss-engine abschalten
'' : 1: hss-engine anschalten
'' : 2: dac-engine abschalten
'' : 3: dac-engine anschalten
'' : sndstat - status/cognr startvorgang
sndstat := 0
case bus_getchar
0: if st_sound == 1
hss.hmus_stop
hss.sfx_stop(0)
hss.sfx_stop(1)
hss.stop
st_sound := 0
1: if st_sound == 0
sndstat := hss.start
st_sound := 1
2: if st_sound == 2
cogstop(DACCog)
st_sound := 0
3: if st_sound == 0
sndstat := DACCog := wav.DACEngine(0)
st_sound := 2
bus_putchar(sndstat)
PUB mgr_setsyssound 'cmgr: systemsound ein/ausschalten
''funktionsgruppe : cmgr
''funktion : systemkl<00>nge steuern
''eingabe :
''ausgabe :
''busprotokoll : [094][get.fl_syssnd]
'' : fl_syssnd - flag zur steuerung der systemsounds
'' : 0 - systemt<00>ne aus
'' : 1 - systemt<00>ne an
fl_syssnd := bus_getchar
PUB mgr_getsoundsys 'cmgr: abfrage welches soundsystem aktiv ist
''funktionsgruppe : cmgr
''funktion : abfrage welches soundsystem aktiv ist
''eingabe :
''ausgabe :
''busprotokoll : [095][put.st_sound]
'' : st_sound - status des soundsystems
'' : 0 - sound aus
'' : 1 - hss
'' : 2 - wav
bus_putchar(st_sound)
PUB mgr_aload | err 'cmgr: neuen administra-code booten
''funktionsgruppe : cmgr
''funktion : administra mit neuem code booten
''eingabe :
''ausgabe :
''busprotokoll : [096][sub_getstr.fn]
'' : fn - dateiname des neuen administra-codes
sub_getstr
err := \sdfat.bootPartition(@tbuf, ".")
sighigh(err) 'fehleranzeige
PUB mgr_getcogs: cogs |i,c,cog[8] 'cmgr: abfragen wie viele cogs in benutzung sind
''funktionsgruppe : cmgr
''funktion : abfrage wie viele cogs in benutzung sind
''eingabe : -
''ausgabe : cogs - anzahl der cogs
''busprotokoll : [097][put.cogs]
'' : cogs - anzahl der belegten cogs
cogs := i := 0
repeat 'loads as many cogs as possible and stores their cog numbers
c := cog[i] := cognew(@entry, 0)
if c=>0
i++
while c => 0
cogs := i
repeat 'unloads the cogs and updates the string
i--
if i=>0
cogstop(cog[i])
while i=>0
bus_putchar(cogs)
PUB mgr_getver 'cmgr: abfrage der version
''funktionsgruppe : cmgr
''funktion : abfrage der version und spezifikation des chips
''eingabe : -
''ausgabe : cogs - anzahl der cogs
''busprotokoll : [098][sub_putlong.ver]
'' : ver - version
'' +----------
'' | +------- system
'' | | +---- version (<00>nderungen)
'' | | | +- subversion (hinzuf<00>gungen)
''version : $00_00_00_00
''
sub_putlong(CHIP_VER)
PUB mgr_getspec 'cmgr: abfrage der spezifikation des chips
''funktionsgruppe : cmgr
''funktion : abfrage der version und spezifikation des chips
''eingabe : -
''ausgabe : cogs - anzahl der cogs
''busprotokoll : [089][sub_putlong.spec]
'' : spec - spezifikation
''
'' +---------- com
'' | +-------- i2c
'' | |+------- rtc
'' | ||+------ lan
'' | |||+----- sid
'' | ||||+---- wav
'' | |||||+--- hss
'' | ||||||+-- bootf<00>hig
'' | |||||||+- dateisystem
''spezifikation : %00000000_00000000_00000000_01001111
sub_putlong(CHIP_SPEC)
PUB mgr_debug 'cmgr: debug
' adresse der ersten variable senden
sub_putlong(@dmarker) 'adresse erste variable als marker
CON ''------------------------------------------------- SD-LAUFWERKS-FUNKTIONEN
PUB sd_mount(mode) | err 'sdcard: sd-card mounten frida
''funktionsgruppe : sdcard
''funktion : eingelegtes volume mounten
''eingabe : -
''ausgabe : -
''busprotokoll : [001][put.error]
'' : error - fehlernummer entspr. list
ifnot sdfat.checkPartitionMounted 'frida
err := \sdfat.mountPartition(0,0) 'karte mounten
siglow(err)
'bus_putchar(err) 'fehlerstatus senden
if mode == "M" 'frida
bus_putchar(err) 'fehlerstatus senden
ifnot err
dmarker[RMARKER] := sdfat.getDirCluster 'root-marker setzen
err := \sdfat.changeDirectory(string("system"))
ifnot err
dmarker[SMARKER] := sdfat.getDirCluster 'system-marker setzen
sdfat.setDirCluster(dmarker[RMARKER]) 'root-marker wieder aktivieren
hss.sfx_play(1, @SoundFX8) 'on-sound
else 'frida
bus_putchar(0) 'frida
PUB sd_opendir | err 'sdcard: verzeichnis <00>ffnen
''funktionsgruppe : sdcard
''funktion : verzeichnis <00>ffnen
''eingabe : -
''ausgabe : -
''busprotokoll : [002]
err := \sdfat.listReset
siglow(err)
PUB sd_nextfile | strpt 'sdcard: n<00>chsten eintrag aus verzeichnis holen
''funktionsgruppe : sdcard
''funktion : n<00>chsten eintrag aus verzeichnis holen
''eingabe : -
''ausgabe : -
''busprotokoll : [003][put.status=0]
'' : [003][put.status=1][sub_putstr.fn]
'' : status - 1 = g<00>ltiger eintrag
'' : 0 = es folgt kein eintrag mehr
'' : fn - verzeichniseintrag string
strpt := \sdfat.listName 'n<00>chsten eintrag holen
if strpt 'status senden
bus_putchar(1) 'kein eintrag mehr
sub_putstr(strpt)
else
bus_putchar(0) 'g<00>ltiger eintrag folgt
PUB sd_open | err,modus 'sdcard: datei <00>ffnen
''funktionsgruppe : sdcard
''funktion : eine bestehende datei <00>ffnen
''eingabe : -
''ausgabe : -
''busprotokoll : [004][get.modus][sub_getstr.fn][put.error]
'' : modus - "A" Append, "W" Write, "R" Read
'' : fn - name der datei
'' : error - fehlernummer entspr. list
modus := bus_getchar 'modus empfangen
sub_getstr
err := \sdfat.openFile(@tbuf, modus)
sighigh(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
outa[LED_OPEN] := 1
PUB sd_close | err 'sdcard: datei schlie<00>en
''funktionsgruppe : sdcard
''funktion : die aktuell ge<00>ffnete datei schlie<00>en
''eingabe : -
''ausgabe : -
''busprotokoll : [005][put.error]
'' : error - fehlernummer entspr. list
err := \sdfat.closeFile
siglow(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
outa[LED_OPEN] := 0
PUB sd_getc | n 'sdcard: zeichen aus datei lesen
''funktionsgruppe : sdcard
''funktion : zeichen aus datei lesen
''eingabe : -
''ausgabe : -
''busprotokoll : [006][put.char]
'' : char - gelesenes zeichen
n := \sdfat.readCharacter
bus_putchar(n)
PUB sd_putc 'sdcard: zeichen in datei schreiben
''funktionsgruppe : sdcard
''funktion : zeichen in datei schreiben
''eingabe : -
''ausgabe : -
''busprotokoll : [007][get.char]
'' : char - zu schreibendes zeichen
\sdfat.writeCharacter(bus_getchar)
PUB sd_eof 'sdcard: eof abfragen
''funktionsgruppe : sdcard
''funktion : eof abfragen
''eingabe : -
''ausgabe : -
''busprotokoll : [030][put.eof]
'' : eof - eof-flag
bus_putchar(sdfat.getEOF)
PUB sd_getblk 'sdcard: block aus datei lesen
''funktionsgruppe : sdcard
''funktion : block aus datei lesen
''eingabe : -
''ausgabe : -
''busprotokoll : [008][sub_getlong.count][put.char(1)]..[put.char(count)]
'' : count - anzahl der zu lesenden zeichen
'' : char - gelesenes zeichen
repeat sub_getlong
bus_putchar(\sdfat.readCharacter)
PUB sd_putblk 'sdcard: block in datei schreiben
''funktionsgruppe : sdcard
''funktion : block in datei schreiben
''eingabe : -
''ausgabe : -
''busprotokoll : [009][sub_getlong.count][put.char(1)]..[put.char(count)]
'' : count - anzahl der zu schreibenden zeichen
'' : char - zu schreibende zeichen
repeat sub_getlong
\sdfat.writeCharacter(bus_getchar)
PUB sd_seek | wert 'sdcard: zeiger in datei positionieren
''funktionsgruppe : sdcard
''funktion : zeiger in datei positionieren
''eingabe : -
''ausgabe : -
''busprotokoll : [010][sub_getlong.pos]
'' : pos - neue zeichenposition in der datei
wert := sub_getlong
\sdfat.setCharacterPosition(wert)
PUB sd_fattrib | anr,wert 'sdcard: dateiattribute <00>bergeben
''funktionsgruppe : sdcard
''funktion : dateiattribute abfragen
''eingabe : -
''ausgabe : -
''busprotokoll : [011][get.anr][sub_putlong.wert]
'' : anr - 0 = Dateigr<00><00>e
'' : 1 = Erstellungsdatum - Tag
'' : 2 = Erstellungsdatum - Monat
'' : 3 = Erstellungsdatum - Jahr
'' : 4 = Erstellungsdatum - Sekunden
'' : 5 = Erstellungsdatum - Minuten
'' : 6 = Erstellungsdatum - Stunden
'' : 7 = Zugriffsdatum - Tag
'' : 8 = Zugriffsdatum - Monat
'' : 9 = Zugriffsdatum - Jahr
'' : 10 = <00>nderungsdatum - Tag
'' : 11 = <00>nderungsdatum - Monat
'' : 12 = <00>nderungsdatum - Jahr
'' : 13 = <00>nderungsdatum - Sekunden
'' : 14 = <00>nderungsdatum - Minuten
'' : 15 = <00>nderungsdatum - Stunden
'' : 16 = Read-Only-Bit
'' : 17 = Hidden-Bit
'' : 18 = System-Bit
'' : 19 = Direktory
'' : 20 = Archiv-Bit
'' : wert - wert des abgefragten attributes
anr := bus_getchar
case anr
0: wert := \sdfat.listSize
1: wert := \sdfat.listCreationDay
2: wert := \sdfat.listCreationMonth
3: wert := \sdfat.listCreationYear
4: wert := \sdfat.listCreationSeconds
5: wert := \sdfat.listCreationMinutes
6: wert := \sdfat.listCreationHours
7: wert := \sdfat.listAccessDay
8: wert := \sdfat.listAccessMonth
9: wert := \sdfat.listAccessYear
10: wert := \sdfat.listModificationDay
11: wert := \sdfat.listModificationMonth
12: wert := \sdfat.listModificationYear
13: wert := \sdfat.listModificationSeconds
14: wert := \sdfat.listModificationMinutes
15: wert := \sdfat.listModificationHours
16: wert := \sdfat.listIsReadOnly
17: wert := \sdfat.listIsHidden
18: wert := \sdfat.listIsSystem
19: wert := \sdfat.listIsDirectory
20: wert := \sdfat.listIsArchive
sub_putlong(wert)
PUB sd_volname 'sdcard: volumenlabel abfragen
''funktionsgruppe : sdcard
''funktion : name des volumes <00>berragen
''eingabe : -
''ausgabe : -
''busprotokoll : [012][sub_putstr.volname]
'' : volname - name des volumes
'' : len - l<00>nge des folgenden strings
sub_putstr(\sdfat.listVolumeLabel) 'label holen und senden
PUB sd_checkmounted 'sdcard: test ob volume gemounted ist
''funktionsgruppe : sdcard
''funktion : test ob volume gemounted ist
''eingabe : -
''ausgabe : -
''busprotokoll : [013][put.flag]
'' : flag - 0 = unmounted, 1 mounted
bus_putchar(\sdfat.checkPartitionMounted)
PUB sd_checkopen 'sdcard: test ob eine datei ge<00>ffnet ist
''funktionsgruppe : sdcard
''funktion : test ob eine datei ge<00>ffnet ist
''eingabe : -
''ausgabe : -
''busprotokoll : [014][put.flag]
'' : flag - 0 = not open, 1 open
bus_putchar(\sdfat.checkFileOpen)
PUB sd_checkused 'sdcard: anzahl der benutzten sektoren senden
''funktionsgruppe : sdcard
''funktion : anzahl der benutzten sektoren senden
''eingabe : -
''ausgabe : -
''busprotokoll : [015][sub_putlong.used]
'' : used - anzahl der benutzten sektoren
sub_putlong(\sdfat.checkUsedSectorCount("F"))
PUB sd_checkfree 'sdcard: anzahl der freien sektoren senden
''funktionsgruppe : sdcard
''funktion : anzahl der freien sektoren senden
''eingabe : -
''ausgabe : -
''busprotokoll : [016][sub_putlong.free]
'' : free - anzahl der freien sektoren
sub_putlong(\sdfat.checkFreeSectorCount("F"))
PUB sd_newfile | err 'sdcard: eine neue datei erzeugen
''funktionsgruppe : sdcard
''funktion : eine neue datei erzeugen
''eingabe : -
''ausgabe : -
''busprotokoll : [017][sub_getstr.fn][put.error]
'' : fn - name der datei
'' : error - fehlernummer entspr. liste
sub_getstr
err := \sdfat.newFile(@tbuf)
sighigh(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
PUB sd_newdir | err 'sdcard: ein neues verzeichnis erzeugen
''funktionsgruppe : sdcard
''funktion : ein neues verzeichnis erzeugen
''eingabe : -
''ausgabe : -
''busprotokoll : [018][sub_getstr.fn][put.error]
'' : fn - name des verzeichnisses
'' : error - fehlernummer entspr. liste
sub_getstr
err := \sdfat.newDirectory(@tbuf)
sighigh(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
PUB sd_del | err 'sdcard: eine datei oder ein verzeichnis l<00>schen
''funktionsgruppe : sdcard
''funktion : eine datei oder ein verzeichnis l<00>schen
''eingabe : -
''ausgabe : -
''busprotokoll : [019][sub_getstr.fn][put.error]
'' : fn - name des verzeichnisses oder der datei
'' : error - fehlernummer entspr. liste
sub_getstr
err := \sdfat.deleteEntry(@tbuf)
sighigh(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
PUB sd_rename | err 'sdcard: datei oder verzeichnis umbenennen
''funktionsgruppe : sdcard
''funktion : datei oder verzeichnis umbenennen
''eingabe : -
''ausgabe : -
''busprotokoll : [020][sub_getstr.fn1][sub_getstr.fn2][put.error]
'' : fn1 - alter name
'' : fn2 - neuer name
'' : error - fehlernummer entspr. liste
sub_getstr 'fn1
sub_getstr 'fn2
err := \sdfat.renameEntry(@tbuf2,@tbuf)
sighigh(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
PUB sd_chattrib | err 'sdcard: attribute <00>ndern
''funktionsgruppe : sdcard
''funktion : attribute einer datei oder eines verzeichnisses <00>ndern
''eingabe : -
''ausgabe : -
''busprotokoll : [021][sub_getstr.fn][sub_getstr.attrib][put.error]
'' : fn - dateiname
'' : attrib - string mit attributen
'' : error - fehlernummer entspr. liste
sub_getstr
sub_getstr
err := \sdfat.changeAttributes(@tbuf2,@tbuf)
siglow(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
PUB sd_chdir | err 'sdcard: verzeichnis wechseln
''funktionsgruppe : sdcard
''funktion : verzeichnis wechseln
''eingabe : -
''ausgabe : -
''busprotokoll : [022][sub_getstr.fn][put.error]
'' : fn - name des verzeichnisses
'' : error - fehlernummer entspr. list
sub_getstr
err := \sdfat.changeDirectory(@tbuf)
siglow(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
PUB sd_format | err 'sdcard: medium formatieren
''funktionsgruppe : sdcard
''funktion : medium formatieren
''eingabe : -
''ausgabe : -
''busprotokoll : [023][sub_getstr.vlabel][put.error]
'' : vlabel - volumelabel
'' : error - fehlernummer entspr. list
sub_getstr
err := \sdfat.formatPartition(0,@tbuf,0)
siglow(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
PUB sd_unmount | err 'sdcard: medium abmelden
''funktionsgruppe : sdcard
''funktion : medium abmelden
''eingabe : -
''ausgabe : -
''busprotokoll : [024][put.error]
'' : error - fehlernummer entspr. list
err := \sdfat.unmountPartition
siglow(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
ifnot err
clr_dmarker
hss.sfx_play(1, @SoundFX9) 'off-sound
PUB sd_dmact|markernr 'sdcard: einen dir-marker aktivieren
''funktionsgruppe : sdcard
''funktion : ein ausgew<00>hlter dir-marker wird aktiviert
''eingabe : -
''ausgabe : -
''busprotokoll : [025][get.dmarker][put.error]
'' : dmarker - dir-marker
'' : error - fehlernummer entspr. list
markernr := bus_getchar
ifnot dmarker[markernr] == TRUE
sdfat.setDirCluster(dmarker[markernr])
bus_putchar(sdfat#err_noError)
else
bus_putchar(sdfat#err_noError)
PUB sd_dmset|markernr 'sdcard: einen dir-marker setzen
''funktionsgruppe : sdcard
''funktion : ein ausgew<00>hlter dir-marker mit dem aktuellen verzeichnis setzen
''eingabe : -
''ausgabe : -
''busprotokoll : [026][get.dmarker]
'' : dmarker - dir-marker
markernr := bus_getchar
dmarker[markernr] := sdfat.getDirCluster
PUB sd_dmget|markernr 'sdcard: einen dir-marker abfragen
''funktionsgruppe : sdcard
''funktion : den status eines ausgew<00>hlter dir-marker abfragen
''eingabe : -
''ausgabe : -
''busprotokoll : [027][get.dmarker][sub_putlong.dmstatus]
'' : dmarker - dir-marker
'' : dmstatus - status des markers
markernr := bus_getchar
sub_putlong(dmarker[markernr])
PUB sd_dmput|markernr 'sdcard: einen dir-marker <00>bertragen
''funktionsgruppe : sdcard
''funktion : den status eines ausgew<00>hlter dir-marker <00>bertragen
''eingabe : -
''ausgabe : -
''busprotokoll : [029][get.dmarker][sub_getlong.dmstatus]
'' : dmarker - dir-marker
'' : dmstatus - status des markers
markernr := bus_getchar
dmarker[markernr] := sub_getlong
PUB sd_dmclr|markernr 'sdcard: einen dir-marker l<00>schen
''funktionsgruppe : sdcard
''funktion : ein ausgew<00>hlter dir-marker l<00>schen
''eingabe : -
''ausgabe : -
''busprotokoll : [028][get.dmarker]
'' : dmarker - dir-marker
markernr := bus_getchar
dmarker[markernr] := TRUE
CON ''------------------------------------------------- HSS-FUNKTIONEN
PUB sfx_fire | slot, chan, slotadr 'sfx: effekt im puffer abspielen
''funktionsgruppe : sfx
''funktion : effekt aus einem effektpuffer abspielen
''eingabe : -
''ausgabe : -
''busprotokoll : [107][get.slot][get.chan]
'' : slot - $00..$0f nummer der freien effektpuffer
'' : slot - $f0..f5 vordefinierte effektslots
'' : chan - 0/1 stereokanal auf dem der effekt abgespielt werden soll
''vordefinierte effekte : &f0 - warnton
'' : $f1 - signalton
'' : $f2 - herzschlag schnell
'' : $f3 - herzschlag langsam
'' : $f4 - telefon
'' : $f5 - phaser :)
'' : $f6 - pling
'' : $f7 - on
'' : $f8 - off
slot := bus_getchar
chan := bus_getchar 'channelnummer lesen
case slot
$f0: hss.sfx_play(1, @SoundFX1) 'warnton
$f1: hss.sfx_play(1, @SoundFX2) 'signalton
$f2: hss.sfx_play(1, @SoundFX3) 'herzschlag schnell
$f3: hss.sfx_play(1, @SoundFX4) 'herzschlag schnell
$f4: hss.sfx_play(1, @SoundFX5) 'telefon
$f5: hss.sfx_play(1, @SoundFX6) 'phase
$f6: hss.sfx_play(1, @SoundFX7) 'pling
$f7: hss.sfx_play(1, @SoundFX8) 'on
$f8: hss.sfx_play(1, @SoundFX9) 'off
other:
if slot < $f0
slotadr := @sfxdat + (slot * 32) 'slotnummer lesen und adresse berechnen
hss.sfx_play(chan, slotadr)
PUB sfx_setslot | slotadr, i 'sfx: daten in sfx-slotpuffer schreiben
''funktionsgruppe : sfx
''funktion : die daten f<00>r ein sfx-slot werden werden von regnatix gesetzt
''eingabe : -
''ausgabe : -
''busprotokoll : [108][get.slot][32:get.daten]
'' : slot - $00..$0f nummer der freien effektpuffer
'' : daten - 32 byte effektdaten
''
''struktur der effektdaten:
''
''[wav ][len ][freq][vol ] grundschwingung
''[lfo ][lfw ][fma ][ama ] modulation
''[att ][dec ][sus ][rel ] h<00>llkurve
''[seq ] (optional)
''
''[wav] wellenform
'' 0 sinus (0..500hz)
'' 1 schneller sinus (0..1khz)
'' 2 dreieck (0..500hz)
'' 3 rechteck (0..1khz)
'' 4 schnelles rechteck (0..4khz)
'' 5 impulse (0..1,333hz)
'' 6 rauschen
''[len] tonl<00>nge $0..$fe, $ff endlos
''[freq] frequenz $00..$ff
''[vol] lautst<00>rke $00..$0f
''
''[lfo] low frequency oscillator $ff..$01
''[lfw] low frequency waveform
'' $00 sinus (0..8hz)
'' $01 fast sine (0..16hz)
'' $02 ramp up (0..8hz)
'' $03 ramp down (0..8hz)
'' $04 square (0..32hz)
'' $05 random
'' $ff sequencer data (es folgt eine sequenzfolge [seq])
''[fma] frequency modulation amount
'' $00 no modulation
'' $01..$ff
''[ama] amplitude modulation amount
'' $00 no modulation
'' $01..$ff
''[att] attack $00..$ff
''[dec] decay $00..$ff
''[sus] sustain $00..$ff
''[rel] release $00..$ff
slotadr := @sfxdat + (bus_getchar * 32) 'slotnummer lesen und adresse berechnen
repeat i from 0 to 31
byte[slotadr + i] := bus_getchar 'sfx-daten einlesen
PUB sfx_keyoff | chan 'sfx: release-phase einleiten um den effekt zu beenden
''funktionsgruppe : sfx
''funktion : f<00>r den aktuell abgespielten effekt wird die release-phase der
'' : adsr-h<00>llkurve eingeleitet, um ihn zu beenden
''eingabe : -
''ausgabe : -
''busprotokoll : [109][get.chan]
'' : chan - 0/1 stereokanal auf dem der effekt abgespielt werden soll
chan := bus_getchar 'channelnummer lesen
hss.sfx_keyoff(chan)
PUB sfx_stop | chan 'sfx: effekt sofort beenden
''funktionsgruppe : sfx
''funktion : der aktuell abgespielte effekt wird sofort beendet
''eingabe : -
''ausgabe : -
''busprotokoll : [110][get.chan]
'' : chan - 0/1 stereokanal auf dem der effekt abgespielt werden soll
chan := bus_getchar 'channelnummer lesen
hss.sfx_stop(chan)
PUB hss_vol 'hss: volume 0..15 einstellen
''funktionsgruppe : hss
''funktion : lautst<00>rke des hss-players wird eingestellt
''eingabe : -
''ausgabe : -
''busprotokoll : [106][get.vol]
'' : vol - 0..15 gesamtlautst<00>rke des hss-players
hss.hmus_vol(bus_getchar)
PUB hss_intreg | regnr,wert 'hss: auslesen der player-register
''funktionsgruppe : hss
''funktion : abfrage eines hss-playerregisters (16bit) durch regnatix
''eingabe : -
''ausgabe : -
''busprotokoll : [105][get.regnr][put.reghwt][put.regnwt]
'' : regnr - 0..24 (5 x 5 register)
'' : reghwt - h<00>herwertiger teil des 16bit-registerwertes
'' : regnwt - niederwertiger teil des 16bit-registerwertes
''
''0 iEndFlag iRowFlag iEngineC iBeatC iRepeat globale Playerwerte
''5 iNote iOktave iVolume iEffekt iInstrument Soundkanal 1
''10 iNote iOktave iVolume iEffekt iInstrument Soundkanal 2
''15 iNote iOktave iVolume iEffekt iInstrument Soundkanal 3
''20 iNote iOktave iVolume iEffekt iInstrument Soundkanal 4
''
''iEndFlag Repeat oder Ende wurde erreicht
''iRowFlag Trackerzeile (Row) ist fertig
''iEngineC Patternz<00>hler
''iBeatC Beatz<00>hler (Anzahl der Rows)
''iRepeat Z<00>hler f<00>r Loops
regnr := bus_getchar 'registernummer einlesen
wert := hss.intread(regnr)
bus_putchar(wert >> 8) '16-bit-wert senden hsb/lsb
bus_putchar(wert)
PUB hss_peek 'hss: zugriff auf alle internen playerregister
''funktionsgruppe : hss
''funktion : zugriff auf die internen playerregister; leider sind die register
'' : nicht dokumentiert; 48 long-register
''eingabe : -
''ausgabe : -
''busprotokoll : [104][get.regnr][sub_putlong.regwert]
'' : regnr - registernummer
'' : regwert - long
sub_putlong(hss.peek(bus_getchar))
PUB hss_load | err 'hss: musikdatei in puffer laden
''funktionsgruppe : hss
''funktion : hss-datei wird in den modulpuffer geladen
''eingabe : -
''ausgabe : -
''busprotokoll : [100][sub_getstr.fn][put.err]
'' : fn - dateiname
'' : err - fehlernummer entspr. liste
sub_getstr 'dateinamen einlesen
err := \sdfat.openFile(@tbuf, "r") 'datei <00>ffnen
bus_putchar(err) 'ergebnis der operation senden
if err == 0
outa[LED_OPEN] := 1
\sdfat.readData(@bgmusic, MPLEN) 'datei laden
\sdfat.closeFile
outa[LED_OPEN] := 0
CON ''------------------------------------------------- WAV-FUNKTIONEN
PUB sdw_start | err 'sdw: startet extra cog mit sdwav-engine
''funktionsgruppe : sdw
''funktion : wav-datei von sd-card abspielen
''eingabe : -
''ausgabe : -
''busprotokoll : [150][sub.getstr][put.err]
'' : err - fehlernummer entspr. liste
sub_getstr 'dateinamen empfangen
err := \sdfat.openFile(@tbuf, "r") 'datei <00>ffnen
bus_putchar(err) 'ergebnis der operation senden
if err == 0 'player starten
runPlayerFlag := 0
PlayCog := cognew(sdw_player,@PlayStack) 'player-cog starten
PUB sdw_stop 'sdw: stopt cog mit sdwav-engine
''funktionsgruppe : sdw
''funktion : wav-player signal zum stoppen senden
'' : wartet bis player endet und quitiert erst dann
''eingabe : -
''ausgabe : -
''busprotokoll : [151][put.err]
'' : err - fehlernummer entspr. liste
runPlayerFlag := 1
repeat until fl_sdwav == 0
bus_putchar(0)
PUB sdw_status 'sdw: sendet status des wav-players
''funktionsgruppe : sdw
''funktion : status des wav-players abfragen
''eingabe : -
''ausgabe : -
''busprotokoll : [152][put.status]
'' : status - status des wav-players
'' : 0: wav fertig (player beendet)
'' : 1: wav wird abgespielt
bus_putchar(fl_sdwav)
PRI sdw_player 'sdw: player-cog
''funktionsgruppe : sdw
''funktion : player-cog
'' : - diese routine wird in einer extra-cog gestartet
'' : - beschickt die DACEngine mit den sounddaten aus der
'' : ge<00>ffneten datei
'' :
''eingabe : ge<00>ffnete wav-datei
''ausgabe : -
''ACHTUNG : w<00>hrend der player aktiv ist (fl_sdwav == 1) ist die sd-card
'' : exclusiv belegt! jede dateioperation f<00>hrt zum crash von
'' : administra!
dira[LED_OPEN] := 1
fl_sdwav := 1 'flag setzen das player aktiv ist
'headerdaten einlesen
\sdfat.setCharacterPosition(22)
wav.changeNumberOfChannels(result := (sdfat.readCharacter | (sdfat.readCharacter << 8)))
wav.changeSampleRate(sdfat.readCharacter | (sdfat.readCharacter << 8) | (sdfat.readCharacter << 16) | (sdfat.readCharacter << 24))
\sdfat.setCharacterPosition(34)
wav.changeBitsPerSample(result := (sdfat.readCharacter | (sdfat.readCharacter << 8)))
wav.changeSampleSign(result == 16)
wav.changeLeftChannelVolume(leftVolume)
wav.changeRightChannelVolume(rightVolume)
\sdfat.setCharacterPosition(40)
' wavLen := (\sdfat.readCharacter|(\sdfat.readCharacter<<8)|(\sdfat.readCharacter<<16)|(\sdfat.readCharacter<<24))/512
wavLen := (\sdfat.listSize - 44) / 512 'abfrage der dateigr<00><00>e, ist robuster als der dateiheader, da einige
'den header nicht richtig setzen!
wavPointer := 0
wav.startPlayer
'wav abspielen
repeat (wavLen)
!outa[LED_OPEN]
\sdfat.readData(result := wav.transferData, 512)
wavPointer++
case runPlayerFlag
1: quit 'player stoppen
2: wav.changeLeftChannelVolume(0) 'player pause
wav.changeRightChannelVolume(0)
repeat while runPlayerFlag == 2
wav.changeLeftChannelVolume(leftVolume)
wav.changeRightChannelVolume(rightVolume)
' if runPlayerFlag 'signal player stoppen?
' quit
'player beednen
wav.stopPlayer 'dacengine signal stop senden
wav.clearData
\sdfat.closeFile
fl_sdwav := 0 'flag setzen player inaktiv
dira[LED_OPEN] := 0
PUB sdw_leftvol 'sdw: lautst<00>rke links
''funktionsgruppe : sdw
''funktion : lautst<00>rke links einstellen
''eingabe : -
''ausgabe : -
''busprotokoll : [153][get.vol]
'' : vol - lautst<00>rke 0..100
leftVolume := bus_getchar
PUB sdw_rightvol 'sdw: lautst<00>rke rechts
''funktionsgruppe : sdw
''funktion : lautst<00>rke rechts einstellen
''eingabe : -
''ausgabe : -
''busprotokoll : [154][get.vol]
'' : vol - lautst<00>rke 0..100
rightVolume := bus_getchar
PUB sdw_pause 'sdw: versetzt player in pause-modus
''funktionsgruppe : sdw
''funktion : wav-player signal zum f<00>r pause/weiter
'' :
''eingabe : -
''ausgabe : -
''busprotokoll : [155][put.err]
'' : err - fehlernummer entspr. liste
case runPlayerFlag
0: runPlayerFlag := 2
2: runPlayerFlag := 0
bus_putchar(0)
PUB sdw_position 'sdw: position des players abfragen
''funktionsgruppe : sdw
''funktion : position des players abfragen
'' :
''eingabe : -
''ausgabe : -
''busprotokoll : [156][sub_putlong.pointer][sub_putlong.len]
'' : pointer - position des players im wav / 512
'' : len - l<00>nge der wav / 512
sub_putlong(wavPointer)
sub_putlong(wavLen)
CON ''------------------------------------------------- PLEXBUS-FUNKTIONEN
PRI plx_reset 'plx: plexbus r<00>cksetzen
dira[P_IO]~~ 'io auf ausgabe schalten
outa[P_IO]~~ 'io = 1 (inaktiv)
plx.init(P_RX,P_TX,BAUDRATE) 'schnittstelle initialisieren
repeat 5 'tx "freipusten"
plx.tx(0)
repeat 5 'plexus triggern
outa[P_IO]~
plx.tx(0)
waitcnt(cnt + clkfreq/10)
outa[P_IO]~~
PRI plx_open 'plx: plexus <00>ffnen
''funktionsgruppe : plexbus
''funktion : kommunikation zu einem plexus er<00>ffnen
''busprotokoll : [31][get.plxnr][put.err]
'' : plxnr - adresse des plexus
'' : err - 0: kein fehler
'' 22: timeout
plx.init(P_RX,P_TX,BAUDRATE)
outa[P_IO]~ 'io = 0 - plexus triggern
waitcnt(cnt + T_OPEN) 'lassen wir ihnen etwas zeit
plx.tx(bus_getchar) 'sende plexus-adresse
if plx_start 'best<00>tigung abwarten
outa[P_IO]~~
bus_putchar(22)
else
'waitpeq(|< P_RX, |< P_RX, 0) 'warten bis empf<00>nger fertig ist
bus_putchar(0)
PRI plx_close 'plx: plexus schliessen
''funktionsgruppe : plexbus
''funktion : aktuelle kommunikation beenden
''busprotokoll : [32][put.err]
'' : err - 0: kein fehler
'' 22: timeout
ifnot plx_start
waitpeq(0, |< P_RX, 0) 'warten bis empf<00>nger bereit ist
plx.tx(0) 'funktion 0 = close
waitpeq(|< P_RX, |< P_RX, 0) 'warten bis empf<00>nger fertig ist
outa[P_IO]~~
bus_putchar(0)
else
outa[P_IO]~~
bus_putchar(22)
PRI plx_put8 'plx: zeichen senden
''funktionsgruppe : plexbus
''funktion : char an plexus senden
''busprotokoll : [33][put.char]
waitpeq(0, |< P_RX, 0) 'warten bis empf<00>nger bereit ist
plx.tx(bus_getchar) 'daten senden
waitpeq(|< P_RX, |< P_RX, 0) 'warten bis empf<00>nger fertig ist
PRI plx_get8 'plx: zeichen empfangen
''funktionsgruppe : plexbus
''funktion : char empfangen
''busprotokoll : [34][get.char]
plx.init(P_RX,-1,BAUDRATE) 'tx freigeben f<00>r handshake
outa[P_TX] := 0
dira[P_TX]~~ 'anzeige bereit zum empfang
bus_putchar(plx.rx) 'zeichen empfangen
dira[P_TX]~ '<00>bertragung abgeschlossen
plx.init(P_RX,P_TX,BAUDRATE) 'bus wieder voll belegen
PRI plx_start:hs|i 'plx: warten auf empfangsbereitschaft
' hs = 0 - quittung erfolgreich
' hs > 0 - timeout
hs := i := 0
repeat 'auf quittung warten...
hs := ina[P_RX] 'mit timeout
until (hs == 0) OR (i++ == C_TIMEOUT)
DAT 'dummyroutine f<00>r getcogs
org
'
' Entry: dummy-assemblercode fuer cogtest
'
entry jmp entry 'just loops
DAT 'feste sfx-slots
'Wav 'Len 'Fre 'Vol 'LFO 'LFW 'FMa 'AMa
SoundFX1 byte $01, $FF, $80, $0F, $0F, $00, $07, $90
'Att 'Dec 'Sus 'Rel
byte $FF, $10, $00, $FF
'Wav 'Len 'Fre 'Vol 'LFO 'LFW 'FMa 'AMa
SoundFX2 byte $05, $FF, $00, $0F, $04, $FF, $01, $05
'Att 'Dec 'Sus 'Rel
byte $F1, $24, $00, $FF
'16step Sequencer Table
byte $F1, $78, $3C, $00, $00, $00, $F1, $78, $3C, $00, $00, $00, $00, $00, $00, $00
'Wav 'Len 'Fre 'Vol 'LFO 'LFW 'FMa 'AMa 'Heartbeat
SoundFX3 byte $00, $FF, $06, $0F, $09, $FF, $04, $05
'Att 'Dec 'Sus 'Rel
byte $F1, $F4, $F0, $0F
byte $F1, $78, $3C, $00, $00, $00, $F1, $78, $3C, $00, $00, $00, $00, $00, $00, $00
'Wav 'Len 'Fre 'Vol 'LFO 'LFW 'FMa 'AMa 'Heartbeat low
SoundFX4 byte $00, $FE, $06, $0f, $15, $FF, $04, $05
'Att 'Dec 'Sus 'Rel
byte $F1, $F4, $F0, $0F
byte $F1, $78, $3C, $00, $00, $00, $F1, $78, $3C, $00, $00, $00, $00, $00, $00, $00
'Wav 'Len 'Fre 'Vol 'LFO 'LFW 'FMa 'AMa 'Telefon
SoundFX5 byte $05, $15, $4F, $0F, $01, $04, $05, $00
'Att 'Dec 'Sus 'Rel
byte $FF, $00, $00, $FF
'Wav 'Len 'Fre 'Vol 'LFO 'LFW 'FMa 'AMa
SoundFX6 byte $06, $FF, $5F, $0F, $01, $03, $01, $00 'Teleport
'Att 'Dec 'Sus 'Rel
byte $FF, $14, $00, $FF
SoundFX7 'pling
' Wav Len Fre Vol LFO LFW FMa AMa Att Dec Sus Rel
byte $04,$01,$80,$0F,$00,$00,$00,$00,$FF,$00,$00,$80
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01
SoundFX8 'on
' Wav Len Fre Vol LFO LFW FMa AMa Att Dec Sus Rel
byte $00,$05,$10,$0F,$08,$02,$05,$00,$FF,$00,$50,$11
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01
SoundFX9 'off
' Wav Len Fre Vol LFO LFW FMa AMa Att Dec Sus Rel
byte $00,$05,$33,$0F,$05,$03,$10,$00,$FF,$00,$50,$11
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01
{{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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. %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
}}