1055 lines
50 KiB
Plaintext
1055 lines
50 KiB
Plaintext
|
{{
|
||
|
┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||
|
│ 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
|
||
|
|
||
|
|
||
|
' +----------
|
||
|
' | +------- system
|
||
|
' | | +---- version (änderungen)
|
||
|
' | | | +- subversion (hinzufügungen)
|
||
|
CHIP_VER = $00_01_01_01
|
||
|
|
||
|
CHIP_SPEC = gc#A_FAT|gc#A_LDR|gc#A_SID
|
||
|
|
||
|
'
|
||
|
' 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 = gc#HBEAT 'led-pin für anzeige "dateioperation"
|
||
|
SD_BASE = gc#A_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
|
||
|
gc : "glob-con" 'globale konstanten
|
||
|
|
||
|
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
|
||
|
gc#a_sdMount: sd_mount("M") 'sd-card mounten '
|
||
|
gc#a_sdOpenDir: sd_opendir 'direktory öffnen
|
||
|
gc#a_sdNextFile: sd_nextfile 'verzeichniseintrag lesen
|
||
|
gc#a_sdOpen: sd_open 'datei öffnen
|
||
|
gc#a_sdClose: sd_close 'datei schließen
|
||
|
gc#a_sdGetC: sd_getc 'zeichen lesen
|
||
|
gc#a_sdPutC: sd_putc 'zeichen schreiben
|
||
|
gc#a_sdGetBlk: sd_getblk 'block lesen
|
||
|
gc#a_sdPutBlk: sd_putblk 'block schreiben
|
||
|
gc#a_sdSeek: sd_seek 'zeiger in datei positionieren
|
||
|
gc#a_sdFAttrib: sd_fattrib 'dateiattribute übergeben
|
||
|
gc#a_sdVolname: sd_volname 'volumelabel abfragen
|
||
|
gc#a_sdCheckMounted: sd_checkmounted 'test ob volume gemounted ist
|
||
|
gc#a_sdCheckOpen: sd_checkopen 'test ob eine datei geöffnet ist
|
||
|
gc#a_sdCheckUsed: sd_checkused 'test wie viele sektoren benutzt sind
|
||
|
gc#a_sdCheckFree: sd_checkfree 'test wie viele sektoren frei sind
|
||
|
gc#a_sdNewFile: sd_newfile 'neue datei erzeugen
|
||
|
gc#a_sdNewDir: sd_newdir 'neues verzeichnis wird erzeugt
|
||
|
gc#a_sdDel: sd_del 'verzeichnis oder datei löschen
|
||
|
gc#a_sdRename: sd_rename 'verzeichnis oder datei umbenennen
|
||
|
gc#a_sdChAttrib: sd_chattrib 'attribute ändern
|
||
|
gc#a_sdChDir: sd_chdir 'verzeichnis wechseln
|
||
|
gc#a_sdFormat: sd_format 'medium formatieren
|
||
|
gc#a_sdUnmount: sd_unmount 'medium abmelden
|
||
|
gc#a_sdDmAct: sd_dmact 'dir-marker aktivieren
|
||
|
gc#a_sdDmSet: sd_dmset 'dir-marker setzen
|
||
|
gc#a_sdDmGet: sd_dmget 'dir-marker status abfragen
|
||
|
gc#a_sdDmClr: sd_dmclr 'dir-marker löschen
|
||
|
gc#a_sdDmPut: sd_dmput 'dir-marker status setzen
|
||
|
gc#a_sdEOF: sd_eof 'eof abfragen
|
||
|
|
||
|
' ---------------------------------------------- CHIP-MANAGMENT
|
||
|
gc#a_mgrGetSpec: mgr_getspec 'spezifikation abfragen
|
||
|
gc#a_mgrALoad: mgr_aload 'neuen code booten
|
||
|
gc#a_mgrGetCogs: mgr_getcogs 'freie cogs abfragen
|
||
|
gc#a_mgrGetVer: mgr_getver 'codeversion abfragen
|
||
|
gc#a_mgrReboot: reboot 'neu starten
|
||
|
|
||
|
' ---------------------------------------------- SIDCog: DMP-Player-Funktionen (SIDCog2)
|
||
|
gc#a_s_mdmpplay: sid_mdmpplay 'dmp-file mono auf sid2 abspielen
|
||
|
gc#a_s_sdmpplay: sid_sdmpplay 'dmp-file stereo auf beiden sids abspielen
|
||
|
gc#a_s_dmpstop: sid_dmpstop 'dmp-player beenden
|
||
|
gc#a_s_dmppause: sid_dmppause 'dmp-player pausenmodus
|
||
|
gc#a_s_dmpstatus: sid_dmpstatus 'dmp-player statusabfrage
|
||
|
gc#a_s_dmppos: sid_dmppos 'player-position im dumpfile
|
||
|
gc#a_s_mute: sid_mute 'alle register löschen
|
||
|
|
||
|
' ---------------------------------------------- SIDCog1-Funktionen
|
||
|
gc#a_s1_setRegister: sid1.setRegister(bus_getchar,bus_getchar)
|
||
|
gc#a_s1_updateRegisters: sid1.updateRegisters(sub_getdat(25,@s1buffer))
|
||
|
gc#a_s1_setVolume: sid1.setVolume(bus_getchar)
|
||
|
gc#a_s1_play: sid1.play(bus_getchar,sub_getlong,bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s1_noteOn: sid1.noteOn(bus_getchar, sub_getlong)
|
||
|
gc#a_s1_noteOff: sid1.noteOff(bus_getchar)
|
||
|
gc#a_s1_setFreq: sid1.setFreq(bus_getchar,sub_getlong)
|
||
|
gc#a_s1_setWaveform: sid1.setWaveform(bus_getchar,bus_getchar)
|
||
|
gc#a_s1_setPWM: sid1.setPWM(bus_getchar,sub_getlong)
|
||
|
gc#a_s1_setADSR: sid1.setADSR(bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s1_setResonance: sid1.setResonance(bus_getchar)
|
||
|
gc#a_s1_setCutoff: sid1.setCutoff(sub_getlong)
|
||
|
gc#a_s1_setFilterMask: sid1.setFilterMask(bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s1_setFilterType: sid1.setFilterType(bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s1_enableRingmod: sid1.enableRingmod(bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s1_enableSynchronization: sid1.enableSynchronization(bus_getchar,bus_getchar,bus_getchar)
|
||
|
|
||
|
' ---------------------------------------------- SIDCog2-Funktionen
|
||
|
gc#a_s2_setRegister: sid2.setRegister(bus_getchar,bus_getchar)
|
||
|
gc#a_s2_updateRegisters: sid2.updateRegisters(sub_getdat(25,@s1buffer))
|
||
|
gc#a_s2_setVolume: sid2.setVolume(bus_getchar)
|
||
|
gc#a_s2_play: sid2.play(bus_getchar,sub_getlong,bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s2_noteOn: sid2.noteOn(bus_getchar, sub_getlong)
|
||
|
gc#a_s2_noteOff: sid2.noteOff(bus_getchar)
|
||
|
gc#a_s2_setFreq: sid2.setFreq(bus_getchar,sub_getlong)
|
||
|
gc#a_s2_setWaveform: sid2.setWaveform(bus_getchar,bus_getchar)
|
||
|
gc#a_s2_setPWM: sid2.setPWM(bus_getchar,sub_getlong)
|
||
|
gc#a_s2_setADSR: sid2.setADSR(bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s2_setResonance: sid2.setResonance(bus_getchar)
|
||
|
gc#a_s2_setCutoff: sid2.setCutoff(sub_getlong)
|
||
|
gc#a_s2_setFilterMask: sid2.setFilterMask(bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s2_setFilterType: sid2.setFilterType(bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s2_enableRingmod: sid2.enableRingmod(bus_getchar,bus_getchar,bus_getchar)
|
||
|
gc#a_s2_enableSynchronization: sid2.enableSynchronization(bus_getchar,bus_getchar,bus_getchar)
|
||
|
|
||
|
' ---------------------------------------------- Zusatzfunktionen
|
||
|
gc#a_s_dmpreg: 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[gc#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(gc#A_SOUNDL,0) 'erste sidcog starten, adresse der register speichern
|
||
|
waitcnt(cnt+(clkfreq>>8)) '
|
||
|
sidreg2 := sid2.start(gc#A_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[gc#bus_hs] := 0 'daten gültig
|
||
|
waitpeq(M3,M4,0) 'busclk=0?
|
||
|
outa[gc#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[gc#bus_hs] := 0 'daten quittieren
|
||
|
outa[gc#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. │
|
||
|
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||
|
}}
|
||
|
|