{{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 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 startet. 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ät als die Ladeprozedur besitzen, muß das EEProm-Bios von Administra mindestens die Funktionalität des SD-Cardlaufwerkes zur Verfügung stellen können. Es erscheint deshalb sinnvoll, dieses BIOS gleich mit einem ausgewogenen Funktionsumfang auszustatten, welcher alle Funktionen für das System bietet. Durch eine Bootoption kann dieses BIOS aber zur Laufzeit ausgetauscht werden, um das Funktionssetup an konkrete Anforderungen anzupassen. Komponenten : HSS 1.2 Andrew Arsenault Lizenz unklar FSRW 1.6 Radical Eye Software MIT Lizenz SDSPIQASM Radical Eye Software MIT Lizenz ASM WAV Player 1b Raymond Allen MIT Lizenz COG's : MANAGMENT 1 COG FSRW/SDSPI 1 COG HSS 2 COG's WAV 1 COG ------------------- 3 oder 4 Cogs - WAV und HSS werden alternativ verwendet! Logbuch : 14-11-2008-dr235 - erste version erstellt 13-03-2009-dr235 - sd_eof eingefügt 25-01-2009-dr235 - komfortableres interface für hss-player eingefügt 19-03-2009-dr235 - seek, ftime, fattrib und fsize eingefügt 22-08-2009-dr235 - getcogs eingefü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ügt + test - sd_checkmounted/sd_checkused/sd_checkfree eingefügt + test - sd_checkopen eingefügt (test später) 28-03-2010-dr235 - fehler in der anbindung sd_open --> openFile: der modus wurde als 0-term-string übergeben! änderung in einen normalen 1-zeichen-parameter 02-04-2010-dr235 - sd_putblk/sd_getblk eingefügt und gestestet Kommandoliste : Notizen : Was fehlt noch: - Umwandlung und Verwaltung der speziellen Puffer in einen universellen Heap - Fehlernummern - abort-Trap's Bekannte Fehler: }} 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 VER_H = 0 VER_L = 1 VER_S = 1 'subversion "wave" ' ' hbeat --------+ ' clk -------+| ' /wr ------+|| ' /hs -----+||| +------------------------- /cs ' |||| | +------+ d0..d7 ' |||| | | | DB_IN = %00001001_00000000_00000000_00000000 'dira-wert für datenbuseingabe DB_OUT = %00001001_00000000_00000000_11111111 'dira-wert für datenbusausgabe M1 = %00000010_00000000_00000000_00000000 'busclk=1? & /prop1=0? M2 = %00000010_10000000_00000000_00000000 'maske: busclk & /cs (/prop1) M3 = %00000000_00000000_00000000_00000000 'busclk=0? M4 = %00000010_00000000_00000000_00000000 'maske: busclk LED_OPEN = HBEAT 'led-pin für anzeige "dateioperation" SD_BASE = ADM_SDD0 'baspin cardreader CNT_HBEAT = 5_000_0000 'blinkgeschw. front-led MPLEN = 16384 'größe des musikpuffers SDWBUFSIZE = 100 'puffer für wav-player OBJ sdfat : "amdflash-fat" 'fatengine hss : "admflash-hss" 'hydra-sound-system wav : "admflash-wav" 'sd-wave 'debugx : "pterm" 'debug VAR long stackhb[9] 'stack für hbeat-cog byte tbuf[20] 'stringpuffer byte bgmusic[MPLEN] 'hss-puffer byte sfxdat[16 * 32] 'sfx-slotpuffer byte fl_eof '1 = eof byte fl_syssnd '1 = systemtöne an byte st_sound '0 = aus, 1 = hss, 2 = wav ' variablen für sdwav-player long sdwp1 'parameter für play-cog long sdwp2 'müssen hintereinander liegen long sdwp3 long sdwp4 long sdwbuff1[SDWBUFSIZE] long sdwbuff2[SDWBUFSIZE] long sdwstack[10] byte sdwcog byte sdwflag byte sdwh[44] 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 'sd-card mounten ' 2: sd_opendir 'direktory öffnen 3: sd_nextfile 'verzeichniseintrag lesen 4: sd_open 'datei öffnen 5: sd_close 'datei schließ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 'attribute übergeben 12: sd_ftime 'zeitstempel übergeben 13: sd_fsize 'dateigröße übergeben 14: sd_volname 'volumelabel abfragen 15: sd_checkmounted 'test ob volume gemounted ist 16: sd_checkopen 'test ob eine datei geöffnet ist 17: sd_checkused 'test wie viele sektoren benutzt sind 18: sd_checkfree 'test wie viele sektoren frei sind 19: sd_newfile 'neue datei erzeugen ' ---------------------------------------------- CHIP-MANAGMENT 90: mgr_setsyssound 'systemsound ein/ausschalten 91: mgr_getsoundsys 'abfrage welches soundsystem aktiv ist 92: mgr_starthss 'hss starten 93: mgr_stophss 'hss beenden 94: mgr_startwav 'wav-player starten 95: mgr_stopwav 'wav-player beenden 96: mgr_aload 'neues code booten 97: bus_putchar(getcogs) 'freie cogs abfragen 98: bus_putchar(VER_H) '98: codeversion abfragen bus_putchar(VER_L) bus_putchar(VER_S) 99: reboot '99: 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ä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 PUB init_chip 'chip: initialisierung des administra-chips ''funktionsgruppe : chip ''funktion : - initialisierung des businterface '' - grundzustand definieren (hss aktiv, systemklänge an) ''eingabe : - ''ausgabe : - 'debugverbindung 'debugx.start(115200) ' Start des Debug-Terminals 'businterface initialisieren dira := db_in 'datenbus auf eingabe schalten outa[bus_hs] := 1 'handshake inaktiv 'grundzustand herstellen (hss aktiv + systemklänge an) hss.start 'soundsystem starten fl_syssnd := 1 'systemsound an sdfat.FATEngine PUB bus_putchar(zeichen) 'chip: ein byte über bus ausgeben ''funktionsgruppe : chip ''funktion : senderoutine für ein byte zu regnatix über den systembus ''eingabe : byte zeichen ''ausgabe : - waitpeq(M1,M2,0) 'busclk=1? & /prop1=0? dira := db_out 'datenbus auf ausgabe stellen outa[7..0] := zeichen 'daten ausgeben outa[bus_hs] := 0 'daten gültig waitpeq(M3,M4,0) 'busclk=0? outa[bus_hs] := 1 'daten ungültig dira := db_in 'bus freigeben PUB bus_getchar : zeichen 'chip: ein byte über bus empfangen ''funktionsgruppe : chip ''funktion : emfangsroutine für ein byte von regnatix über den systembus ''eingabe : - ''ausgabe : byte zeichen waitpeq(M1,M2,0) 'busclk=1? & /prop1=0? zeichen := ina[7..0] 'daten einlesen outa[bus_hs] := 0 'daten quittieren outa[bus_hs] := 1 waitpeq(M3,M4,0) 'busclk=0? CON ''------------------------------------------------- SUBPROTOKOLLFUNKTIONEN 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änge des dateinamens repeat i from 0 to 19 'puffer löschen tbuf[i] := 0 len := bus_getchar 'lä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änge des dateinamens len := strsize(strptr) bus_putchar(len) repeat i from 0 to len - 1 'string ü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 PUB mgr_setsyssound 'cmgr: systemsound ein/ausschalten ''funktionsgruppe : cmgr ''funktion : systemklänge steuern ''eingabe : ''ausgabe : PUB mgr_getsoundsys 'cmgr: abfrage welches soundsystem aktiv ist ''funktionsgruppe : cmgr ''funktion : abfrage welches soundsystem aktiv ist ''eingabe : ''ausgabe : PUB mgr_starthss 'cmgr: hss starten ''funktionsgruppe : cmgr ''funktion : hss-player starten ''eingabe : ''ausgabe : PUB mgr_stophss 'cmgr: hss beenden ''funktionsgruppe : cmgr ''funktion : hss-player beenden ''eingabe : ''ausgabe : PUB mgr_startwav 'cmgr: wav-player starten ''funktionsgruppe : cmgr ''funktion : wav-player starten ''eingabe : ''ausgabe : PUB mgr_stopwav 'cmgr: wav-player beenden ''funktionsgruppe : cmgr ''funktion : wav-player beenden ''eingabe : ''ausgabe : PUB mgr_aload 'cmgr: neues code booten ''funktionsgruppe : cmgr ''funktion : administra mit neuem code booten ''eingabe : ''ausgabe : PUB 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 i :=0 cogs := 0 repeat 'loads as many cogs as possible and stores their cog numbers c := cog[i] := cognew(@entry, 0) if c=>0 i++ while c => 0 cogs := i repeat 'unloads the cogs and updates the string i-- if i=>0 cogstop(cog[i]) while i=>0 PUB sighigh(err) 'cmgr: schneller hbeat | fehlersound ''funktionsgruppe : cmgr ''funktion : schneller hbeat | fehlersound ''eingabe : - ''ausgabe : - if err == 0 if fl_syssnd == 1 hss.sfx_play(1, @SoundFX3) 'Heartbeat High outa[LED_OPEN] := 1 if err <> 0 if fl_syssnd == 1 hss.sfx_play(1, @SoundFX1) 'Error 'debugx.str(string("err : ")) 'debug 'debugx.dec(err) 'debugx.NewLine PUB siglow(err) 'cmgr: langsamer hbeat | fehlersound ''funktionsgruppe : cmgr ''funktion : langsamer hbeat | fehlersound ''eingabe : - ''ausgabe : - if err == 0 if fl_syssnd == 1 hss.sfx_play(1, @SoundFX4) 'Heartbeat High outa[LED_OPEN] := 1 if err <> 0 if fl_syssnd == 1 hss.sfx_play(1, @SoundFX1) 'Error 'debugx.str(string("err : ")) 'debug 'debugx.dec(err) 'debugx.NewLine 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 PUB sd_volname 'sdcard: volumenlabel abfragen ''funktionsgruppe : sdcard ''funktion : name des volumes überragen ''eingabe : - ''ausgabe : - ''busprotokoll : [014][sub_putstr.volname] '' : volname - name des volumes '' : len - lä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 : [015][put.flag] '' : flag - 0 = unmounted, 1 mounted bus_putchar(\sdfat.checkPartitionMounted) PUB sd_checkopen 'sdcard: test ob eine datei geöffnet ist ''funktionsgruppe : sdcard ''funktion : test ob eine datei geöffnet ist ''eingabe : - ''ausgabe : - ''busprotokoll : [016][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 : [017][sub_putlong.used] '' : used - anzahl der benutzten sektoren sub_putlong(\sdfat.checkUsedSectorCount(string("F"))) PUB sd_checkfree 'sdcard: anzahl der freien sektoren senden ''funktionsgruppe : sdcard ''funktion : anzahl der freien sektoren senden ''eingabe : - ''ausgabe : - ''busprotokoll : [018][sub_putlong.free] '' : free - anzahl der freien sektoren sub_putlong(\sdfat.checkFreeSectorCount(string("F"))) PUB sd_newfile | len,i,err 'sdcard: eine neue datei erzeugen ''funktionsgruppe : sdcard ''funktion : eine neue datei erzeugen ''eingabe : - ''ausgabe : - ''busprotokoll : [019][sub_getstr.fn][put.error] '' : fn - name der datei '' : error - fehlernummer entspr. list sub_getstr err := \sdfat.newFile(@tbuf) sighigh(err) 'fehleranzeige bus_putchar(err) 'ergebnis der operation senden PUB sd_open | err,modus,len,i 'sdcard: datei öffnen ''funktionsgruppe : sdcard ''funktion : eine bestehende datei ö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 PUB sd_close | err 'sdcard: datei schließen ''funktionsgruppe : sdcard ''funktion : die aktuell geöffnete datei schließen ''eingabe : - ''ausgabe : - ''busprotokoll : [005][put.error] '' : error - fehlernummer entspr. list err := \sdfat.closeFile siglow(err) 'fehleranzeige bus_putchar(err) 'ergebnis der operation senden 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 | err 'sdcard: zeichen in datei schreiben ''funktionsgruppe : sdcard ''funktion : zeichen in datei schreiben ''eingabe : - ''ausgabe : - ''busprotokoll : [007][get.char] '' : char - zu schreibendes zeichen sighigh(\sdfat.writeCharacter(bus_getchar)) 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_nextfile | flag,i,len,strpt ''sd: nächsten eintrag aus verzeichnis holen {{sd_nextfile - sd: nächsten eintrag aus verzeichnis holen}} strpt := \sdfat.listName 'nächsten eintrag holen if strpt 'status senden bus_putchar(0) 'kein eintrag mehr else bus_putchar(1) 'gültiger eintrag folgt len := strsize(strpt) bus_putchar(len) if strpt 'wenn eintrag gültig repeat i from 0 to len - 1 'string übertragen bus_putchar(byte[strpt][i]) PUB sd_opendir | err ''sd: verzeichnis öffnen {{sd_opendir - sd: verzeichnis öffnen}} err := \sdfat.listReset siglow(err) PUB sd_seek | wert ''sd: zeiger in datei positionieren 'sd: zeiger in datei positionieren wert := bus_getchar << 24 '32bit wert empfangen hsb/lsb wert := wert + bus_getchar << 16 wert := wert + bus_getchar << 8 wert := wert + bus_getchar \sdfat.setCharacterPosition(wert) PUB sd_fattrib | wert ''sd: dateiattribute übergeben 'sd: dateiattribute übergeben bus_putchar(wert) '1 byte PUB sd_ftime | wert ''sd: zeitstempel übergeben 'sd: zeitstempel übergeben ' wert := \sdfat.getftime bus_putchar(wert >> 24) '32bit wert senden hsb/lsb bus_putchar(wert >> 16) bus_putchar(wert >> 8) bus_putchar(wert) PUB sd_fsize | wert ''sd: dateigröße übergeben 'sd: dateigröße übergeben wert := \sdfat.listSize bus_putchar(wert >> 24) '32bit wert senden hsb/lsb bus_putchar(wert >> 16) bus_putchar(wert >> 8) bus_putchar(wert) 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 :) slot := bus_getchar chan := bus_getchar 'channelnummer lesen if slot == $f0 hss.sfx_play(1, @SoundFX1) 'Play a sound effect on FX channel (1) if slot == $f1 hss.sfx_play(1, @SoundFX2) 'Play a sound effect on FX channel (1) if slot == $f2 hss.sfx_play(1, @SoundFX3) 'Play a sound effect on FX channel (1) if slot == $f3 hss.sfx_play(1, @SoundFX4) 'Play a sound effect on FX channel (1) if slot == $f4 hss.sfx_play(1, @SoundFX5) 'Play a sound effect on FX channel (1) if slot == $f5 hss.sfx_play(1, @SoundFX6) 'Play a sound effect on FX channel (1) 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ü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 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ür den aktuell abgespielten effekt wird die release-phase der '' : adsr-hü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ärke des hss-players wird eingestellt ''eingabe : - ''ausgabe : - ''busprotokoll : [106][get.vol] '' : vol - 0..15 gesamtlautstä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öherwertiger teil des 16bit-registerwertes '' : regnwt - niederwertiger teil des 16bit-registerwertes 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 | regnr,wert '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][put.regwert][put.regwert][put.regwert][put.regwert] '' : regwert - long regnr := bus_getchar 'registernummer einlesen wert := hss.peek(regnr) bus_putchar(wert >> 24) '32bit-registerwert senden hsb/lsb bus_putchar(wert >> 16) bus_putchar(wert >> 8) bus_putchar(wert) 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][put.errnr] sub_getstr 'dateinamen einlesen err := \sdfat.openFile(@tbuf, "r") 'datei öffnen bus_putchar(err) 'ergebnis der operation senden if err == 0 outa[LED_OPEN] := 1 ' \sdfat.pread(@bgmusic, MPLEN) 'datei laden \sdfat.readData(@bgmusic, MPLEN) 'datei laden ' \sdfat.pclose 'datei schließen \sdfat.closeFile outa[LED_OPEN] := 0 CON ''------------------------------------------------- WAV-FUNKTIONEN PUB sdw_play | err,srate,sam,n,j,w,fl_syssndback ''sdw: wav von sd-card abspielen ' - testcode!!! ' - sollte in einer extra cog laufen um nicht den interpreter zu blockieren ' - läuft leider nicht parallel zum hss!!! hss.stop 'hss stopen da sie sich sonst stören fl_syssndback := fl_syssnd 'status der systemsounds merken fl_syssnd := 0 'sytemsound aus sdwflag := 1 outa[LED_OPEN] := 1 ' err := \sdfat.pread(@sdwh, 44) 'headerdaten einlesen err := \sdfat.readData(@sdwh, 44) 'headerdaten einlesen srate := sdwh[27]<<24+sdwh[26]<<16+sdwh[25]<<8+sdwh[24] 'samplerate auslesen sam := sdwh[43]<<24+sdwh[42]<<16+sdwh[41]<<8+sdwh[40] 'samples auslesen sam := sam >> 2 sdwp1 := @sdwbuff1[0] sdwp2 := @sdwbuff2[0] sdwp3 := (80_000_000)/(srate) '#clocks between samples'1814'for 44100ksps, 5000 'for 16ksps sdwp4 := sam wav.start(@sdwp1) 'wavcog starten w := 0 n:=SDWBUFSIZE-1 'nummer des letzten indexelements im puffer j:=SDWBUFSIZE*4 'number of bytes to read repeat while (j==SDWBUFSIZE*4) 'schleife bis unvollständiger puffer gelesen wurde (eof) if (sdwbuff1[n]==0) and w == 0 ' j:=\sdfat.pread(@sdwbuff1, SDWBUFSIZE*4) 'read data words to input stereo buffer j:=\sdfat.readData(@sdwbuff1, SDWBUFSIZE*4) 'read data words to input stereo buffer 'if(sdwbuff1[n]==0) ' sdwbuff1[n]:=1 outa[LED_OPEN] := 1 w := 1 if (sdwbuff2[n]==0) and w == 1 ' j:=\sdfat.pread(@sdwbuff2, SDWBUFSIZE*4) 'read data words to input stereo buffer j:=\sdfat.readData(@sdwbuff2, SDWBUFSIZE*4) 'read data words to input stereo buffer 'if (sdwbuff2[n]==0) ' sdwbuff2[n]:=1 outa[LED_OPEN] := 0 w := 0 wav.stop 'wavcog stopen ' \sdfat.pclose 'datei schließen \sdfat.closeFile hss.start 'hss wieder starten fl_syssnd := fl_syssndback 'status systemsound wiederherstellen outa[LED_OPEN] := 0 sdwflag := 0 'status des players auf inaktiv setzen repeat PUB sdw_start | len,j,err ''sdw: startet extra cog mit sdwav-engine sdw_stop 'ein evtl. noch laufenden player stopen len := bus_getchar 'längenbyte name empfangen repeat j from 0 to len - 1 'dateiname einlesen tbuf[j] := bus_getchar ' \sdfat.mount(SD_BASE) ' err := \sdfat.popen(@tbuf, "r") 'datei öffnen err := \sdfat.openFile(@tbuf, "r") 'datei öffnen bus_putchar(err) 'ergebnis der operation senden if err == 0 sdwcog := cognew(sdw_play,@sdwstack) + 1 'cog mit wavplayer starten PUB sdw_stop | fl_syssndback ''sdw: stopt cog mit sdwav-engine wav.stop 'wavcog stopen if sdwcog cogstop(sdwcog~ - 1) 'player stopen sdwflag := 0 'status des players auf inaktiv setzen outa[LED_OPEN] := 0 fl_syssnd := fl_syssndback 'systemsound evtl. wieder einschlten hss.start 'hss wieder starten PUB sdw_status ''sdw: sendet status des wav-players bus_putchar(sdwflag) DAT 'dummyroutine fü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 {{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 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. │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ }}