HiveOS Phase 1 - *.binary laden
Verfasst: Mo 17. Aug 2009, 11:36
Zunächst: Ich verwende immer noch das OS von Drohne235. Regime soll, in Phase 1, *.binary Dateien Laden und Ausführen können. Hierfür habe ich die Datei "regime.spin" entsprechend angepasst. Die Dateien werden aber weder gefunden, noch geladen. Ich denke, das hier das 8:3 Dateiformat eine Rolle spielt. Dennoch hier mal mein Quelltext. Vieleicht hat jemand ja eine Idee, wie man das umsetzen kann.
Source:
Sinn und zweck der Anpassung: Man soll eigene Programme laden können, ohne auf die Dateiendung achten zu müssen bzw. die Dateiendung auf *.bin ändern zu müssen.
Source:
Code: Alles auswählen
{{ ---------------------------------------------------------------------------------------------------------
Hive-Computer-Projekt
Name : Regime
Chip : Regnatix-Code (Kommandointerpreter)
Version : 0.1
Dateien : regime.spin
Beschreibung : "Regime" ist ein einfacher Kommandozeileninterpreter.
Eigenschaften :
Logbuch :
13.03.2009 - parameterübergabe für externe kommandos implementiert
- korrektes screeninit nach bload
19.11.2008 - erste version aus dem ispin-projekt extrahiert
- ios als object extrahiert
21.11.2008 - dir um parameter b und m erweitert
- externe kommandos werden jetzt gestartet
20.01.2009 - bootmechanismus für bellatrix implementiert
Kommandoliste:
--------------------------------------------------------------------------------------------------------- }}
OBJ
num: "numbers"
ios: "ios"
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
OS_TIBLEN = 64 'größe des inputbuffers
ERAM = 1024 * 512 * 2 'größe eram
HRAM = 1024 * 32 'größe hram
RMON_ZEILEN = 16 'speichermonitor - angezeigte zeilen
RMON_BYTES = 8 'speichermonitor - zeichen pro byte
VAR
'systemvariablen
byte tib[OS_TIBLEN] 'tastatur-input-buffer
byte cmdstr[OS_TIBLEN] 'kommandostring für interpreter
byte parastr[OS_TIBLEN] 'parameterstring für interpreter
byte tibpos 'aktuelle position im tib
PUB main | flag
flag := ios.start 'ios initialisieren
'ios.startram 'init für ram-upload
if flag == 0 'kaltstart?
ios.bload(@gdriver) 'bellatrix mit grafiktreiber initialisieren
ios.screeninit(@system1,1) 'systemmeldung
ios.print(@prog) 'programmversion
ios.ram_write(1,ios#SIFLAG)
if 0 == ios.ram_read(ios#SIFLAG) 'screen neu initialisieren?
ios.screeninit(@system1,1) 'systemmeldung
ios.ram_write(1,ios#SIFLAG)
ios.printnl
ios.print(@prompt1)
repeat
os_cmdinput 'kommandoeingabe
os_cmdint 'kommandozeileninterpreter
PUB os_cmdinput | charc 'eingaberoutine für eine kommandozeile
{{os_cmdinput - eingaberoutine für eine kommandozeile
tib - eingabepuffer
tibpos - index im tib}}
ios.print(@prompt2)
tibpos := 0 'tibposition auf anfang setzen
repeat
if ios.keystat > 0 'taste gedrückt?
charc := ios.key 'tastencode holen
if (tibpos + 1) < OS_TIBLEN 'tastaturpuffer voll?
case charc
ios#CHAR_BS: 'backspace
if tibpos > 0
tibpos--
tib[tibpos] := $0 'letztes zeichen im puffer löschen
ios.printctrl(ios#CHAR_TER_BS) 'steuerzeichen an terminal senden
other: ios.bus_putchar2(charc) 'sonstige zeichen
if (charc <> ios#CHAR_NL) & (charc <> ios#CHAR_BS) 'ausser sonderzeichen alles in tib
if (tibpos + 1) < OS_TIBLEN 'tastaturpuffer voll?
tib[tibpos++] := charc
tib[tibpos] := $0
until charc == $0D 'schleife bis RETURN
tibpos := 0
charc := 0
PUB os_nextpara: stradr | i,adr 'liest nächstes parameterfeld aus tib
{{os_nextpara - liest nächstes parameterfeld aus tib und übergibt einen stringzeiger auf einen 0-term-string
stradr: adresse eines string (0-term) mit dem parameter oder 0 (kein parameter)
tibpos: systemvariable wird auf neue position hinter parameter gesetzt}}
i := 0
adr := 0
if tib[tibpos] <> 0
repeat until tib[tibpos] > ios#CHAR_SPACE 'führende leerzeichen ausbenden
tibpos++
repeat
parastr[i] := tib[tibpos]
tibpos++
i++
until (tib[tibpos] == ios#CHAR_SPACE) or (tib[tibpos] == 0) 'wiederholen bis leerzeichen oder stringende
parastr[i] := 0
adr := @parastr
result := adr
PUB os_nextpos: pos 'setzt zeiger auf nächste position
if tib[tibpos] <> 0
repeat until tib[tibpos] > ios#CHAR_SPACE 'führende leerzeichen ausbenden
tibpos++
result := tibpos
PUB os_cmdint | i 'kommandointerpretere
{{os_cmdint - kommandointerpreter, zeichenkette ab tibpos wird als kommando interpretiert
tibpos - wird auf position hinter kommando neu gesetzt}}
repeat 'kommandostring kopieren
cmdstr[tibpos] := tib[tibpos]
tibpos++
until (tib[tibpos] == ios#CHAR_SPACE) or (tib[tibpos] == 0) 'wiederholen bis leerzeichen oder stringende
cmdstr[tibpos] := 0
os_cmdexec(@cmdstr) 'interpreter aufrufen
tibpos := 0 'tastaturpuffer zurücksetzen
tib[0] := 0
PUB os_cmdexec(stradr) 'kommando im übergebenen string wird als kommando interpretiert
{{os_smdexec - das kommando im übergebenen string wird als kommando interpretiert
stradr: adresse einer stringvariable die ein kommando enthält}}
if strcomp(stradr,@cmd1) 'help
ios.print(@help1)
elseif strcomp(stradr,@cmd2) 'mount - sd-card mounten
ios.sdmount
elseif strcomp(stradr,@cmd3) 'dir - verzeichnis anzeigen
sddir
elseif strcomp(stradr,@cmd4) 'type - textdatei auf bildschirm ausgeben
sdtype
elseif strcomp(stradr,@cmd5) 'load -
load
elseif strcomp(stradr,@cmd6) 'cls -
ios.printcls
elseif strcomp(stradr,@cmd7) 'bload - treiber --> bellatrix
load_bel
elseif strcomp(stradr,@cmd8) 'del
sddel
elseif testbin(stradr) 'test auf externes kommando
ios.paraset(@tib + os_nextpos) 'parameterstring kopieren
ios.ldbin(stradr)
elseif testbin2(stradr) 'test auf externes kommando
ios.paraset(@tib + os_nextpos) 'parameterstring kopieren
ios.ldbin(stradr) 'anwendung starten
elseifnot FALSE 'kommando nicht gefunden
ios.print(@err1)
ios.print(stradr)
ios.printnl
ios.print(@prompt1)
PUB sddel | stradr,status 'datei auf sdcard löschen
{{sddel - datei auf sdcard löschen}}
stradr := os_nextpara 'dateinamen von komandozeile holen
status := ios.sdopen("r",stradr) 'test ob datei vorhanden
ios.sdclose
if status == 0 'datei ist vorhanden
ios.print(@msg2) 'datei löschen?
if ios.keywait <> "j"
ios.print(string("nein"))
ios.printnl
return
else
ios.print(string("ja"))
ios.printnl
ios.sdopen("d",stradr) 'datei löschen
ios.sdclose
else
ios.print(@msg1) 'datei nicht gefunden
ios.printnl
PUB load_bel | stradr,status 'treiber für bellatrix laden
{{bload - treiber für bellatrix laden}}
stradr := os_nextpara
status := ios.sdopen("r",stradr)
if status == 0
ios.breset 'bellatrix neu starten
waitcnt(cnt + 200_000_000) 'warte bis bel fertig ist
ios.bload(stradr) 'treiberupload
waitcnt(cnt + 200_000_000) 'warte bis bel fertig ist
ios.screeninit(@system1,1) 'systemmeldung
ios.print(@prog) 'programmversion
else
ios.print(@err1)
ios.print(stradr)
ios.printnl
PUB testbin(stradr): flag | status,i,len 'testet ob das kommando als bin-datei vorliegt
{{testbin(stradr): flag - testet ob das kommando als bin-datei vorliegt
- string bei stradr wird um .bin erweitert
- flag = TRUE - kommando gefunden}}
flag := FALSE
len := strsize(stradr)
repeat i from 0 to 3 '.bin anhängen
byte[stradr][len + i] := byte[@ext1][i]
byte[stradr][len + i] := 0
status := ios.sdopen("r",stradr) 'datei vorhanden?
if 0 == status
flag := TRUE
ios.sdclose
{{
== Änderungen von "BordKönig ==
Funktionen:
Überprüft, ob Komando XYZ evtl. als *.binary vorliegt
}}
PUB testbin2(stradr): flag | status,i,len 'testet ob das kommando als binary-datei vorliegt
{{testbin(stradr): flag - testet ob das kommando als bin-datei vorliegt
- string bei stradr wird um .bin erweitert
- flag = TRUE - kommando gefunden}}
flag := FALSE
len := strsize(stradr)
repeat i from 0 to 6 '.binary anhängen
byte[stradr][len + i] := byte[@ext2][i]
byte[stradr][len + i] := 0
status := ios.sdopen("r",stradr) 'datei vorhanden?
if 0 == status
flag := TRUE
ios.sdclose
PUB load | len,i,stradr1,stradr2 'startet bin-datei über loader
{{ldbin - startet bin-datei über loader}}
ios.paraset(@tib + os_nextpos) 'parameterstring kopieren
ios.ldbin(os_nextpara)
PUB sdtype | stradr,status,char,n,k 'textdatei ausgeben
{{sdtype <name> - textdatei ausgeben}}
stradr := os_nextpara 'dateinamen von kommandozeile holen
status := ios.sdopen("r",stradr) 'datei öffnen
if status > 0
ios.print(string("Status : "))
ios.printdec(status)
ios.printnl
n := 1
if status == 0
repeat 'text ausgeben
char := ios.sdgetc
if char <> $FF
ios.printchar(char)
if char == ios#CHAR_NL 'zeilenzahl zählen und stop
if ++n == 20
n := 1
k := ios.keywait 'q bricht ab
if k == "q"
char := $FF
until char == $FF
status := ios.sdclose 'datei schließen
if status > 0
ios.print(string("Status : "))
ios.printdec(status)
ios.printnl
PUB sddir | stradr,n,wflag,c,i,bflag,len,mflag,lflag 'verzeichnis anzeigen
{{sddir - anzeige verzeichnis}}
stradr := os_nextpara
wflag := 0
bflag := 0
lflag := 0
if stradr <> 0
len := strsize(stradr)
repeat i from 0 to len - 1
if byte[stradr][i] == "w" 'mehrspaltig
wflag := 1
if byte[stradr][i] == "b" 'nur bin-dateien
bflag := 1
if byte[stradr][i] == "m" 'more
mflag := 1
if byte[stradr][i] == "l" 'long
lflag := 1
'ios.sdmount 'medium mounten
ios.sddir 'kommando: verzeichnis öffnen
n := 1
c := 0
i := 0
repeat 'wiederhole bis verzeichnisende
stradr := ios.sdnext 'einen eintrag holen
if stradr <> 0 'ist eintrag gültig?
i++
len := strsize(stradr)
if bflag == 1 'nur bin-dateien
if strcomp(@ext1,(stradr+len-4))
n++
ios.print(stradr)
if wflag == 1
c++
ios.printtab
if wflag == 0 OR c == 3
ios.printnl
c := 0
else 'alle dateien
n++
ios.print(stradr)
if wflag == 1
c++
ios.printtab
if (wflag == 0 OR c == 3) AND bflag == 0
if lflag == 1 'long-ausgabe
ios.printtab
ios.printhex(ios.sdfattrib,2) 'attribute
ios.printchar(":")
'ios.printhex(ios.sdftime,8) 'zeitstempel
printftime(ios.sdftime)
ios.printtab
ios.printdec(ios.sdfsize) 'dateigröße
ios.printnl
c := 0
if mflag == 1 AND i == 10
ios.printnl
ios.print(@wait1)
if ios.keywait == "q"
return
ios.printnl
i := 0
while stradr <> 0 'wiederholen solange stradr <> 0
if wflag == 1
ios.printnl
ios.printdec(--n)
ios.print(string(" Datei(en)"))
ios.printnl
PUB printftime(wert) | n 'zeitstempel ausgeben
n := (wert >> 26 & %1111111) + 1980
ios.printdec(n)
ios.printchar("-")
n := (wert >> 22 & %1111)
ios.printdec(n)
ios.printchar("-")
n := (wert >> 17 & %1111)
ios.printdec(n)
ios.printchar(" ")
n := (wert >> 12 & %1111)
ios.printdec(n)
ios.printchar(":")
n := (wert >> 6 & %111111)
ios.printdec(n)
ios.printchar(" ")
DAT
system1 byte "▶Hive", 0
prog byte "Regime - 19-03-2009-kr",0
prompt1 byte "ok ", $0d, 0
prompt2 byte "~ ", 0
prompt3 byte "∞ ", 0
msg1 byte "Datei nicht gefunden!",0
msg2 byte "Datei löschen? <j/n> : ",0
err1 byte "? ",0
ext1 byte ".BIN",0
ext2 byte ".BINARY",0
wait1 byte "<WEITER? */q:>",0
cmd1 byte "help",0
cmd2 byte "mount",0
cmd3 byte "dir",0
cmd4 byte "type",0
cmd5 byte "load",0
cmd6 byte "cls",0
cmd7 byte "bload",0
cmd8 byte "del",0
gdriver byte "vid.bin", 0 'name des grafiktreibers
help1 file "help.txt"
byte $0d,0