TriOS/system/regnatix/flash.spin

433 lines
15 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 : flash
Chip : Regnatix
Typ : Programm
Version :
Subversion :
Funktion : Flash-Tool
Komponenten : -
COG's : -
Logbuch :
09-04-2011-dr235 - erste version
Kommandoliste :
/? : Hilfe
/fh <fn> : Datei in HI-ROM flashen
/fl <fn> : Datei in LO-ROM flashen
/dh : Dump HI-ROM
/dl : Dump LO-ROM
/vh <fn> : Vergleich Datei <--> HI-ROM
/ch : HI-ROM löschen
/cl : LO-ROM löschen
/sh <fn> : HI-ROM speichern
/sl <fn> : LO-ROM speichern
Notizen :
}}
OBJ
ios : "reg-ios"
sdspi : "glob-sdspi"
num : "glob-numbers"
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
DCOL = 8 'dump spaltenzahl
DROW = 16 'dump zeilenzahl
PAGESIZE = 32
BUFFERSIZE = DCOL * DROW
LO_EEPROM = $0000 ' based upon 24LC512 (64KB)
HI_EEPROM = $8000
IMAGESIZE = $8000 'größe eines rom-images
VAR
byte buffer[BUFFERSIZE]
byte parastr[64]
byte input[64]
long ioControl[2]
PUB main
ios.start 'ios initialisieren
ios.parastart 'parameterübergabe starten
sdspi.start(@iocontrol) 'spi-treiber starten
repeat while ios.paranext(@parastr) 'parameter einlesen
if byte[@parastr][0] == "/" 'option?
case byte[@parastr][1]
"?": ios.print(string("help: man flash")) '/?
"f": case byte[@parastr][2]
"h": flash(HI_EEPROM) '/fh - in oberen rom flashen
"l": flash(LO_EEPROM) '/fl - in unteren rom flashen
"d": case byte[@parastr][2]
"h": dump(HI_EEPROM) '/dh - dump des oberen rom
"l": dump(LO_EEPROM) '/dl - dump des unteren rom
"v": case byte[@parastr][2]
"h": verify(HI_EEPROM) '/vh - vergleih oberen rom
"c": case byte[@parastr][2]
"h": clear(HI_EEPROM) '/ch - oberen rom löschen
"l": clear(LO_EEPROM) '/cl - unteren rom löschen
"s": case byte[@parastr][2]
"h": save(HI_EEPROM) '/sh - oberen rom speichern
"l": save(LO_EEPROM) '/sl - unteren rom speichern
"t": testsave(HI_EEPROM)
sdspi.stop
' ios.ram_wrbyte(ios#sysmod,0,ios#SIFLAG)
' reboot
ios.stop
PRI dump(eeAdr)|key,i,j,n 'flash: azeige rom-inhalt
eeAdr += sdspi#bootAddr ' always use boot EEPROM
repeat
sdspi.readEEPROM(eeAdr,@buffer,BUFFERSIZE)
i := j := 0
repeat DROW 'zeilen
ios.printhex(eeAdr+j*DCOL,4)
ios.printchar(" ")
repeat DCOL 'bytes
n := byte[@buffer][i++]
ios.printhex(n,2)
ios.printchar(":")
ios.printchar(" ")
i := i - DCOL
repeat DCOL 'zeichen
n := byte[@buffer][i++]
ios.printqchar(n)
ios.printnl
j++
ios.print(string("CMD? [b]ack[q]uit[a]dr[n]ext : "))
key := ios.keywait
case key
"b": eeAdr := eeAdr - BUFFERSIZE
"a": eeAdr := inputhex + sdspi#bootAddr
"n": eeAdr := eeAdr + BUFFERSIZE
ios.printnl
ios.printnl
until key == "q"
PRI flash(eeAdr)|i,len,pos,dif,pcnt 'flash: datei flashen
eeAdr += sdspi#bootAddr 'deviceadresse hinzufügen
if ios.paranext(@parastr)
ios.printnl
ios.print(@msg0)
ios.print(@msg1)
ios.print(@parastr)
ios.printnl
ifnot ios.sdopen("R",@parastr)
'programmlänge ermitteln
repeat i from 0 to PAGESIZE - 1 'erste page --> puffer
byte[@buffer][i] := ios.sdgetc
len := word[@buffer+$A] '$a ist stackposition und damit länge der objektdatei
ios.sdclose
'datei kpl. einlesen und flashen
ios.print(@msg8)
ios.printhex(eeAdr,8)
ios.printnl
ios.print(@msg4)
ios.printdec(len)
ios.printnl
ios.print(@msg5)
ios.printdec(len/PAGESIZE)
ios.printnl
ios.print(@msg2)
pcnt := len / PAGESIZE / 10
ios.curchar("▶")
ios.sdopen("R",@parastr)
repeat pos from 0 to len - 1 step PAGESIZE
dif := (len - pos) <# PAGESIZE
repeat i from 0 to dif - 1 'page --> puffer
byte[@buffer][i] := ios.sdgetc
sdspi.writeEEPROM(eeAdr+pos,@buffer,dif) 'puffer --> eeprom
sdspi.writeWait(eeAdr+pos) 'warte auf ende des schreibvorgangs
pcnt--
if pcnt == 0
ios.printchar("•")
pcnt := len / PAGESIZE / 10
ios.sdclose
ios.curchar("‣")
ios.print(@msg3)
else
printErr(@err2)
else
printErr(@err1)
PRI verify(eeAdr)|a,b,pos,len,i 'flash: vergleichen
eeAdr += sdspi#bootAddr 'deviceadresse hinzufügen
len := IMAGESIZE
if ios.paranext(@parastr)
ios.printnl
ios.print(@msg0)
ios.print(@msg1)
ios.print(@parastr)
ios.printnl
ifnot ios.sdopen("R",@parastr)
ios.print(@msg7)
ios.print(@msg4)
ios.printdec(IMAGESIZE)
ios.printnl
ios.print(@msg5)
ios.printdec(len/PAGESIZE)
ios.printnl
'vergleich starten
repeat pos from 0 to IMAGESIZE-1 step PAGESIZE
sdspi.readEEPROM(eeAdr+pos,@buffer,PAGESIZE) 'page einlesen
repeat i from 0 to PAGESIZE-1
a := byte[@buffer][i]
b := ios.sdgetc
if a <> b
ios.printhex(eeAdr+pos+i,4)
ios.print(string(" : "))
ios.printhex(a,2)
ios.print(string(" <> "))
ios.printhex(b,2)
ios.print(string(" CMD? [q]uit[*]next : "))
case ios.keywait
"q": return
ios.printnl
ios.sdclose
else
printErr(@err2)
else
printErr(@err1)
PRI save(eeAdr)|pos,len,i,j,pcnt,blk 'flash: speichern
eeAdr += sdspi#bootAddr 'deviceadresse hinzufügen
len := IMAGESIZE
blk := len/BUFFERSIZE
pcnt := blk/10
if ios.paranext(@parastr)
ios.printnl
ios.print(@msg9)
ios.print(@msg1)
ios.print(@parastr)
ios.printnl
ifnot ios.sdnewfile(@parastr)
ios.sdopen("W",@parastr)
ios.print(@msg8)
ios.printhex(eeAdr,8)
ios.printnl
ios.print(@msg4)
ios.printdec(IMAGESIZE)
ios.printnl
ios.print(@msg5)
ios.printdec(blk)
ios.printnl
ios.print(@msgA)
ios.curchar("▶")
j := 0
repeat blk+1
sdspi.readEEPROM(eeAdr,@buffer,BUFFERSIZE) 'puffer einlesen
ios.sdputblk(BUFFERSIZE,@buffer)
eeAdr := eeAdr + BUFFERSIZE
pcnt--
if pcnt == 0
ios.printchar("•")
pcnt := len / BUFFERSIZE / 10
ios.sdputc(0) 'provisorischer patch für fatengine:
'bei 32kb-grenze gibt es einen fehler!
ios.sdclose
ios.curchar("‣")
ios.print(@msg3)
else
printErr(@err2)
else
printErr(@err1)
PRI testsave(eeAdr)|pos,len,i,j,pcnt,blk 'flash: speichern
eeAdr += sdspi#bootAddr 'deviceadresse hinzufügen
len := IMAGESIZE
blk := len/BUFFERSIZE
pcnt := blk/10
if ios.paranext(@parastr)
ios.printnl
ios.print(@msg0)
ios.print(@msg1)
ios.print(@parastr)
ios.printnl
ifnot ios.sdnewfile(@parastr)
ios.sdopen("W",@parastr)
ios.print(@msg9)
ios.print(@msg8)
ios.printhex(eeAdr,8)
ios.printnl
ios.print(@msg4)
ios.printdec(IMAGESIZE)
ios.printnl
ios.print(@msg5)
ios.printdec(blk)
ios.printnl
ios.print(@msgA)
ios.curchar("▶")
j := 0
repeat blk+1
repeat i from 0 to BUFFERSIZE-1
ios.sdputc(j)
ios.printdec(j++)
ios.printchar(" ")
ios.sdclose
ios.curchar("‣")
ios.print(@msg3)
else
printErr(@err2)
else
printErr(@err1)
PRI printbuf(eeAdr)|i,j,n
i := j := 0
repeat DROW 'zeilen
ios.printhex(eeAdr+j*DCOL,4)
ios.printchar(" ")
repeat DCOL 'bytes
n := byte[@buffer][i++]
ios.printhex(n,2)
ios.printchar(":")
ios.printchar(" ")
i := i - DCOL
repeat DCOL 'zeichen
n := byte[@buffer][i++]
ios.printqchar(n)
ios.printnl
j++
DAT 'sys: strings
msg0 byte "Funktion : Datei --> ROM",13,0
msg1 byte "Datei : ",0
msg2 byte "Flash : ",0
msg3 byte " ok",13,0
msg4 byte "Länge : ",0
msg5 byte "Blöcke : ",0
msg6 byte "Funktion : ROM löschen",13,0
msg7 byte "Funktion : Datei <--> ROM vergleichen",13,0
msg8 byte "Adresse : $",0
msg9 byte "Funktion : ROM --> Datei",13,0
msgA byte "Image : ",0
PRI clear(eeAdr)|len,pcnt,i,pos 'flash: löschen
eeAdr += sdspi#bootAddr 'deviceadresse hinzufügen
len := IMAGESIZE
pcnt := len / PAGESIZE / 10
ios.printnl
ios.print(@msg6)
ios.print(@msg4)
ios.printdec(IMAGESIZE)
ios.printnl
ios.print(@msg5)
ios.printdec(len/PAGESIZE)
ios.printnl
ios.print(@msg2)
ios.curchar("▶")
'puffer löschen
repeat i from 0 to BUFFERSIZE-1
byte[@buffer][i] := 0
'rom löschen
repeat pos from 0 to IMAGESIZE-1 step PAGESIZE
sdspi.writeEEPROM(eeAdr+pos,@buffer,PAGESIZE)
sdspi.writeWait(eeAdr+pos)
pcnt--
if pcnt == 0
ios.printchar("•")
pcnt := len / PAGESIZE / 10
ios.curchar("‣")
ios.print(@msg3)
return
DAT 'sys: fehermeldungen
err0 byte 13,"Fehler : "
err1 byte "Zu wenig Parameter!",13,0
err2 byte "Datei nicht gefunden!",13,0
PRI printErr(stradr) 'sys: feherbehandlung
ios.print(@err0)
ios.print(stradr)
ios.print(string("help: man flash"))
PRI inputhex:hexnum 'sys: eingabe hexwert
ios.curchar("_")
ios.print(string("Adresse : $"))
ios.input(@input,8) 'nummer eingeben
ios.curchar("‣")
hexnum := num.FromStr(@input,num#HEX) 'string in hexwert wandeln
return
DAT 'lizenz
{{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 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. │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
}}