{{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 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 : eram-tool Chip : Regnatix Typ : Programm Version : Subversion : Logbuch : Kommandoliste: Notizen: }} 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 token1[OS_TIBLEN] 'parameterstring 1 für interpreter byte token2[OS_TIBLEN] 'parameterstring 2 für interpreter byte tibpos 'aktuelle position im tib long ppos 'puffer für adresse long pcnt 'puffer für zeilenzahl PUB main | wflag ios.start 'ios initialisieren ' ios.startram ios.printnl repeat os_cmdinput 'kommandoeingabe os_cmdint 'kommandozeileninterpreter PUB os_cmdinput | charc 'sys: stringeingabe eine zeile ''funktionsgruppe : sys ''funktion : stringeingabe eine zeile ''eingabe : - ''ausgabe : - ''variablen : tib - eingabepuffer zur string '' : tibpos - aktuelle position im tib ios.print(@prompt2) tibpos := 0 'tibposition auf anfang setzen repeat until (charc := ios.keywait) == $0D 'tasten einlesen bis return if (tibpos + 1) < OS_TIBLEN 'zeile noch nicht zu lang? case charc ios#CHAR_BS: 'backspace if tibpos > 0 'noch nicht anfang der zeile erreeicht? tib[tibpos--] := 0 'ein zeichen aus puffer entfernen ios.printctrl(ios#CHAR_TER_BS) 'steuerzeichen an terminal senden other: 'zeicheneingabe tib[tibpos++] := charc 'zeichen speichern ios.printchar(charc) 'zeichen ausgeben ios.printnl tib[tibpos] := 0 'string abschließen tibpos := charc := 0 'werte rücksetzen PUB os_nxtoken1: stradr 'sys: token 1 von tib einlesen ''funktionsgruppe : sys ''funktion : nächsten token im eingabestring suchen und stringzeiger übergeben ''eingabe : - ''ausgabe : stradr - adresse auf einen string mit dem gefundenen token ''variablen : tib - eingabepuffer zur string '' : tibpos - aktuelle position im tib '' : token - tokenstring stradr := os_tokenize(@token1) PUB os_nxtoken2: stradr 'sys: token 2 von tib einlesen ''funktionsgruppe : sys ''funktion : nächsten token im eingabestring suchen und stringzeiger übergeben ''eingabe : - ''ausgabe : stradr - adresse auf einen string mit dem gefundenen token ''variablen : tib - eingabepuffer zur string '' : tibpos - aktuelle position im tib '' : token - tokenstring stradr := os_tokenize(@token2) PUB os_tokenize(token):stradr | i 'sys: liest nächsten token aus tib i := 0 if tib[tibpos] <> 0 'abbruch bei leerem string repeat until tib[tibpos] > ios#CHAR_SPACE 'führende leerzeichen ausbenden tibpos++ repeat until (tib[tibpos] == ios#CHAR_SPACE) or (tib[tibpos] == 0) 'wiederholen bis leerzeichen oder stringende byte[token][i] := tib[tibpos] tibpos++ i++ else token := 0 byte[token][i] := 0 stradr := token PUB os_nextpos: tibpos2 'sys: setzt zeiger auf nächste position ''funktionsgruppe : sys ''funktion : tibpos auf nächstes token setzen ''eingabe : - ''ausgabe : tibpos2 - position des nächsten tokens in tib ''variablen : tib - eingabepuffer zur string '' : tibpos - aktuelle position im tib if tib[tibpos] <> 0 repeat until tib[tibpos] > ios#CHAR_SPACE 'führende leerzeichen ausbenden tibpos++ return tibpos PUB os_cmdint 'sys: kommandointerpreter ''funktionsgruppe : sys ''funktion : kommandointerpreter; zeichenkette ab tibpos wird als kommando interpretiert '' : tibpos wird auf position hinter token gesetzt ''eingabe : - ''ausgabe : - ''variablen : tib - eingabepuffer zur string '' : tibpos - aktuelle position im tib 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 'kommandostring abschließen os_cmdexec(@cmdstr) 'interpreter aufrufen tibpos := 0 'tastaturpuffer zurücksetzen tib[0] := 0 PUB os_cmdexec(stradr) 'sys: 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,string("help")) 'help ios.print(@help1) elseif strcomp(stradr,string("d")) 'd display - speicheranzeige ram_disp elseif strcomp(stradr,string("dl")) 'd display long - speicheranzeige ram_displong elseif strcomp(stradr,string("n")) 'n next - anzeige fortsetzen ram_next elseif strcomp(stradr,string("m")) 'm modify - speicher modifizieren ram_mod elseif strcomp(stradr,string("l")) 'l modify - long ram_lmod elseif strcomp(stradr,string("info")) ram_info elseif strcomp(stradr,string("f")) ram_fill elseif strcomp(stradr,string("fu")) 'fill im userbereich ram_fillusr elseif strcomp(stradr,string("rbas")) ram_setrbas elseif strcomp(stradr,string("sysvar")) ram_sysvar elseif strcomp(stradr,string("load")) 'load - ram_load elseif strcomp(stradr,string("cls")) 'cls - ios.printcls elseif strcomp(stradr,string("bye")) 'bye ios.stop elseif strcomp(stradr,string("xinit")) 'rdisk initialisieren rd_init elseif strcomp(stradr,string("xnew")) 'neue ram-datei erstellen rd_new elseif strcomp(stradr,string("xhead")) 'header der dateien anzeigen rd_header elseif strcomp(stradr,string("xdel")) 'ram-datei löschen rd_del elseif strcomp(stradr,string("xren")) 'ram- datei umbenennen rd_rename elseif strcomp(stradr,string("xdir")) 'ram-dateien liste anzeigen rd_dir elseif strcomp(stradr,string("xftab")) 'tabelle geöffnete dateien anzeigen rd_ftab elseif strcomp(stradr,string("xopen")) 'ram-datei öffnen rd_open elseif strcomp(stradr,string("xsave")) 'ram-datei auf sd speichern rd_save elseif strcomp(stradr,string("xclose")) 'ram-datei schliessen rd_close elseif strcomp(stradr,string("xseek")) 'dateizeiger setzen rd_seek elseif strcomp(stradr,string("xput")) 'wert in geöffnete datei schreiben rd_put elseif strcomp(stradr,string("xget")) 'wert aus geöffneter datei lesen rd_get elseif strcomp(stradr,string("xwrite")) 'wert an def. adresse in datei schreiben rd_write elseif strcomp(stradr,string("xread")) 'wert von def. adresse aus datei lesen rd_read elseif strcomp(stradr,string("xload")) 'ram-datei von sd laden rd_load elseif strcomp(stradr,string("xtype")) 'ram-datei (text) ausgeben rd_type elseif strcomp(stradr,string("debug")) debug else 'kommando nicht gefunden ios.print(stradr) ios.print(@prompt3) ios.printnl PRI debug ios.rd_init ios.rd_newfile(string("d1"),8) ios.rd_newfile(string("d2"),8) ios.rd_newfile(string("d3"),8) ios.rd_newfile(string("d4"),8) ios.rd_newfile(string("d5"),8) rd_dir PRI rd_type | stradr,len,fnr 'rd: text ausgeben stradr := os_nxtoken1 'dateinamen von kommandozeile holen fnr := ios.rd_open(stradr) 'datei öffnen ifnot fnr == -1 len := ios.rd_len(fnr) ios.rd_seek(fnr,0) repeat len ios.printchar(ios.rd_get(fnr)) ios.rd_close(fnr) PRI rd_load | stradr,len,fnr 'rd: datei in ramdisk laden stradr := os_nxtoken1 'dateinamen von kommandozeile holen ifnot os_error(ios.sdopen("r",stradr)) 'datei öffnen len := ios.sdfattrib(ios#F_SIZE) ios.rd_newfile(stradr,len) 'datei erzeugen fnr := ios.rd_open(stradr) ios.rd_seek(fnr,0) repeat len 'datei einlesen ios.rd_put(fnr,ios.sdgetc) ios.sdclose ios.rd_close(fnr) PRI rd_save | stradr, fnr, len 'rd: datei aus ramdisk speichern stradr := os_nxtoken1 fnr := ios.rd_open(stradr) ifnot fnr == -1 len := ios.rd_len(fnr) ifnot os_error(ios.sdnewfile(stradr)) ifnot os_error(ios.sdopen("W",stradr)) ios.print(string("Schreibe Datei...")) repeat len ios.sdputc(ios.rd_get(fnr)) ios.sdclose ios.print(string(" ok")) ios.printnl ios.rd_close(fnr) PRI rd_rename os_error(ios.rd_rename(os_nxtoken1,os_nxtoken2)) PRI rd_seek | fnr,wert 'rd: dateizeiger setzen fnr := num.FromStr(os_nxtoken1,num#HEX) wert := num.FromStr(os_nxtoken1,num#HEX) ios.rd_seek(fnr,wert) PRI rd_put | fnr,wert,chars 'rd: werte ausgeben fnr := num.FromStr(os_nxtoken1,num#HEX) wert := num.FromStr(os_nxtoken1,num#HEX) chars := num.FromStr(os_nxtoken1,num#HEX) repeat chars ios.rd_put(fnr,wert) PRI rd_get | fnr,chars,i,j 'rd: werte einlesen fnr := num.FromStr(os_nxtoken1,num#HEX) chars := num.FromStr(os_nxtoken1,num#HEX) i := j := 0 repeat chars ifnot i ios.printnl ios.printhex(j,4) ios.printchar(":") ios.printhex(ios.rd_get(fnr),2) ios.printchar(" ") if i++ == 7 i := 0 j++ ios.printnl PRI rd_write | fnr,adr,wert 'rd: wert schreiben fnr := num.FromStr(os_nxtoken1,num#HEX) adr := num.FromStr(os_nxtoken1,num#HEX) wert := num.FromStr(os_nxtoken1,num#HEX) ios.rd_wrbyte(fnr,wert,adr) PRI rd_read | fnr,adr 'rd: wert lesen fnr := num.FromStr(os_nxtoken1,num#HEX) adr := num.FromStr(os_nxtoken1,num#HEX) ios.printhex(ios.rd_rdbyte(fnr,adr),2) ios.printnl PRI rd_close 'rd: datei schliessen ios.rd_close(num.FromStr(os_nxtoken1,num#HEX)) PRI rd_open 'rd: datei öffnen ifnot ios.rd_open(os_nxtoken1) os_error(5) PRI rd_ftab | i 'rd: anzeige ftab i := 0 repeat ios#FILES ios.printnl ios.printhex(i,2) ios.printchar(":") ios.printhex(ios.rd_getftab(i*3+0),6) ios.printchar(" ") ios.printhex(ios.rd_getftab(i*3+1),6) ios.printchar(" ") ios.printhex(ios.rd_getftab(i*3+2),6) ifnot i ios.print(string(" user")) i++ ios.printnl PRI rd_del | adr 'rd: datei löschen if (adr := ios.rd_del(os_nxtoken1)) == 0 ios.print(string("Datei nicht gefunden!")) ios.printnl PRI rd_dir | stradr,len 'rd: dir anzeigen if ios.ram_rdbyte(ios#sysmod,ios#RAMDRV) ios.rd_dir repeat len := ios.rd_dlen stradr := ios.rd_next if stradr ios.print(stradr) ios.printtab ios.printdec(len) ios.printnl until stradr == 0 else os_error(1) PRI rd_header|hp,nx,len,i 'rd: header hp := ios#STARTRD repeat nx := ios.ram_rdlong(ios#sysmod,hp) len := ios.ram_rdlong(ios#sysmod,hp+4) ios.print(string("[adr-header] = $")) ios.printhex(hp,8) ios.printnl ios.print(string("[adr-next ] = $")) ios.printhex(nx,8) ios.printnl ios.print(string("[len ] = $")) ios.printhex(len,8) ios.printchar(" ") ios.printdec(len) ios.printnl ios.print(string("[name ] = ")) i := 0 repeat 12 ios.printchar(ios.ram_rdbyte(ios#sysmod,hp+8+i++)) hp := nx ios.print(string(" <*/q> : ")) if ios.keywait == "q" quit ios.printnl until nx == 0 ios.printnl PRI rd_new 'rd: new file ios.rd_newfile(os_nxtoken1,num.FromStr(os_nxtoken2,num#DEC)) PRI rd_init 'rd: rdisk initialisieren ios.rd_init PRI ram_sysvar | i 'ram: systemvariablen anzeigen ios.print(string("LOADERPTR = ")) ios.printchar("[") ios.printhex(ios#LOADERPTR,6) ios.print(string("] : ")) ios.printhex(ios.ram_rdlong(0,ios#LOADERPTR),6) ios.printnl ios.print(string("MAGIC = ")) ios.printchar("[") ios.printhex(ios#MAGIC,6) ios.print(string("] : ")) ios.printhex(ios.ram_rdbyte(0,ios#MAGIC),6) ios.printnl ios.print(string("SIFLAG = ")) ios.printchar("[") ios.printhex(ios#SIFLAG,6) ios.print(string("] : ")) ios.printhex(ios.ram_rdbyte(0,ios#SIFLAG),6) ios.printnl ios.print(string("BELDRIVE = ")) i := ios#BELDRIVE repeat 12 ios.printchar(ios.ram_rdbyte(0,i++)) ios.printnl ios.print(string("PARAM = ")) i := ios#PARAM repeat 32 ios.printchar(ios.ram_rdbyte(0,i++)) ios.printnl ios.print(string("RAMEND = ")) ios.printchar("[") ios.printhex(ios#RAMEND,6) ios.print(string("] : ")) ios.printhex(ios.ram_getend,6) ios.printnl ios.print(string("RAMBAS = ")) ios.printchar("[") ios.printhex(ios#RAMBAS,6) ios.print(string("] : ")) ios.printhex(ios.ram_getbas,6) ios.printnl PRI ram_setrbas 'ram: basisadresse setzen ios.ram_setbas(num.FromStr(os_nxtoken1,num#HEX)) PRI ram_fill | adr,len,wert 'ram: speicherbereich füllen adr := ram_symbols len := num.FromStr(os_nxtoken1,num#HEX) wert := num.FromStr(os_nxtoken1,num#HEX) repeat len ios.ram_wrbyte(ios#sysmod,wert,adr++) PRI ram_fillusr | adr,len,wert 'ram: speicherbereich füllen adr := ram_symbols len := num.FromStr(os_nxtoken1,num#HEX) wert := num.FromStr(os_nxtoken1,num#HEX) repeat len ios.ram_wrbyte(ios#usrmod,wert,adr++) PRI ram_info 'ram: infos anzeigen ios.print(string("RBAS : $")) ios.printhex(ios.ram_getbas,6) ios.print(string(" REND : $")) ios.printhex(ios.ram_getend,6) ios.print(string(" RLEN : $")) ios.printhex(ios.ram_getend - ios.ram_getbas,6) ios.print(string(" RDRV : $")) ios.printhex(ios.ram_rdbyte(ios#sysmod,ios#RAMDRV),2) ios.printnl PRI ram_mod | wert,adresse,stradr 'ram: rambereich beschreiben {{rmodify - rambereich beschreiben, adresse und werte folgen auf kommandozeile}} adresse := ram_symbols 'adresse von kommandozeile holen repeat if (stradr := os_nxtoken1) wert := num.FromStr(stradr,num#HEX) 'nächstes byte von kommandozeile holen ios.ram_wrbyte(0,wert,adresse++) 'wert in eram schreiben until stradr == 0 'keine parameter mehr? PRI ram_lmod | wert,adresse,stradr 'ram: rambereich beschreiben (long) {{rmodify - rambereich beschreiben, adresse und werte folgen auf kommandozeile}} adresse := ram_symbols 'adresse von kommandozeile holen repeat if (stradr := os_nxtoken1) wert := num.FromStr(stradr,num#HEX) 'nächstes byte von kommandozeile holen ios.ram_wrlong(0,wert,adresse) 'long in eram schreiben adresse := adresse + 4 until stradr == 0 'keine parameter mehr? PRI ram_disp | adresse,zeilen,sadr 'ram: rambereich anzeigen {{rdisplay - rambereich anzeigen, adresse und zeilenzahl folgt auf kommandozeile}} adresse := ram_symbols zeilen := num.FromStr(os_nxtoken1,num#HEX) 'zeilenzahl von kommandozeile holen if zeilen == 0 zeilen := RMON_ZEILEN ram_print(adresse,zeilen) PRI ram_symbols:adresse | sadr 'ram: adresse auflösen sadr := os_nxtoken1 if strcomp(sadr,string("bas")) adresse := ios.ram_getbas elseif strcomp(sadr,string("end")) adresse := ios.ram_getend elseif strcomp(sadr,string("sys")) adresse := ios.ram_getend + 1 elseif strcomp(sadr,string("rd:")) adresse := ios.rd_searchdat(os_nxtoken1) else adresse := num.FromStr(sadr,num#HEX) 'adresse von kommandozeile holen PRI ram_displong | sadr,adresse,wert 'ram: rambereich als long anzeigen adresse := ram_symbols repeat ios.printnl if (adresse => ios.ram_getbas) & (adresse =< ios.ram_getend) ios.setcolor(2) ios.printhex(adresse - ios.ram_getbas,6) ios.setcolor(0) else ios.print(string("------")) ios.printchar("-") ios.printhex(adresse,6) 'adresse ausgeben ios.printchar(" ") wert := ios.ram_rdlong(0,adresse) ios.printhex(wert,6) ios.printchar(":") ios.printbin(wert,32) ios.print(string(" <*/q> : ")) adresse += 4 until ios.keywait == "q" ios.printnl PRI ram_next 'ram: anzeige fortsetzen ram_print(ppos,pcnt) PRI ram_print(adresse,zeilen)|wert,pbas,pend 'ram: ausgabe pbas := ios.ram_getbas 'rbas vom system sichern pend := ios.ram_getend repeat zeilen 'zeilen if (adresse => pbas) & (adresse =< pend) ios.setcolor(2) ios.printhex(adresse-pbas,6) ios.setcolor(0) else ios.print(string("------")) ios.printchar("-") ios.printhex(adresse,6) 'adresse ausgeben ios.printchar(ios#CHAR_SPACE) repeat RMON_BYTES 'hexwerte ausgeben wert := ios.ram_rdbyte(0,adresse++) ios.printhex(wert,2) 'byte ausgeben ios.printchar(":") adresse := adresse - rmon_bytes ios.printchar(ios#CHAR_SPACE) repeat RMON_BYTES 'zeichen ausgeben wert := ios.ram_rdbyte(0,adresse++) if wert < $20 wert := 46 ios.printchar(wert) 'byte ausgeben ios.printchar($0D) ppos := adresse pcnt := zeilen PRI ram_load | adr,len,stradr,status,char,i 'ram: lade datei nach eramadr {{sdload - adr len dateiname lade datei nach eram-adr}} adr := num.FromStr(os_nxtoken1,num#HEX) 'adresse von kommandozeile holen len := num.FromStr(os_nxtoken1,num#HEX) 'l?nge von kommandozeile holen stradr := os_nxtoken1 'dateinamen von kommandozeile holen status := ios.sdopen("r",stradr) 'datei ?ffnen if status > 0 ios.print(string("Status : ")) ios.printdec(status) ios.printnl if status == 0 repeat i from 0 to len char := ios.sdgetc ios.ram_wrbyte(0,char,adr + i) ios.sdclose PUB os_error(err):error 'sys: fehlerausgabe if err ios.printnl ios.print(@err_s1) ios.printdec(err) ios.print(string(" : $")) ios.printhex(err,2) ios.printnl ios.print(@err_s2) case err 0: ios.print(@err0) 1: ios.print(@err1) 2: ios.print(@err2) 3: ios.print(@err3) 4: ios.print(@err4) 5: ios.print(@err5) 6: ios.print(@err6) 7: ios.print(@err7) 8: ios.print(@err8) 9: ios.print(@err9) 10: ios.print(@err10) 11: ios.print(@err11) 12: ios.print(@err12) 13: ios.print(@err13) 14: ios.print(@err14) 15: ios.print(@err15) 16: ios.print(@err16) 17: ios.print(@err17) 18: ios.print(@err18) 19: ios.print(@err19) 20: ios.print(@err20) OTHER: ios.print(@errx) ios.printnl error := err DAT prompt1 byte "ok ", $0d, 0 prompt2 byte ": ", 0 prompt3 byte "? ",0 wait1 byte "",0 help1 file "eram.txt" byte $0d,0 err_s1 byte "Fehlernummer : ",0 err_s2 byte "Fehler : ",0 err0 byte "no error",0 err1 byte "fsys unmounted",0 err2 byte "fsys corrupted",0 err3 byte "fsys unsupported",0 err4 byte "not found",0 err5 byte "file not found",0 err6 byte "dir not found",0 err7 byte "file read only",0 err8 byte "end of file",0 err9 byte "end of directory",0 err10 byte "end of root",0 err11 byte "dir is full",0 err12 byte "dir is not empty",0 err13 byte "checksum error",0 err14 byte "reboot error",0 err15 byte "bpb corrupt",0 err16 byte "fsi corrupt",0 err17 byte "dir already exist",0 err18 byte "file already exist",0 err19 byte "out of disk free space",0 err20 byte "disk io error",0 err21 byte "command not found",0 errx byte "undefined",0