{{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 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 (SD,SID) Chip : Administra Typ : Flash Version : 00 Subversion : 01 Funktion : Diese Codeversion basiert auf admini.spin und wird durch eine SID-Chip-Emulation als Soundfunktion erweitert. Geladen werden zwei SIDCogs, wodurch insgesamt sechs unabhängige Soundkanäle nutzbar sind, oder eine Kombination von einer SIDCog für SFX und einer SIDCog für die Wiedergabe einer DMP-Datei direkt UND gleichzeitig von SD-Card möglich wird. Zusätzlich zu den DMP-Files wird später noch ein einfacher Tracker integriert, welcher die Musi nicht von SD-Card, sondern aus einem Puffer im hRam abspielt. Dadurch werden auch während der Musikwiedergabe wieder Dateioperationen möglich, was ja so bei der DMP-Playerroutine nicht geht. Infos zur SIDCog: http://forums.parallax.com/forums/default.aspx?f=25&p=1&m=409209 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ä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. Chip-Managment-Funktionen - Bootfunktion fü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öffneten Dateien! SIDCog-Funktionen: Komponenten : SIDCog Ver. 080 Johannes Ahlebrand MIT Lizenz FATEngine 01/18/2009 Kwabena W. Agyeman MIT Lizenz RTCEngine 11/22/2009 Kwabena W. Agyeman MIT Lizenz COG's : MANAGMENT 1 COG FAT/RTC 1 COG SIDCog's 2 COG's DMP/Tracker 1 COG (dynamisch) ------------------- 5 Cogs Logbuch : 19-06-2010-dr235 - erste version aus admini.spin extrahiert 06-04-2012-dr235 - sid_dmpreg eingefügt Kommandoliste : Notizen : 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 (änderungen) ' | | | +- subversion (hinzufügungen) CHIP_VER = $00_01_01_01 ' ' +---------- com ' | +-------- i2c ' | |+------- rtc ' | ||+------ lan ' | |||+----- sid ' | ||||+---- wav ' | |||||+--- hss ' | ||||||+-- bootfähig ' | |||||||+- dateisystem CHIP_SPEC = %00000000_00000000_00000000_01010011 ' ' 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 'index für dmarker #0, RMARKER 'root SMARKER 'system UMARKER 'programmverzeichnis AMARKER BMARKER CMARKER 'sidcog playRate = 50 'Hz detune = 1.006 OBJ sdfat : "adm-fat" 'fatengine sid1 : "adm-sid" 'SIDCog sid2 : "adm-sid" 'SIDCog ' debugx : "pterm" 'debug VAR long dmarker[6] 'speicher für dir-marker byte tbuf[20] 'stringpuffer byte tbuf2[20] long sidreg1 'adresse register der sidcog 1 long sidreg2 'adresse register der sidcog 2 long dmpcog 'id der dmp-player-cog long dmpstack[50] 'stack für dmpcog byte sidbuffer[25] 'puffer für dmpcog byte dmpstatus '0 = inaktiv; 1 = play; 2 = pause long dmppos 'position des players im dump long dmplen 'länge des dmp-files (anzahl regsitersätze) byte dmppause 'pauseflag byte s1buffer[25] 'registerpuffer sid1 byte s2buffer[25] 'registerpuffer sid2 CON ''------------------------------------------------- ADMINISTRA PUB main | cmd,err 'chip: kommandointerpreter ''funktionsgruppe : chip ''funktion : kommandointerpreter ''eingabe : - ''ausgabe : - init_chip 'bus/vga/keyboard/maus initialisieren repeat cmd := bus_getchar 'kommandocode empfangen err := 0 case cmd 0: !outa[LED_OPEN] 'led blinken ' ---------------------------------------------- SD-FUNKTIONEN 1: sd_mount("M") 'sd-card mounten ' 2: sd_opendir 'direktory ö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 'dateiattribute übergeben 12: sd_volname 'volumelabel abfragen 13: sd_checkmounted 'test ob volume gemounted ist 14: sd_checkopen 'test ob eine datei geö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öschen 20: sd_rename 'verzeichnis oder datei umbenennen 21: sd_chattrib 'attribute ä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öschen 29: sd_dmput 'dir-marker status setzen 30: sd_eof 'eof abfragen ' ---------------------------------------------- CHIP-MANAGMENT 93: mgr_getspec 'spezifikation abfragen 96: mgr_aload 'neuen code booten 97: mgr_getcogs 'freie cogs abfragen 98: mgr_getver 'codeversion abfragen 99: reboot 'neu starten ' ---------------------------------------------- SIDCog: DMP-Player-Funktionen (SIDCog2) 157: sid_mdmpplay 'dmp-file mono auf sid2 abspielen 158: sid_sdmpplay 'dmp-file stereo auf beiden sids abspielen 159: sid_dmpstop 'dmp-player beenden 160: sid_dmppause 'dmp-player pausenmodus 161: sid_dmpstatus 'dmp-player statusabfrage 162: sid_dmppos 'player-position im dumpfile 163: sid_mute 'alle register löschen ' ---------------------------------------------- SIDCog1-Funktionen 164: sid1.setRegister(bus_getchar,bus_getchar) 165: sid1.updateRegisters(sub_getdat(25,@s1buffer)) 166: sid1.setVolume(bus_getchar) 167: sid1.play(bus_getchar,sub_getlong,bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar) 168: sid1.noteOn(bus_getchar, sub_getlong) 169: sid1.noteOff(bus_getchar) 170: sid1.setFreq(bus_getchar,sub_getlong) 171: sid1.setWaveform(bus_getchar,bus_getchar) 172: sid1.setPWM(bus_getchar,sub_getlong) 173: sid1.setADSR(bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar) 174: sid1.setResonance(bus_getchar) 175: sid1.setCutoff(sub_getlong) 176: sid1.setFilterMask(bus_getchar,bus_getchar,bus_getchar) 177: sid1.setFilterType(bus_getchar,bus_getchar,bus_getchar) 178: sid1.enableRingmod(bus_getchar,bus_getchar,bus_getchar) 179: sid1.enableSynchronization(bus_getchar,bus_getchar,bus_getchar) ' ---------------------------------------------- SIDCog2-Funktionen 180: sid2.setRegister(bus_getchar,bus_getchar) 181: sid2.updateRegisters(sub_getdat(25,@s1buffer)) 182: sid2.setVolume(bus_getchar) 183: sid2.play(bus_getchar,sub_getlong,bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar) 184: sid2.noteOn(bus_getchar, sub_getlong) 185: sid2.noteOff(bus_getchar) 186: sid2.setFreq(bus_getchar,sub_getlong) 187: sid2.setWaveform(bus_getchar,bus_getchar) 188: sid2.setPWM(bus_getchar,sub_getlong) 189: sid2.setADSR(bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar) 190: sid2.setResonance(bus_getchar) 191: sid2.setCutoff(sub_getlong) 192: sid2.setFilterMask(bus_getchar,bus_getchar,bus_getchar) 193: sid2.setFilterType(bus_getchar,bus_getchar,bus_getchar) 194: sid2.enableRingmod(bus_getchar,bus_getchar,bus_getchar) 195: sid2.enableSynchronization(bus_getchar,bus_getchar,bus_getchar) ' ---------------------------------------------- Zusatzfunktionen 196: sid_dmpreg 'soundinformationen senden PUB init_chip|i 'chip: initialisierung des administra-chips ''funktionsgruppe : chip ''funktion : - initialisierung des businterface '' - grundzustand definieren (hss aktiv, systemklänge an) ''eingabe : - ''ausgabe : - repeat i from 0 to 7 'evtl. noch laufende cogs stoppen ifnot i == cogid cogstop(i) 'debugverbindung 'debugx.start(9600) ' Start des Debug-Terminals 'businterface initialisieren outa[bus_hs] := 1 'handshake inaktiv ,frida dira := db_in 'datenbus auf eingabe schalten ,frida 'sd-card starten clr_dmarker 'dir-marker löschen sdfat.FATEngine sd_mount("B") 'soundsystem initialisieren sidreg1 := sid1.start(ADM_SOUNDL,0) 'erste sidcog starten, adresse der register speichern waitcnt(cnt+(clkfreq>>8)) ' sidreg2 := sid2.start(ADM_SOUNDR,0) 'zweite sidcog starten 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? PUB clr_dmarker| i 'chip: dmarker-tabelle löschen ''funktionsgruppe : chip ''funktion : dmarker-tabelle löschen ''eingabe : - ''ausgabe : - i := 0 repeat 6 'alle dir-marker löschen dmarker[i++] := TRUE CON ''------------------------------------------------- SIDCog: DMP-Player-Funktionen (SIDCog2) PRI sid_mdmpplay | err 'sid: dmp-datei mono auf sid2 abspielen ''funktionsgruppe : sid ''funktion : dmp-datei mono auf sid2 abspielen ''eingabe : - ''ausgabe : - ''busprotokoll : [157][sub_getstr.fn][put.error] '' : fn - name der dmp-datei '' : error - fehlernummer entspr. list sub_getstr err := \sdfat.openFile(@tbuf, "r") if err == 0 dmppause := 0 dmpcog := cognew(sid_dmpmcog,@dmpstack) + 1 'player-cog starten bus_putchar(err) 'ergebnis der operation senden PRI sid_sdmpplay | err 'sid: dmp-datei stereo auf beiden sid's abspielen sub_getstr err := \sdfat.openFile(@tbuf, "r") if err == 0 dmppause := 0 dmpcog := cognew(sid_dmpscog,@dmpstack) + 1 'player-cog starten bus_putchar(err) 'ergebnis der operation senden PRI sid_dmpstop 'sid: dmp-player stoppen if dmpcog cogstop(dmpcog-1) dmpstatus := 0 PRI sid_dmppause|i 'sid: dmp-player pause case dmppause 0: dmppause := 1 repeat until dmpstatus == 2 sid1.setVolume(0) sid2.setVolume(0) 1: dmppause := 0 PRI sid_dmpstatus 'sid: status des dmp-players abfragen bus_putchar(dmpstatus) PRI sid_dmppos 'sid: position/länge des dmp-players abfragen sub_putlong(dmppos) sub_putlong(dmplen) PRI sid_mute|sidnr,i 'sid: ruhe! repeat i from 0 to 25 sidbuffer[i] := 0 sidnr := bus_getchar case sidnr 1: sid1.updateRegisters(@sidbuffer) 2: sid2.updateRegisters(@sidbuffer) 3: sid1.updateRegisters(@sidbuffer) sid2.updateRegisters(@sidbuffer) PRI sid_dmpmcog | i 'sid: dmpcog - mono, sid2 dmpstatus := 1 'player läuft dmplen := \sdfat.listSize / 25 dmppos := 0 repeat dmplen waitcnt(cnt+(clkfreq/playRate)) 'warten auf den c64-vbl :) \sdfat.readData(@sidbuffer,25) '25 byte in den puffer einlesen ' repeat i from 0 to 24 'da blocktransfer nicht sicher funktioniert ' sidbuffer[i] := sdfat.readCharacter 'füllen wir den puffer "manuell" sid2.updateRegisters(@sidbuffer) 'puffer in die sid-register schreiben dmppos++ if dmppause == 1 dmpstatus := 2 else dmpstatus := 1 repeat while dmppause == 1 'warten solange pause dmpstatus := 0 'player beendet PRI sid_dmpscog | i 'sid: dmpcog - mono, sid2 dmpstatus := 1 'player läuft dmplen := \sdfat.listSize / 25 dmppos := 0 repeat dmplen waitcnt(cnt+(clkfreq/playRate)) 'warten auf den c64-vbl :) \sdfat.readData(@sidbuffer,25) '25 byte in den puffer einlesen ' repeat i from 0 to 24 'da blocktransfer nicht sicher funktioniert ' sidbuffer[i] := sdfat.readCharacter 'füllen wir den puffer "manuell" sid1.updateRegisters(@sidbuffer) 'puffer in die sid-register schreiben sid2.updateRegisters(@sidbuffer) 'puffer in die sid-register schreiben 'eine sidcog etwas verstimmen word[sidreg2+0 ] := (word[sidreg2+0 ]<<16)/trunc(65536.0/detune) word[sidreg2+8 ] := (word[sidreg2+8 ]<<16)/trunc(65536.0/detune) word[sidreg2+16] := (word[sidreg2+16]<<16)/trunc(65536.0/detune) dmppos := dmppos + 1 if dmppause == 1 dmpstatus := 2 else dmpstatus := 1 repeat while dmppause == 1 'warten solange pause dmpstatus := 0 'player beendet PRI sid_dmpreg 'sid: dmpregister senden bus_putchar(byte[@sidbuffer+1]) 'kanal 1 bus_putchar(byte[@sidbuffer+0]) bus_putchar(byte[@sidbuffer+8]) 'kanal 2 bus_putchar(byte[@sidbuffer+7]) bus_putchar(byte[@sidbuffer+15]) 'kanal 3 bus_putchar(byte[@sidbuffer+14]) bus_putchar(byte[@sidbuffer+24]) 'volume CON ''------------------------------------------------- SUBPROTOKOLL-FUNKTIONEN PUB sub_getstr | i,len 'sub: string einlesen ''funktionsgruppe : sub ''funktion : subprotokoll um einen string von regnatix zu empfangen und im '' : textpuffer (tbuf) zu speichern ''eingabe : - ''ausgabe : - ''busprotokoll : [get.len][get.byte(1)]..[get.byte(len)] '' : len - länge des dateinamens repeat i from 0 to 19 'puffer löschen und kopieren tbuf2[i] := tbuf[i] 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_getdat(len,datadr1):datadr2 | i 'sub: daten einlesen ''funktionsgruppe : sub ''funktion : subprotokoll um eine bestimmte anzahl bytes zu empfangen ''eingabe : len - anzahl der bytes '' : datadr1 - adresse des datenspeichers ''ausgabe : datadr2 - adresse des datenspeichers ''busprotokoll : [get.byte(1)]..[get.byte(len)] repeat i from 0 to len - 1 'dateiname einlesen tbuf[datadr1 + i] := bus_getchar datadr2 := datadr1 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-FUNKTIONEN 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") 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 getcogs: cogs |i,c,cog[8] 'cmgr: abfragen wie viele cogs in benutzung sind 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 PUB mgr_getver 'cmgr: abfrage der version ''funktionsgruppe : cmgr ''funktion : abfrage der version und spezifikation des chips ''eingabe : - ''ausgabe : cogs - anzahl der cogs ''busprotokoll : [098][sub_putlong.ver] '' : ver - version '' +---------- '' | +------- system '' | | +---- version (änderungen) '' | | | +- subversion (hinzufü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ähig '' | |||||||+- dateisystem ''spezifikation : %00000000_00000000_00000000_01001111 sub_putlong(CHIP_SPEC) CON ''------------------------------------------------- SD-LAUFWERKS-FUNKTIONEN PUB sd_mount(mode) | err 'sdcard: sd-card mounten frida ''funktionsgruppe : sdcard ''funktion : eingelegtes volume mounten ''eingabe : - ''ausgabe : - ''busprotokoll : [001][put.error] '' : error - fehlernummer entspr. list ifnot sdfat.checkPartitionMounted 'frida err := \sdfat.mountPartition(0,0) 'karte mounten 'bus_putchar(err) 'fehlerstatus senden if mode == "M" 'frida bus_putchar(err) 'fehlerstatus senden ifnot err dmarker[RMARKER] := sdfat.getDirCluster 'root-marker setzen err := \sdfat.changeDirectory(string("system")) ifnot err dmarker[SMARKER] := sdfat.getDirCluster 'system-marker setzen sdfat.setDirCluster(dmarker[RMARKER]) 'root-marker wieder aktivieren else 'frida bus_putchar(0) 'frida PUB sd_opendir | err 'sdcard: verzeichnis öffnen ''funktionsgruppe : sdcard ''funktion : verzeichnis öffnen ''eingabe : - ''ausgabe : - ''busprotokoll : [002] err := \sdfat.listReset PUB sd_nextfile | strpt 'sdcard: nächsten eintrag aus verzeichnis holen ''funktionsgruppe : sdcard ''funktion : nächsten eintrag aus verzeichnis holen ''eingabe : - ''ausgabe : - ''busprotokoll : [003][put.status=0] '' : [003][put.status=1][sub_putstr.fn] '' : status - 1 = gültiger eintrag '' : 0 = es folgt kein eintrag mehr '' : fn - verzeichniseintrag string strpt := \sdfat.listName 'nächsten eintrag holen if strpt 'status senden bus_putchar(1) 'kein eintrag mehr sub_putstr(strpt) else bus_putchar(0) 'gültiger eintrag folgt PUB sd_open | err,modus '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) bus_putchar(err) 'ergebnis der operation senden outa[LED_OPEN] := 1 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 bus_putchar(err) 'ergebnis der operation senden outa[LED_OPEN] := 0 PUB sd_getc | n 'sdcard: zeichen aus datei lesen ''funktionsgruppe : sdcard ''funktion : zeichen aus datei lesen ''eingabe : - ''ausgabe : - ''busprotokoll : [006][put.char] '' : char - gelesenes zeichen n := \sdfat.readCharacter bus_putchar(n) PUB sd_putc 'sdcard: zeichen in datei schreiben ''funktionsgruppe : sdcard ''funktion : zeichen in datei schreiben ''eingabe : - ''ausgabe : - ''busprotokoll : [007][get.char] '' : char - zu schreibendes zeichen \sdfat.writeCharacter(bus_getchar) PRI sd_eof 'sdcard: eof abfragen ''funktionsgruppe : sdcard ''funktion : eof abfragen ''eingabe : - ''ausgabe : - ''busprotokoll : [030][put.eof] '' : eof - eof-flag bus_putchar(sdfat.getEOF) PUB sd_getblk 'sdcard: block aus datei lesen ''funktionsgruppe : sdcard ''funktion : block aus datei lesen ''eingabe : - ''ausgabe : - ''busprotokoll : [008][sub_getlong.count][put.char(1)]..[put.char(count)] '' : count - anzahl der zu lesenden zeichen '' : char - gelesenes zeichen repeat sub_getlong bus_putchar(\sdfat.readCharacter) PUB sd_putblk 'sdcard: block in datei schreiben ''funktionsgruppe : sdcard ''funktion : block in datei schreiben ''eingabe : - ''ausgabe : - ''busprotokoll : [009][sub_getlong.count][put.char(1)]..[put.char(count)] '' : count - anzahl der zu schreibenden zeichen '' : char - zu schreibende zeichen repeat sub_getlong \sdfat.writeCharacter(bus_getchar) PUB sd_seek | wert 'sdcard: zeiger in datei positionieren ''funktionsgruppe : sdcard ''funktion : zeiger in datei positionieren ''eingabe : - ''ausgabe : - ''busprotokoll : [010][sub_getlong.pos] '' : pos - neue zeichenposition in der datei wert := sub_getlong \sdfat.setCharacterPosition(wert) PUB sd_fattrib | anr,wert 'sdcard: dateiattribute übergeben ''funktionsgruppe : sdcard ''funktion : dateiattribute abfragen ''eingabe : - ''ausgabe : - ''busprotokoll : [011][get.anr][sub_putlong.wert] '' : anr - 0 = Dateigröß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 = Änderungsdatum - Tag '' : 11 = Änderungsdatum - Monat '' : 12 = Änderungsdatum - Jahr '' : 13 = Änderungsdatum - Sekunden '' : 14 = Änderungsdatum - Minuten '' : 15 = Ä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 überragen ''eingabe : - ''ausgabe : - ''busprotokoll : [012][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 : [013][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 : [014][put.flag] '' : flag - 0 = not open, 1 open bus_putchar(\sdfat.checkFileOpen) PUB sd_checkused 'sdcard: anzahl der benutzten sektoren senden ''funktionsgruppe : sdcard ''funktion : anzahl der benutzten sektoren senden ''eingabe : - ''ausgabe : - ''busprotokoll : [015][sub_putlong.used] '' : used - anzahl der benutzten sektoren sub_putlong(\sdfat.checkUsedSectorCount("F")) PUB sd_checkfree 'sdcard: anzahl der freien sektoren senden ''funktionsgruppe : sdcard ''funktion : anzahl der freien sektoren senden ''eingabe : - ''ausgabe : - ''busprotokoll : [016][sub_putlong.free] '' : free - anzahl der freien sektoren sub_putlong(\sdfat.checkFreeSectorCount("F")) PUB sd_newfile | err 'sdcard: eine neue datei erzeugen ''funktionsgruppe : sdcard ''funktion : eine neue datei erzeugen ''eingabe : - ''ausgabe : - ''busprotokoll : [017][sub_getstr.fn][put.error] '' : fn - name der datei '' : error - fehlernummer entspr. liste sub_getstr err := \sdfat.newFile(@tbuf) 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) bus_putchar(err) 'ergebnis der operation senden PUB sd_del | err 'sdcard: eine datei oder ein verzeichnis löschen ''funktionsgruppe : sdcard ''funktion : eine datei oder ein verzeichnis lö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) bus_putchar(err) 'ergebnis der operation senden PUB sd_rename | err 'sdcard: datei oder verzeichnis umbenennen ''funktionsgruppe : sdcard ''funktion : datei oder verzeichnis umbenennen ''eingabe : - ''ausgabe : - ''busprotokoll : [020][sub_getstr.fn1][sub_getstr.fn2][put.error] '' : fn1 - alter name '' : fn2 - neuer name '' : error - fehlernummer entspr. liste sub_getstr 'fn1 sub_getstr 'fn2 err := \sdfat.renameEntry(@tbuf2,@tbuf) bus_putchar(err) 'ergebnis der operation senden PUB sd_chattrib | err 'sdcard: attribute ändern ''funktionsgruppe : sdcard ''funktion : attribute einer datei oder eines verzeichnisses ä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) 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) 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) bus_putchar(err) 'ergebnis der operation senden PUB sd_unmount | err 'sdcard: medium abmelden ''funktionsgruppe : sdcard ''funktion : medium abmelden ''eingabe : - ''ausgabe : - ''busprotokoll : [024][put.error] '' : error - fehlernummer entspr. list err := \sdfat.unmountPartition bus_putchar(err) 'ergebnis der operation senden ifnot err clr_dmarker PUB sd_dmact|markernr 'sdcard: einen dir-marker aktivieren ''funktionsgruppe : sdcard ''funktion : ein ausgewä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ä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ä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]) PRI sd_dmput|markernr 'sdcard: einen dir-marker übertragen ''funktionsgruppe : sdcard ''funktion : den status eines ausgewählter dir-marker übertragen ''eingabe : - ''ausgabe : - ''busprotokoll : [029][get.dmarker][sub_getlong.dmstatus] '' : dmarker - dir-marker '' : dmstatus - status des markers markernr := bus_getchar dmarker[markernr] := sub_getlong PUB sd_dmclr|markernr 'sdcard: einen dir-marker löschen ''funktionsgruppe : sdcard ''funktion : ein ausgewählter dir-marker löschen ''eingabe : - ''ausgabe : - ''busprotokoll : [028][get.dmarker] '' : dmarker - dir-marker markernr := bus_getchar dmarker[markernr] := TRUE DAT 'dummyroutine für getcogs org ' ' Entry: dummy-assemblercode fuer cogtest ' entry jmp entry 'just loops {{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 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. │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ }}