TriOS-alt/flash/administra/admflash-old.spin

1141 lines
112 KiB
Plaintext
Raw Normal View History

2010-04-16 00:25:58 +02: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.
Komponenten : HSS 1.2 Andrew Arsenault Lizenz unklar
ASM WAV Player 1b Raymond Allen MIT Lizenz
FATEngine Kwabena W. Agyeman MIT Lizenz
RTCEngine Kwabena W. Agyeman MIT Lizenz
COG's : MANAGMENT 1 COG
FAT/RTC 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<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
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
' +----------
' | +------- 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
' |||| | +------+ 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
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 = 16384 'gr<00><00>e des musikpuffers
SDWBUFSIZE = 100 'puffer f<00>r wav-player
'index f<00>r dmarker
#0, RMARKER 'root
SMARKER 'system
UMARKER 'programmverzeichnis
AMARKER
BMARKER
CMARKER
OBJ
sdfat : "amdflash-fat" 'fatengine
hss : "admflash-hss" 'hydra-sound-system
wav : "admflash-wav" 'sd-wave
'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 st_sound '0 = aus, 1 = hss, 2 = wav
' variablen f<00>r sdwav-player
long sdwp1 'parameter f<00>r play-cog
long sdwp2 'm<00>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 <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_dmarker 'dir-marker aktivieren
' ---------------------------------------------- CHIP-MANAGMENT
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
PUB init_chip '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
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
st_sound := 1 'hss aktiviert
fl_syssnd := 1 'systemsound an
sdfat.FATEngine
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) '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
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
if err <> 0
if fl_syssnd == 1
hss.sfx_play(1, @SoundFX1) 'Error
'debugx.str(string("err : ")) 'debug
'debugx.dec(err)
'debugx.NewLine
PUB clr_dmarker| i 'cmd: dmarker-tabelle l<00>schen
''funktionsgruppe : cmgr
''funktion : dmarker-tabelle l<00>schen
''eingabe : -
''ausgabe : -
i := 0
repeat 6 'alle dir-marker l<00>schen
dmarker[i++] := 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<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
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, "C")
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
'' : spec - spezifikation
'' +----------
'' | +------- 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)
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
clr_dmarker
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])
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 | flag,i,len,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,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
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 | err '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_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(string("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(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
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,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
PUB sd_dmarker|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
sdfat.setDirCluster(dmarker[markernr])
bus_putchar(sdfat#err_noError)
{
if dmarker[markernr]
sdfat.setDirCluster(dmarker[markernr])
bus_putchar(sdfat#err_noError)
else
bus_putchar(sdfat#err_dirNotFound)
}
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<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
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
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 | 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.err]
'' : 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_play | err,srate,sam,n,j,w ''sdw: wav von sd-card abspielen
' - testcode!!!
' - sollte in einer extra cog laufen um nicht den interpreter zu blockieren
' - l<00>uft leider nicht parallel zum hss!!!
hss.stop 'hss stopen da sie sich sonst st<00>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<00>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<00>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<00>ngenbyte name empfangen
repeat j from 0 to len - 1 'dateiname einlesen
tbuf[j] := bus_getchar
err := \sdfat.openFile(@tbuf, "r") 'datei <00>ffnen
bus_putchar(err) 'ergebnis der operation senden
if err == 0
sdwcog := cognew(sdw_play,@sdwstack) + 1 'cog mit wavplayer starten
PUB sdw_stop ''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
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<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
{{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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. %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
}}