TriOS-alt/flash/administra/admflash.spin

1335 lines
128 KiB
Plaintext
Raw Normal View History

2010-03-18 19:59:13 +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
2010-04-03 15:37:42 +02:00
Version : 00
Subversion : 01
2010-04-16 00:25:58 +02:00
2010-03-22 21:49:23 +01:00
Funktion : Dieser Code wird von Administra nach einem Reset aus dem EEProm in den hRAM kopiert
2010-04-16 00:25:58 +02:00
und gestartet. Im Gegensatz zu Bellatrix und Regnatix, die einen Loader aus dem EEProm
2010-03-19 00:11:50 +01:00
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
2010-03-22 21:49:23 +01:00
f<00>r das System bietet. Durch eine Bootoption kann dieses BIOS aber zur Laufzeit
2010-04-16 00:25:58 +02:00
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!
2010-04-16 00:25:58 +02:00
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
2010-04-16 00:25:58 +02:00
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!
2010-04-16 00:25:58 +02:00
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
2010-03-18 19:59:13 +01:00
2010-03-22 21:49:23 +01:00
COG's : MANAGMENT 1 COG
2010-04-16 00:25:58 +02:00
FAT/RTC 1 COG
2010-03-22 21:49:23 +01:00
HSS 2 COG's
2010-04-16 00:25:58 +02:00
WAV 2 COG
2010-03-22 21:49:23 +01:00
-------------------
2010-04-16 00:25:58 +02:00
4 Cogs (WAV und HSS werden alternativ verwendet!)
2010-03-18 19:59:13 +01:00
Logbuch :
2010-03-22 21:49:23 +01:00
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
2010-04-03 15:37:42 +02:00
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
2010-04-16 00:25:58 +02:00
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
2010-03-18 19:59:13 +01:00
Kommandoliste :
Notizen :
2010-03-22 21:49:23 +01:00
Was fehlt noch:
- Umwandlung und Verwaltung der speziellen Puffer in einen universellen Heap
2010-04-03 15:37:42 +02:00
Bekannte Fehler:
2010-03-22 21:49:23 +01:00
2010-03-18 19:59:13 +01:00
}}
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
2010-04-16 00:25:58 +02:00
' +----------
' | +------- 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
2010-03-18 19:59:13 +01:00
2010-03-22 21:49:23 +01:00
'
' hbeat --------+
' clk -------+|
' /wr ------+||
' /hs -----+||| +------------------------- /cs
' |||| | +------+ d0..d7
' |||| | | |
DB_IN = %00001001_00000000_00000000_00000000 'dira-wert f<00>r datenbuseingabe
DB_OUT = %00001001_00000000_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
2010-03-18 19:59:13 +01:00
2010-03-22 21:49:23 +01:00
LED_OPEN = HBEAT 'led-pin f<00>r anzeige "dateioperation"
SD_BASE = ADM_SDD0 'baspin cardreader
CNT_HBEAT = 5_000_0000 'blinkgeschw. front-led
2010-03-18 19:59:13 +01:00
MPLEN = 15000 'gr<00><00>e des hss-musikpuffers
2010-03-18 19:59:13 +01:00
2010-04-16 00:25:58 +02:00
'index f<00>r dmarker
#0, RMARKER 'root
SMARKER 'system
UMARKER 'programmverzeichnis
AMARKER
BMARKER
CMARKER
2010-04-03 15:37:42 +02:00
2010-03-18 19:59:13 +01:00
OBJ
sdfat : "admflash-fat" 'fatengine
2010-04-03 15:37:42 +02:00
hss : "admflash-hss" 'hydra-sound-system
wav : "admflash-wav" 'sd-wave
'debugx : "pterm" 'debug
2010-04-03 15:37:42 +02:00
2010-03-18 19:59:13 +01:00
VAR
2010-04-16 00:25:58 +02:00
long dmarker[6] 'speicher f<00>r dir-marker
2010-03-18 19:59:13 +01:00
byte tbuf[20] 'stringpuffer
2010-04-16 00:25:58 +02:00
byte tbuf2[20]
2010-03-18 19:59:13 +01:00
byte bgmusic[MPLEN] 'hss-puffer
byte sfxdat[16 * 32] 'sfx-slotpuffer
byte fl_eof '1 = eof
2010-03-22 21:49:23 +01:00
byte fl_syssnd '1 = systemt<00>ne an
2010-04-16 00:25:58 +02:00
byte fl_syssndback
byte fl_sdwav
2010-03-22 21:49:23 +01:00
byte st_sound '0 = aus, 1 = hss, 2 = wav
2010-03-18 19:59:13 +01:00
' variablen f<00>r sdwav-player
2010-04-16 00:25:58 +02:00
long leftVolume
long rightVolume
long DACCog
long PlayCog
long PlayStack[50]
byte runPlayerFlag
2010-03-18 19:59:13 +01:00
2010-03-22 21:49:23 +01:00
CON ''------------------------------------------------- ADMINISTRA
2010-04-03 15:37:42 +02:00
PUB main | cmd,err 'chip: kommandointerpreter
2010-03-22 21:49:23 +01:00
''funktionsgruppe : chip
''funktion : kommandointerpreter
''eingabe : -
''ausgabe : -
init_chip 'bus/vga/keyboard/maus initialisieren
2010-03-18 19:59:13 +01:00
repeat
2010-03-22 21:49:23 +01:00
cmd := bus_getchar 'kommandocode empfangen
2010-04-03 15:37:42 +02:00
err := 0
case cmd
2010-03-18 19:59:13 +01:00
0: !outa[LED_OPEN] 'led blinken
2010-03-22 21:49:23 +01:00
' ---------------------------------------------- SD-FUNKTIONEN
2010-03-18 19:59:13 +01:00
1: sd_mount '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
2010-04-03 15:37:42 +02:00
10: sd_seek 'zeiger in datei positionieren
2010-04-16 00:25:58 +02:00
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
2010-04-03 15:37:42 +02:00
2010-03-22 21:49:23 +01:00
' ---------------------------------------------- CHIP-MANAGMENT
2010-04-16 00:25:58 +02:00
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
2010-03-18 19:59:13 +01:00
2010-03-22 21:49:23 +01:00
' ---------------------------------------------- HSS-FUNKTIONEN
2010-03-18 19:59:13 +01:00
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
2010-03-22 21:49:23 +01:00
106: hss_vol 'lautst<00>rke setzen
107: sfx_fire 'sfx abspielen
108: sfx_setslot 'sfx-slot setzen
2010-03-18 19:59:13 +01:00
109: sfx_keyoff
110: sfx_stop
2010-03-22 21:49:23 +01:00
' ---------------------------------------------- WAV-FUNKTIONEN
2010-03-18 19:59:13 +01:00
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
2010-04-03 15:37:42 +02:00
2010-03-22 21:49:23 +01:00
PUB init_chip 'chip: initialisierung des administra-chips
''funktionsgruppe : chip
''funktion : - initialisierung des businterface
'' - grundzustand definieren (hss aktiv, systemkl<00>nge an)
''eingabe : -
''ausgabe : -
2010-04-03 15:37:42 +02:00
'debugverbindung
''debugx.start(115200) ' Start des Debug-Terminals
2010-03-22 21:49:23 +01:00
'businterface initialisieren
dira := db_in 'datenbus auf eingabe schalten
outa[bus_hs] := 1 'handshake inaktiv
'grundzustand herstellen (hss aktiv + systemkl<00>nge an)
hss.start 'soundsystem starten
2010-04-16 00:25:58 +02:00
st_sound := 1 'hss aktiviert
2010-03-22 21:49:23 +01:00
fl_syssnd := 1 'systemsound an
2010-04-03 15:37:42 +02:00
sdfat.FATEngine
2010-04-16 00:25:58 +02:00
leftVolume := 100
rightVolume := 100
PlayCog~
clr_dmarker
2010-03-22 21:49:23 +01:00
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?
2010-04-16 00:25:58 +02:00
PUB sighigh(err) 'chip: schneller hbeat | fehlersound
''funktionsgruppe : chip
''funktion : schneller hbeat | fehlersound
''eingabe : -
''ausgabe : -
if err == 0
if fl_syssnd == 1
hss.sfx_play(1, @SoundFX3) 'Heartbeat High
if err <> 0
if fl_syssnd == 1
hss.sfx_play(1, @SoundFX7) 'Error
''debugx.str(string("err : ")) 'debug
''debugx.dec(err)
''debugx.NewLine
2010-04-16 00:25:58 +02:00
PUB siglow(err) 'chip: langsamer hbeat | fehlersound
''funktionsgruppe : chip
''funktion : langsamer hbeat | fehlersound
''eingabe : -
''ausgabe : -
if err == 0
if fl_syssnd == 1
hss.sfx_play(1, @SoundFX4) 'Heartbeat High
if err <> 0
if fl_syssnd == 1
hss.sfx_play(1, @SoundFX7) 'Error
''debugx.str(string("err : ")) 'debug
''debugx.dec(err)
''debugx.NewLine
2010-04-16 00:25:58 +02:00
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
2010-03-22 21:49:23 +01:00
CON ''------------------------------------------------- SUBPROTOKOLLFUNKTIONEN
2010-04-03 15:37:42 +02:00
PUB sub_getstr | i,len 'sub: string einlesen
2010-03-22 21:49:23 +01:00
''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
2010-04-16 00:25:58 +02:00
repeat i from 0 to 19 'puffer l<00>schen und kopieren
tbuf2[i] := tbuf[i]
2010-03-22 21:49:23 +01:00
tbuf[i] := 0
len := bus_getchar 'l<00>ngenbyte name empfangen
repeat i from 0 to len - 1 'dateiname einlesen
tbuf[i] := bus_getchar
2010-04-03 15:37:42 +02:00
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
2010-03-22 21:49:23 +01:00
CON ''------------------------------------------------- CHIP-MANAGMENT
PUB mgr_setsound|sndstat 'cmgr: soundsubsysteme verwalten
2010-04-16 00:25:58 +02:00
''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
2010-04-16 00:25:58 +02:00
bus_putchar(sndstat)
2010-03-22 21:49:23 +01:00
PUB mgr_setsyssound 'cmgr: systemsound ein/ausschalten
''funktionsgruppe : cmgr
''funktion : systemkl<00>nge steuern
''eingabe :
''ausgabe :
2010-04-16 00:25:58 +02:00
''busprotokoll : [094][get.fl_syssnd]
'' : fl_syssnd - flag zur steuerung der systemsounds
'' : 0 - systemt<00>ne aus
'' : 1 - systemt<00>ne an
2010-03-22 21:49:23 +01:00
2010-04-16 00:25:58 +02:00
fl_syssnd := bus_getchar
2010-03-22 21:49:23 +01:00
PUB mgr_getsoundsys 'cmgr: abfrage welches soundsystem aktiv ist
''funktionsgruppe : cmgr
''funktion : abfrage welches soundsystem aktiv ist
''eingabe :
''ausgabe :
2010-04-16 00:25:58 +02:00
''busprotokoll : [095][put.st_sound]
'' : st_sound - status des soundsystems
'' : 0 - sound aus
'' : 1 - hss
'' : 2 - wav
2010-03-22 21:49:23 +01:00
2010-04-16 00:25:58 +02:00
bus_putchar(st_sound)
2010-03-22 21:49:23 +01:00
2010-04-16 00:25:58 +02:00
PUB mgr_aload | err 'cmgr: neuen administra-code booten
2010-03-22 21:49:23 +01:00
''funktionsgruppe : cmgr
''funktion : administra mit neuem code booten
''eingabe :
''ausgabe :
2010-04-16 00:25:58 +02:00
''busprotokoll : [096][sub_getstr.fn]
'' : fn - dateiname des neuen administra-codes
sub_getstr
err := \sdfat.bootPartition(@tbuf, "C")
sighigh(err) 'fehleranzeige
2010-03-22 21:49:23 +01:00
2010-04-16 00:25:58 +02:00
PUB mgr_getcogs: cogs |i,c,cog[8] 'cmgr: abfragen wie viele cogs in benutzung sind
2010-03-22 21:49:23 +01:00
''funktionsgruppe : cmgr
''funktion : abfrage wie viele cogs in benutzung sind
''eingabe : -
''ausgabe : cogs - anzahl der cogs
2010-04-16 00:25:58 +02:00
''busprotokoll : [097][put.cogs]
'' : cogs - anzahl der belegten cogs
2010-03-22 21:49:23 +01:00
2010-04-16 00:25:58 +02:00
cogs := i := 0
2010-03-18 19:59:13 +01:00
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])
2010-04-16 00:25:58 +02:00
while i=>0
bus_putchar(cogs)
2010-03-18 19:59:13 +01:00
2010-04-16 00:25:58 +02:00
PUB mgr_getver 'cmgr: abfrage der version
2010-04-03 15:37:42 +02:00
''funktionsgruppe : cmgr
2010-04-16 00:25:58 +02:00
''funktion : abfrage der version und spezifikation des chips
2010-04-03 15:37:42 +02:00
''eingabe : -
2010-04-16 00:25:58 +02:00
''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
2010-04-03 15:37:42 +02:00
''funktionsgruppe : cmgr
2010-04-16 00:25:58 +02:00
''funktion : abfrage der version und spezifikation des chips
2010-04-03 15:37:42 +02:00
''eingabe : -
2010-04-16 00:25:58 +02:00
''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)
2010-04-03 15:37:42 +02:00
CON ''------------------------------------------------- SD-LAUFWERKSFUNKTIONEN
PUB sd_mount | err 'sdcard: sd-card mounten
''funktionsgruppe : sdcard
''funktion : eingelegtes volume mounten
''eingabe : -
''ausgabe : -
''busprotokoll : [001][put.error]
'' : error - fehlernummer entspr. list
err := \sdfat.mountPartition(0,0) 'karte mounten
siglow(err)
bus_putchar(err) 'fehlerstatus senden
2010-04-16 00:25:58 +02:00
ifnot err
dmarker[RMARKER] := sdfat.getDirCluster 'root-marker setzen
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
err := \sdfat.changeDirectory(string("system"))
ifnot err
dmarker[SMARKER] := sdfat.getDirCluster 'system-marker setzen
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
sdfat.setDirCluster(dmarker[RMARKER]) 'root-marker wieder aktivieren
hss.sfx_play(1, @SoundFX8) 'on-sound
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
PUB sd_opendir | err 'sdcard: verzeichnis <00>ffnen
2010-04-03 15:37:42 +02:00
''funktionsgruppe : sdcard
2010-04-16 00:25:58 +02:00
''funktion : verzeichnis <00>ffnen
2010-04-03 15:37:42 +02:00
''eingabe : -
''ausgabe : -
2010-04-16 00:25:58 +02:00
''busprotokoll : [002]
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
err := \sdfat.listReset
siglow(err)
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
PUB sd_nextfile | flag,i,len,strpt 'sdcard: n<00>chsten eintrag aus verzeichnis holen
2010-04-03 15:37:42 +02:00
''funktionsgruppe : sdcard
2010-04-16 00:25:58 +02:00
''funktion : n<00>chsten eintrag aus verzeichnis holen
2010-04-03 15:37:42 +02:00
''eingabe : -
''ausgabe : -
2010-04-16 00:25:58 +02:00
''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
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
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
2010-04-03 15:37:42 +02:00
PUB sd_open | err,modus,len,i '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
2010-03-18 19:59:13 +01:00
bus_putchar(err) 'ergebnis der operation senden
2010-04-16 00:25:58 +02:00
outa[LED_OPEN] := 1
2010-04-03 15:37:42 +02:00
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
2010-03-18 19:59:13 +01:00
bus_putchar(err) 'ergebnis der operation senden
2010-04-16 00:25:58 +02:00
outa[LED_OPEN] := 0
2010-04-03 15:37:42 +02:00
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
2010-03-18 19:59:13 +01:00
bus_putchar(n)
2010-04-03 15:37:42 +02:00
PUB sd_putc | err 'sdcard: zeichen in datei schreiben
''funktionsgruppe : sdcard
''funktion : zeichen in datei schreiben
''eingabe : -
''ausgabe : -
''busprotokoll : [007][get.char]
'' : char - zu schreibendes zeichen
2010-04-16 00:25:58 +02:00
\sdfat.writeCharacter(bus_getchar)
2010-04-03 15:37:42 +02:00
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
2010-03-18 19:59:13 +01:00
2010-04-03 15:37:42 +02:00
repeat sub_getlong
bus_putchar(\sdfat.readCharacter)
2010-03-18 19:59:13 +01:00
2010-04-03 15:37:42 +02:00
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
2010-03-18 19:59:13 +01:00
2010-04-03 15:37:42 +02:00
repeat sub_getlong
\sdfat.writeCharacter(bus_getchar)
2010-03-18 19:59:13 +01:00
2010-04-16 00:25:58 +02:00
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
2010-03-18 19:59:13 +01:00
2010-04-16 00:25:58 +02:00
wert := sub_getlong
\sdfat.setCharacterPosition(wert)
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
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)
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
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
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
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)
2010-04-03 15:37:42 +02:00
2010-04-16 00:25:58 +02:00
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
2010-03-18 19:59:13 +01:00
2010-04-16 00:25:58 +02:00
sub_putlong(\sdfat.checkUsedSectorCount(string("F")))
2010-03-18 19:59:13 +01:00
2010-04-16 00:25:58 +02:00
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(string("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,i '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
2010-03-18 19:59:13 +01:00
2010-04-16 00:25:58 +02:00
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
2010-03-22 21:49:23 +01:00
2010-04-16 00:25:58 +02:00
sub_getstr
err := \sdfat.formatPartition(0,@tbuf,0)
siglow(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
PUB sd_unmount | err,i '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
2010-04-16 00:25:58 +02:00
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_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
2010-03-22 21:49:23 +01:00
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
2010-03-22 21:49:23 +01:00
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)
2010-03-22 21:49:23 +01:00
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
2010-03-22 21:49:23 +01:00
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
2010-03-22 21:49:23 +01:00
regnr := bus_getchar 'registernummer einlesen
wert := hss.intread(regnr)
bus_putchar(wert >> 8) '16-bit-wert senden hsb/lsb
bus_putchar(wert)
2010-04-16 00:25:58 +02:00
PUB hss_peek 'hss: zugriff auf alle internen playerregister
2010-03-22 21:49:23 +01:00
''funktionsgruppe : hss
''funktion : zugriff auf die internen playerregister; leider sind die register
'' : nicht dokumentiert; 48 long-register
''eingabe : -
''ausgabe : -
2010-04-16 00:25:58 +02:00
''busprotokoll : [104][get.regnr][sub_putlong.regwert]
'' : regnr - registernummer
2010-03-22 21:49:23 +01:00
'' : regwert - long
2010-04-16 00:25:58 +02:00
sub_putlong(hss.peek(bus_getchar))
2010-03-22 21:49:23 +01:00
PUB hss_load | len,i,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
2010-04-16 00:25:58 +02:00
'' : err - fehlernummer entspr. liste
2010-03-22 21:49:23 +01:00
2010-04-03 15:37:42 +02:00
sub_getstr 'dateinamen einlesen
err := \sdfat.openFile(@tbuf, "r") 'datei <00>ffnen
2010-03-22 21:49:23 +01:00
bus_putchar(err) 'ergebnis der operation senden
if err == 0
outa[LED_OPEN] := 1
2010-04-03 15:37:42 +02:00
\sdfat.readData(@bgmusic, MPLEN) 'datei laden
\sdfat.closeFile
2010-03-22 21:49:23 +01:00
outa[LED_OPEN] := 0
CON ''------------------------------------------------- WAV-FUNKTIONEN
2010-04-16 00:25:58 +02:00
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
2010-03-22 21:49:23 +01:00
2010-03-18 19:59:13 +01:00
2010-04-16 00:25:58 +02:00
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
2010-04-16 00:25:58 +02:00
''eingabe : -
''ausgabe : -
''busprotokoll : [151][put.err]
'' : err - fehlernummer entspr. liste
runPlayerFlag := 1
repeat until fl_sdwav == 0
2010-04-16 00:25:58 +02:00
bus_putchar(0)
2010-03-18 19:59:13 +01:00
2010-04-16 00:25:58 +02:00
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)
wav.startPlayer
'wav abspielen
repeat ((\sdfat.readCharacter|(\sdfat.readCharacter<<8)|(\sdfat.readCharacter<<16)|(\sdfat.readCharacter<<24))/512)
!outa[LED_OPEN]
\sdfat.readData(result := wav.transferData, 512)
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
2010-03-18 19:59:13 +01:00
PUB sdw_leftvol 'sdw: lautst<00>rke links
''funktionsgruppe : sdw
''funktion : lautst<00>rke links einstellen
''eingabe : -
''ausgabe : -
''busprotokoll : [153][put.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][put.vol]
'' : vol - lautst<00>rke 0..100
rightVolume := bus_getchar
2010-03-18 19:59:13 +01:00
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
2010-03-18 19:59:13 +01:00
{{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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. %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
}}