From 1e16142429fd6662c8f2ee5ba96faf2456e7469b Mon Sep 17 00:00:00 2001 From: drohne235 Date: Sat, 3 Apr 2010 13:37:42 +0000 Subject: [PATCH] --- bin/system/TEMP.TXT | 7 + bin/system/TEST/TEMP.TXT | 7 + bin/system/TEST/test1.txt | 7 + bin/system/TEST/test2.txt | 115 ++++ bin/system/hallo.bin | Bin 2388 -> 2476 bytes bin/system/led.bin | Bin 0 -> 48 bytes bin/system/reg.sys | Bin 6684 -> 6584 bytes bin/system/regime.bin | Bin 0 -> 6584 bytes bin/system/test1.txt | 7 + bin/system/test2.txt | 115 ++++ bin/system/test3.txt | 3 + flash/administra/admflash-fsrw.spin | 711 ----------------------- flash/administra/admflash-sdspiqasm.spin | Bin 16686 -> 0 bytes flash/administra/admflash.spin | Bin 75490 -> 90300 bytes flash/administra/amdflash-fat.spin | Bin 0 -> 309170 bytes flash/administra/amdflash-rtc.spin | Bin 0 -> 43102 bytes flash/administra/pterm.spin | Bin 0 -> 39544 bytes system/regnatix/admtest.spin | Bin 6890 -> 20396 bytes system/regnatix/ios.spin | Bin 73538 -> 77094 bytes system/regnatix/regime.spin | Bin 49052 -> 49196 bytes 20 files changed, 261 insertions(+), 711 deletions(-) create mode 100644 bin/system/TEMP.TXT create mode 100644 bin/system/TEST/TEMP.TXT create mode 100644 bin/system/TEST/test1.txt create mode 100644 bin/system/TEST/test2.txt create mode 100644 bin/system/led.bin create mode 100644 bin/system/regime.bin create mode 100644 bin/system/test1.txt create mode 100644 bin/system/test2.txt create mode 100644 bin/system/test3.txt delete mode 100644 flash/administra/admflash-fsrw.spin delete mode 100644 flash/administra/admflash-sdspiqasm.spin create mode 100644 flash/administra/amdflash-fat.spin create mode 100644 flash/administra/amdflash-rtc.spin create mode 100644 flash/administra/pterm.spin diff --git a/bin/system/TEMP.TXT b/bin/system/TEMP.TXT new file mode 100644 index 0000000..15d01ca --- /dev/null +++ b/bin/system/TEMP.TXT @@ -0,0 +1,7 @@ + +"Die Blütenträume +Von Faltern, wie ich hörte, +So lautlos wie sie -" +Reikan + + diff --git a/bin/system/TEST/TEMP.TXT b/bin/system/TEST/TEMP.TXT new file mode 100644 index 0000000..15d01ca --- /dev/null +++ b/bin/system/TEST/TEMP.TXT @@ -0,0 +1,7 @@ + +"Die Blütenträume +Von Faltern, wie ich hörte, +So lautlos wie sie -" +Reikan + + diff --git a/bin/system/TEST/test1.txt b/bin/system/TEST/test1.txt new file mode 100644 index 0000000..15d01ca --- /dev/null +++ b/bin/system/TEST/test1.txt @@ -0,0 +1,7 @@ + +"Die Blütenträume +Von Faltern, wie ich hörte, +So lautlos wie sie -" +Reikan + + diff --git a/bin/system/TEST/test2.txt b/bin/system/TEST/test2.txt new file mode 100644 index 0000000..72e62d4 --- /dev/null +++ b/bin/system/TEST/test2.txt @@ -0,0 +1,115 @@ +Johann Wolfgang Goethe + +Der Zauberlehrling + +Hat der alte Hexenmeister +Sich doch einmal wegbegeben! +Und nun sollen seine Geister +Auch nach meinem Willen leben! +Seine Wort' und Werke +Merkt' ich und den Brauch, +Und mit Geistesstärke +Tu' ich Wunder auch. + +Walle! Walle +Manche Strecke, +Dass, zum Zwecke, +Wasser fließe +Und mit reichem, vollem Schwalle +Zu dem Bade sich ergieße. + +Und nun komm, du alter Besen! +Nimm die schlechten Lumpenhüllen! +Bist schon lange Knecht gewesen; +Nun erfülle meinen Willen! +Auf zwei Beinen stehe, +Oben sei ein Kopf, +Eile nun und gehe +Mit dem Wassertopf! + +Walle! Walle +Manche Strecke, +Dass, zum Zwecke, +Wasser fließe +Und mit reichem, vollem Schwalle +Zu dem Bade sich ergieße. + +Seht, er läuft zum Ufer nieder; +Wahrlich! ist schon an dem Flusse, +Und mit Blitzesschnelle wieder +Ist er hier mit raschem Gusse. +Schon zum zweiten Male! +Wie das Becken schwillt! +Wie sich jede Schale +Voll mit Wasser füllt! + +Stehe! Stehe! +Denn wir haben +Deiner Gaben +Voll gemessen! +Ach, ich merk' es! Wehe! Wehe! +Hab' ich doch das Wort vergessen! + +Ach, das Wort, worauf am Ende +Er das wird, was er gewesen. +Ach, er läuft und bringt behände! +Wärst du doch der alte Besen! +Immer neue Güsse +Bringt er schnell herein, +Ach! und hundert Flüsse +Stürzen auf mich ein. + +Nein, nicht länger +Kann ich's lassen; +Will ihn fassen. +Das ist Tücke! +Ach! nun wird mir immer bänger! +Welche Miene! Welche Blicke! + +Oh, du Ausgeburt der Hölle! +Soll das ganze Haus ersaufen? +Seh' ich über jede Schwelle +Doch schon Wasserströme laufen. +Ein verruchter Besen, +Der nicht hören will! +Stock, der du gewesen, +Steh doch wieder still! + +Willst's am Ende +Gar nicht lassen? +Will dich fassen, +Will dich halten +Und das alte Holz behände +Mit dem scharfen Beile spalten. + +Seht, da kommt er schleppend wieder! +Wie ich mich nun auf dich werfe, +Gleich, o Kobold, liegst du nieder; +Krachend trifft die glatte Schärfe! +Wahrlich, brav getroffen! +Seht, er ist entzwei! +Und nun kann ich hoffen +Und ich atme frei! + +Wehe! Wehe! +Beide Teile +Stehn in Eile +Schon als Knechte +Völlig fertig in die Höhe! +Helft mir, ach! ihr hohen Mächte! + +Und sie laufen! Nass und nässer +Wird's im Saal und auf den Stufen. +Welch entsetzliches Gewässer! +Herr und Meister! Hör' mich rufen! - +Ach, da kommt der Meister! +Herr, die Not ist groß! +Die ich rief, die Geister, +Werd' ich nun nicht los. + +In die Ecke, +Besen! Besen! +Seid's gewesen! +Denn als Geister +Ruft euch nur, zu seinem Zwecke, +Erst hervor der alte Meister." \ No newline at end of file diff --git a/bin/system/hallo.bin b/bin/system/hallo.bin index 611cf33f2a2f9a8e0fca948e436468c9430429e3..de71c4544c76c22b6bcfd7870144f2e2fa9dd89f 100644 GIT binary patch literal 2476 zcma)7U2IfE6rQOS6qA;=!5DYJTj$;>+aExvQAjKn1tT%tGP~Scwtu@@ z1>-|`5s*Z!QTch$Hxr`h1C=LZLNsDbd@z`(55%O^NWwNTlBg{e{ATWMO9Cnn-<#a+ zA+G?R7!mS|5hD+W2uT84L)Bye@?a=JPC&j5ya${G&ck*Y@(LtEkxF1C&|t<$4`kXj z$tZ9V_zbuN+c&^vGeWLI&H*7t$V0%REJFGrhaq2sd<%FNmK9I;C&J)U>B%7Asy1_PVQF5Ne(^6c!VO3FaP3sBX zW=3FIuneco?w(8<^S@0Ln<-mPj~@AeRV-TU7krr*@P`qSabJ4Hi6NRrh;v?%C9-_M zqBeJ12aUANkGI%7O}W~X*n~M_jM^&yxnnIw7Uwstt|iSi=PTK(Ef1Pm?k`z~vPf|R z=D`G4EbE#J$nv|j&uKFa-ewb#lWf%xA0uqFPd(Ph-R7K;qpY5=-L5e+UVto)Q|)$} zSHYRh8Dns>DQA6D>}P#;yD=qsRm7=^xumKlMwxXio{CY?%X$gh1*Sb2>qE#?4431_ z2yAZ$N= zCBhd|i=>ojAV?ILcbE4;VzwQ8n7wS7jqjs`toJuN#c@6)vu_l#liYJ=hmAZh48K3= zZ03_Tb%Ja*70WbBqs(lVce;*CXLb;-peO3uZ0a`aeZ@j$CRQl+6l|hqk=3$ZWJS$; z`4G)~Gyxf8RmFlQ)2G2)%6h3}yZd?Kc)SUr=Lh~|c7iUBc7 z1gZ*HbuVs2vSy#M7Wij$o&$QtjsLSgY3(&wzO6tZRh3jd7F*#?f+YT39AQRjgO5RE z7SC&pj-u9X%djzm&4a-i-6f=MNC%Q zx<$G#I4YQpvd2?II=CyI(7;Y2U7~m>;7#E8z5_e&aI~en{wiA0V+rXR(dnDaU>yahISfM>AH%DUMD)|^iyqR~9CG|jf~v}}J|{b9 z-*)OrH6g_`-^;m)=dQno92vv9ZWHyv&|~wPvi}b1+#M6&qQfum+!r zK5M&%H|vs_%%fhUf%5i>PhFb1=r&&!8%2AK*dlsrma~p%+D7B{l`h?cajFWe40u1< z+^Oad7QAJ(Qq~z9z>I({!e!lEx5#jJj9K*tqh*G9R6bXy&#lz!ibZR^)>o;OJwZjS z-Vl^^q3w52_Bdsm_5aZvzGSJDc+hl9jjel5H=83?cB13!Rmb0_7@AJ^zMYKhC8Ybd zc6O8lch~TSQrKkdkn*sTVeP56f(Mc`gB?6`bZ4r+G<^bs>7z+8g&g9Zb7;@I<@g6c C++8yO literal 2388 zcma)6TWB0r7(Qoq&SrPBo5mzfFA1_~npBj8b&@l4(j`gLN}47`A6i;31#_9%&ZM)s z?4=j=A+cht6>9`9tq&r2fkO2q7NLkOD2hIaPa+6HgHq@Qi%3h-)cT#7%|(pZhj0G> z|IUBDGyggNIb`Nbb<`>+`@^|#EqN~d2vKO1sN@ks2n{NfPEFJXl?2?dcF@Vhv(AVa z-#MB&+#EmXm{um68vx;CbMa@6SwlzM(QGpz;l1QCRmty^kV+*)S`|WsqLM!N=ah2t zGveQX8^A5Z8v-gh6CmVlAVfZg{TlcI_%RSAm`2KgCRHT@cp7*SI0Nnt;2kwYF2P;_ zz61UQN?C|JzzES{55OJ*QowoO4$v4R#0aWn95@aCEbtL916&S92`M2YRuUrhB`O(! ze+qaNco+BpI1hXRd~|$$UrWik^GbS_)*7lt$0xcT=qn^dC(allvlBOT`fD)x2saKVzjDo$`!X?d;GCd7d`i*K+POxAnOZCChUoA5QB# z__RiK)%o#eb~Vm{_3&{z z{P6^=E9=YR=a3_U%h_A}Y|JC92j4os0OUC)4zHT0;kswlrBdOZR$H*oR78A{e(9G= z8L{!IG)BNTif5#%i2AA;+?eNzjkA^sWg{?K@ExV-Ae4e-_mW0TR^w1si~N+g&SCG1 z>Tysw`yQUADX)6}po-O7Ue@qZ7tFt=@?cv zwvH&H7(C+7kqL<2{GVTY%gcJ({~65`rB{u5L+O~&#fJ77E#aJG`3wsTiUGAG?c5w06GW*OQFjy+&`#%Zod(D$uWsZBZY&Egne zxE3j+ZB$`A)4|QLX|;09o(Gj-RPGGx)!ktw zqnUg@Qj+SXqKUO8ljpuAj);V|nf70ia%$Q)MWVo3?bN}+S~c2l>v+K!6$#cWBEtv5 zPiTf>&lzMkwaX6GP~KMZfGg9C#C0}}%W0}F$NgzYsM`-!PQ`ii^hfwVKqEG0$^3=9AT C3=0(i literal 0 HcmV?d00001 diff --git a/bin/system/reg.sys b/bin/system/reg.sys index b49f7400485aebe37b587dd8be76b4bceb68d331..cb9a7e1f7449f062daa05ece9e584e3e88c7f231 100644 GIT binary patch literal 6584 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 WkB8v&;YcBlHH_bS4KDexHU1lh@;!b4 delta 3859 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 WkB8v&;YcBlHH_bS4KDexHU1lh@;!b4 literal 0 HcmV?d00001 diff --git a/bin/system/test1.txt b/bin/system/test1.txt new file mode 100644 index 0000000..15d01ca --- /dev/null +++ b/bin/system/test1.txt @@ -0,0 +1,7 @@ + +"Die Blütenträume +Von Faltern, wie ich hörte, +So lautlos wie sie -" +Reikan + + diff --git a/bin/system/test2.txt b/bin/system/test2.txt new file mode 100644 index 0000000..72e62d4 --- /dev/null +++ b/bin/system/test2.txt @@ -0,0 +1,115 @@ +Johann Wolfgang Goethe + +Der Zauberlehrling + +Hat der alte Hexenmeister +Sich doch einmal wegbegeben! +Und nun sollen seine Geister +Auch nach meinem Willen leben! +Seine Wort' und Werke +Merkt' ich und den Brauch, +Und mit Geistesstärke +Tu' ich Wunder auch. + +Walle! Walle +Manche Strecke, +Dass, zum Zwecke, +Wasser fließe +Und mit reichem, vollem Schwalle +Zu dem Bade sich ergieße. + +Und nun komm, du alter Besen! +Nimm die schlechten Lumpenhüllen! +Bist schon lange Knecht gewesen; +Nun erfülle meinen Willen! +Auf zwei Beinen stehe, +Oben sei ein Kopf, +Eile nun und gehe +Mit dem Wassertopf! + +Walle! Walle +Manche Strecke, +Dass, zum Zwecke, +Wasser fließe +Und mit reichem, vollem Schwalle +Zu dem Bade sich ergieße. + +Seht, er läuft zum Ufer nieder; +Wahrlich! ist schon an dem Flusse, +Und mit Blitzesschnelle wieder +Ist er hier mit raschem Gusse. +Schon zum zweiten Male! +Wie das Becken schwillt! +Wie sich jede Schale +Voll mit Wasser füllt! + +Stehe! Stehe! +Denn wir haben +Deiner Gaben +Voll gemessen! +Ach, ich merk' es! Wehe! Wehe! +Hab' ich doch das Wort vergessen! + +Ach, das Wort, worauf am Ende +Er das wird, was er gewesen. +Ach, er läuft und bringt behände! +Wärst du doch der alte Besen! +Immer neue Güsse +Bringt er schnell herein, +Ach! und hundert Flüsse +Stürzen auf mich ein. + +Nein, nicht länger +Kann ich's lassen; +Will ihn fassen. +Das ist Tücke! +Ach! nun wird mir immer bänger! +Welche Miene! Welche Blicke! + +Oh, du Ausgeburt der Hölle! +Soll das ganze Haus ersaufen? +Seh' ich über jede Schwelle +Doch schon Wasserströme laufen. +Ein verruchter Besen, +Der nicht hören will! +Stock, der du gewesen, +Steh doch wieder still! + +Willst's am Ende +Gar nicht lassen? +Will dich fassen, +Will dich halten +Und das alte Holz behände +Mit dem scharfen Beile spalten. + +Seht, da kommt er schleppend wieder! +Wie ich mich nun auf dich werfe, +Gleich, o Kobold, liegst du nieder; +Krachend trifft die glatte Schärfe! +Wahrlich, brav getroffen! +Seht, er ist entzwei! +Und nun kann ich hoffen +Und ich atme frei! + +Wehe! Wehe! +Beide Teile +Stehn in Eile +Schon als Knechte +Völlig fertig in die Höhe! +Helft mir, ach! ihr hohen Mächte! + +Und sie laufen! Nass und nässer +Wird's im Saal und auf den Stufen. +Welch entsetzliches Gewässer! +Herr und Meister! Hör' mich rufen! - +Ach, da kommt der Meister! +Herr, die Not ist groß! +Die ich rief, die Geister, +Werd' ich nun nicht los. + +In die Ecke, +Besen! Besen! +Seid's gewesen! +Denn als Geister +Ruft euch nur, zu seinem Zwecke, +Erst hervor der alte Meister." \ No newline at end of file diff --git a/bin/system/test3.txt b/bin/system/test3.txt new file mode 100644 index 0000000..96d2229 --- /dev/null +++ b/bin/system/test3.txt @@ -0,0 +1,3 @@ +0123456789 +0123456789 +0123456789 \ No newline at end of file diff --git a/flash/administra/admflash-fsrw.spin b/flash/administra/admflash-fsrw.spin deleted file mode 100644 index 4a27665..0000000 --- a/flash/administra/admflash-fsrw.spin +++ /dev/null @@ -1,711 +0,0 @@ -{{ -' fsrw.spin 1.6 Copyright 2008 Radical Eye Software -' -' See end of file for terms of use. -' -' This object provides FAT16 file read/write access on a block device. -' Only one file open at a time. Open modes are 'r' (read), 'a' (append), -' 'w' (write), and 'd' (delete). Only the root directory is supported. -' No long filenames are supported. We also support traversing the -' root directory. -' -' In general, negative return values are errors; positive return -' values are success. Other than -1 on popen when the file does not -' exist, all negative return values will be "aborted" rather than -' returned. -' -' Changes: -' v1.1 28 December 2006 Fixed offset for ctime -' v1.2 29 December 2006 Made default block driver be fast one -' v1.3 6 January 2007 Added some docs, and a faster asm -' v1.4 4 February 2007 Rearranged vars to save memory; -' eliminated need for adjacent pins; -' reduced idle current consumption; added -' sample code with abort code data -' v1.5 7 April 2007 Fixed problem when directory is larger -' than a cluster. -' v1.6 23 September 2008 Fixed a bug found when mixing pputc -' with pwrite. Also made the assembly -' routines a bit more cautious. -}} -' -' Constants describing FAT volumes. -' -con - SECTORSIZE = 512 - SECTORSHIFT = 9 - DIRSIZE = 32 - DIRSHIFT = 5 -' -' The object that provides the block-level access. -' -obj - sdspi: "admflash-sdspiqasm" - -var -' -' -' Variables concerning the open file. -' - long fclust ' the current cluster number - long filesize ' the total current size of the file - long floc ' the seek position of the file - long frem ' how many bytes remain in this cluster from this file - long bufat ' where in the buffer our current character is - long bufend ' the last valid character (read) or free position (write) - long direntry ' the byte address of the directory entry (if open for write) - long writelink ' the byte offset of the disk location to store a new cluster - long fatptr ' the byte address of the most recently written fat entry - - long fsize ' dateigröße - long fattrib ' dateiattribute - long ftime ' zeitstempel -' -' Variables used when mounting to describe the FAT layout of the card. -' - long rootdir ' the byte address of the start of the root directory - long rootdirend ' the byte immediately following the root directory. - long dataregion ' the start of the data region, offset by two sectors - long clustershift ' log base 2 of blocks per cluster - long fat1 ' the block address of the fat1 space - long totclusters ' how many clusters in the volume - long sectorsperfat ' how many sectors per fat -' -' Variables controlling the caching. -' - long lastread ' the block address of the buf2 contents - long dirty ' nonzero if buf2 is dirty -' -' Buffering: two sector buffers. These two buffers must be longword -' aligned! To ensure this, make sure they are the first byte variables -' defined in this object. -' - byte buf[SECTORSIZE] ' main data buffer - byte buf2[SECTORSIZE] ' main metadata buffer - byte padname[11] ' filename buffer - -CON { SEKTORINTERFACE -das sektorinterface arbeitet mit zusammenhängenden containerdateien und ermöglicht einen wahlfreien -zugriff auf die daten. die containerdatei werden mit dem entsprechenden tool auf einer leeren und -frisch formatierten karte erzeugt. - -} - -PUB sec_start(strptr): s | err 'sec: startsektor einer containerdatei ermitteln -{{ conainerdatei wird geöffnet und startsektor berechnet. die sektornummer wird zurückgeliefert; -bei einem fehler der wert -1}} - s~ - err := popen(strptr,"r") 'containerdatei öffnen - ifnot err 'kein fehler bei öffnen des containers - s := (fclust << clustershift) + dataregion 'startsektor berechnen - pclose 'containerdatei schließen - return s - else - return -1 - -' sequenz aus pfillbuf: -' sdspi.readblock(datablock, @buf) 'cluster einlesen - -' sequenz aus datablock: -' return (fclust << clustershift) + dataregion + ((floc >> SECTORSHIFT) & ((1 << clustershift) - 1)) - - -PUB sec_readblock(secnr, badr) - sdspi.readblock(secnr, badr) - -PUB sec_writeblock(secnr, badr) - sdspi.writeblock(secnr, badr) - - -CON { FAT16-Code - -} -pri writeblock2(n, b) -' -' On metadata writes, if we are updating the FAT region, also update -' the second FAT region. -' - sdspi.writeblock(n, b) - if (n => fat1 and n < fat1 + sectorsperfat) - sdspi.writeblock(n+sectorsperfat, b) - -pri flushifdirty -' -' If the metadata block is dirty, write it out. -' - if (dirty) - writeblock2(lastread, @buf2) - dirty := 0 - -pri readblockc(n) -' -' Read a block into the metadata buffer, if that block is not already -' there. -' - if (n <> lastread) - flushifdirty - sdspi.readblock(n, @buf2) - lastread := n - -pri brword(b) -' -' Read a byte-reversed word from a (possibly odd) address. -' - return (byte[b]) + ((byte[b][1]) << 8) - -pri brlong(b) -' -' Read a byte-reversed long from a (possibly odd) address. -' - return brword(b) + (brword(b+2) << 16) - -pri brwword(w, v) -' -' Write a byte-reversed word to a (possibly odd) address, and -' mark the metadata buffer as dirty. -' - byte[w++] := v - byte[w] := v >> 8 - dirty := 1 - -pri brwlong(w, v) -' -' Write a byte-reversed long to a (possibly odd) address, and -' mark the metadata buffer as dirty. -' - brwword(w, v) - brwword(w+2, v >> 16) - -pub mount(basepin) | start, sectorspercluster, reserved, rootentries, sectors -{{ -' Mount a volume. The address passed in is passed along to the block -' layer; see the currently used block layer for documentation. If the -' volume mounts, a 0 is returned, else abort is called. -}} - sdspi.start(basepin) - lastread := -1 - dirty := 0 - sdspi.readblock(0, @buf) - if (brlong(@buf+$36) == constant("F" + ("A" << 8) + ("T" << 16) + ("1" << 24))) - start := 0 - else - start := brlong(@buf+$1c6) - sdspi.readblock(start, @buf) - if (brlong(@buf+$36) <> constant("F" + ("A" << 8) + ("T" << 16) + ("1" << 24)) or buf[$3a] <> "6") - return 1 ' not a fat16 volume - if (brword(@buf+$0b) <> SECTORSIZE) - return 2 ' bad bytes per sector - sectorspercluster := buf[$0d] - if (sectorspercluster & (sectorspercluster - 1)) - return 3 ' bad sectors per cluster - clustershift := 0 - repeat while (sectorspercluster > 1) - clustershift++ - sectorspercluster >>= 1 - sectorspercluster := 1 << clustershift - reserved := brword(@buf+$0e) - if (buf[$10] <> 2) - return 4 ' not two FATs - rootentries := brword(@buf+$11) - sectors := brword(@buf+$13) - if (sectors == 0) - sectors := brlong(@buf+$20) - sectorsperfat := brword(@buf+$16) - if (brword(@buf+$1fe) <> $aa55) - return 5 ' bad FAT signature - fat1 := start + reserved - rootdir := (fat1 + 2 * sectorsperfat) << SECTORSHIFT - rootdirend := rootdir + (rootentries << DIRSHIFT) - dataregion := 1 + ((rootdirend - 1) >> SECTORSHIFT) - 2 * sectorspercluster - totclusters := ((sectors - dataregion + start) >> clustershift) - if (totclusters > $fff0) - return 6 ' too many clusters - return 0 - -pri readbytec(byteloc) -' -' Read a byte address from the disk through the metadata buffer and -' return a pointer to that location. -' - readblockc(byteloc >> SECTORSHIFT) - return @buf2 + (byteloc & constant(SECTORSIZE - 1)) - -pri readfat(clust) -' -' Read a fat location and return a pointer to the location of that -' entry. -' - fatptr := (fat1 << SECTORSHIFT) + (clust << 1) - return readbytec(fatptr) - -pri followchain | clust -' -' Follow the fat chain and update the writelink. -' - clust := brword(readfat(fclust)) - writelink := fatptr - return clust - -pri nextcluster | clust -' -' Read the next cluster and return it. Set up writelink to -' point to the cluster we just read, for later updating. If the -' cluster number is bad, return a negative number. -' - clust := followchain - if (clust < 2 or clust => totclusters) - abort(-9) ' bad cluster value - return clust - -pri freeclusters(clust) | bp -' -' Free an entire cluster chain. Used by remove and by overwrite. -' Assumes the pointer has already been cleared/set to $ffff. -' - repeat while (clust < $fff0) - if (clust < 2) - abort(-26) ' bad cluster number") - bp := readfat(clust) - clust := brword(bp) - brwword(bp, 0) - flushifdirty - -pri datablock -' -' Calculate the block address of the current data location. -' - return (fclust << clustershift) + dataregion + ((floc >> SECTORSHIFT) & ((1 << clustershift) - 1)) - -pri uc(c) -' -' Compute the upper case version of a character. -' - if ("a" =< c and c =< "z") - return c - 32 - return c - -pri pflushbuf(r, metadata) | cluststart, newcluster, count, i -' -' Flush the current buffer, if we are open for write. This may -' allocate a new cluster if needed. If metadata is true, the -' metadata is written through to disk including any FAT cluster -' allocations and also the file size in the directory entry. -' - if (direntry == 0) - abort(-27) ' not open for writing - if (r > 0) ' must *not* allocate cluster if flushing an empty buffer - if (frem < SECTORSIZE) - ' find a new clustercould be anywhere! If possible, stay on the - ' same page used for the last cluster. - newcluster := -1 - cluststart := fclust & constant(!((SECTORSIZE >> 1) - 1)) - count := 2 - repeat - readfat(cluststart) - repeat i from 0 to constant(SECTORSIZE - 2) step 2 - if (buf2[i]==0 and buf2[i+1]==0) - newcluster := cluststart + (i >> 1) - if (newcluster => totclusters) - newcluster := -1 - quit - if (newcluster > 1) - brwword(@buf2+i, -1) - brwword(readbytec(writelink), newcluster) - writelink := fatptr + i - fclust := newcluster - frem := SECTORSIZE << clustershift - quit - else - cluststart += constant(SECTORSIZE >> 1) - if (cluststart => totclusters) - cluststart := 0 - count-- - if (count < 0) - r := -5 ' No space left on device - quit - if (frem => SECTORSIZE) - sdspi.writeblock(datablock, @buf) - if (r == SECTORSIZE) ' full buffer, clear it - floc += r - frem -= r - bufat := 0 - bufend := r - else - ' not a full blockleave pointers alone - if (r < 0 or metadata) ' update metadata even if error - readblockc(direntry >> SECTORSHIFT) ' flushes unwritten FAT too - brwlong(@buf2+(direntry & constant(SECTORSIZE-1))+28, floc+bufat) - flushifdirty - if (r < 0) - abort(r) - return r - -pub pflush -{{ -' Call flush with the current data buffer location, and the flush -' metadata flag set. -}} - return pflushbuf(bufat, 1) - -pri pfillbuf | r -' -' Get some data into an empty buffer. If no more data is available, -' return -1. Otherwise return the number of bytes read into the -' buffer. -' - if (floc => filesize) - return -1 - if (frem == 0) - fclust := nextcluster 'nächster cluster - frem := SECTORSIZE << clustershift - if (frem + floc > filesize) - frem := filesize - floc - sdspi.readblock(datablock, @buf) 'cluster einlesen - r := SECTORSIZE - if (floc + r => filesize) - r := filesize - floc - floc += r - frem -= r - bufat := 0 - bufend := r - return r - -pub pclose | r -{{ -' Flush and close the currently open file if any. Also reset the -' pointers to valid values. If there is no error, 0 will be returned. -}} - r := 0 - if (direntry) - r := pflush - bufat := 0 - bufend := 0 - filesize := 0 - floc := 0 - frem := 0 - writelink := 0 - direntry := 0 - fclust := 0 - return r - -pri pdate -{{ -' Get the current date and time, as a long, in the format required -' by FAT16. Right now it"s hardwired to return the date this -' software was created on (April 7, 2007). You can change this -' to return a valid date/time if you have access to this data in -' your setup. -}} - return constant(((2007-1980) << 25) + (1 << 21) + (7 << 16) + (4 << 11)) - -pub popen(s, mode) | i, sentinel, dirptr, freeentry -{{ -' Close any currently open file, and open a new one with the given -' file name and mode. Mode can be "r" "w" "a" or "d" (delete). -' If the file is opened successfully, 0 will be returned. If the -' file did not exist, and the mode was not "w" or "a", -1 will be -' returned. Otherwise abort will be called with a negative error -' code. -' -' s - zeiger auf string mit dateinamen -' mode - r, w, a, d -}} - pclose -' ----------------------------------------------------------- dateinamen aufbereiten - i := 0 - repeat while (i<8 and byte[s] and byte[s] <> ".") 'kopiert dateinamen ohne extender - padname[i++] := uc(byte[s++]) 'uc wandelt in kleinbuchstaben - repeat while (i<8) - padname[i++] := " " - repeat while (byte[s] and byte[s] <> ".") - s++ - if (byte[s] == ".") - s++ - repeat while (i<11 and byte[s]) - padname[i++] := uc(byte[s++]) - repeat while (i < 11) - padname[i++] := " " -' ----------------------------------------------------------- datei im verzeichnis suchen - sentinel := 0 - freeentry := 0 - repeat dirptr from rootdir to rootdirend - DIRSIZE step DIRSIZE - s := readbytec(dirptr) - if (freeentry == 0 and (byte[s] == 0 or byte[s] == $e5)) - freeentry := dirptr - if (byte[s] == 0) - sentinel := dirptr - quit - repeat i from 0 to 10 'vergleicht eintrag mit dateinamen - if (padname[i] <> byte[s][i]) 'bei gleichheit i == 11 - quit - if (i == 11 and 0 == (byte[s][$0b] & $18)) 'dateiname gefunden und kein verzeichnis/volume - fclust := brword(s+$1a) 'startcluster der datei lesen und als aktuell setzen - filesize := brlong(s+$1c) 'dateigröße der datei lesen - fsize := filesize 'dateigröße der datei lesen - - if (mode == "r") 'DATEI LESEN - frem := SECTORSIZE << clustershift - if (frem > filesize) - frem := filesize - return 0 - - if (byte[s][11] & $d9) ' datei ist schreibgeschützt - abort(-6) ' no permission to write - - if (mode == "d") 'DATEI LÖSCHEN - brwword(s, $e5) 'verzeichniseintrag als gelöscht markieren - freeclusters(fclust) 'cluster freigeben - flushifdirty - return 0 - - if (mode == "w") 'DATEI SCHREIBEN/ÜBERSCHREIBEN - brwword(s+26, -1) 'bestehende clusterreferenz ungültig machen - brwlong(s+28, 0) 'größe der neuen datei auf 0 setzen - writelink := dirptr + 26 - direntry := dirptr - freeclusters(fclust) 'bestehende clusterkette freigeben - bufend := SECTORSIZE - fclust := 0 - filesize := 0 - frem := 0 - return 0 - - elseif (mode == "a") 'DATEI ANHÄNGEN - ' this code will eventually be moved to seek - frem := filesize - freeentry := SECTORSIZE << clustershift 'freeentry = clustergröße in bytes - if (fclust => $fff0) - fclust := 0 - repeat while (frem > freeentry) 'bis zum letzten cluster springen - if (fclust < 2) - abort(-7) ' eof repeat while following chain - fclust := nextcluster 'springe zum nächsten cluster - frem -= freeentry 'berechne neue größe bis dateiende - 'in frem bleiben anzahl bytes im letzten cluster - floc := filesize & constant(!(SECTORSIZE - 1)) 'sektornummer dateiende berechnen - bufend := SECTORSIZE - bufat := frem & constant(SECTORSIZE - 1) - writelink := dirptr + 26 - direntry := dirptr - if (bufat) - sdspi.readblock(datablock, @buf) - frem := freeentry - (floc & (freeentry - 1)) - else - if (fclust < 2 or frem == freeentry) - frem := 0 - else - frem := freeentry - (floc & (freeentry - 1)) - if (fclust => 2) - followchain - return 0 - else - abort(-3) ' bad argument - -' ----------------------------------------------------------- datei nicht gefunden, neue datei erzeugen - - if (mode <> "w" and mode <> "a") - return -1 ' not found - direntry := freeentry - if (direntry == 0) - abort(-2) ' no empty directory entry - ' write (or new append): create valid directory entry - s := readbytec(direntry) - bytefill(s, 0, DIRSIZE) - bytemove(s, @padname, 11) - brwword(s+26, -1) - i := pdate - brwlong(s+$e, i) ' write create time and date - brwlong(s+$16, i) ' write last modified date and time - if (direntry == sentinel and direntry + DIRSIZE < rootdirend) - brwword(readbytec(direntry+DIRSIZE), 0) - flushifdirty - writelink := direntry + 26 - fclust := 0 - bufend := SECTORSIZE - return 0 - -pub pseek(bytenr) | freeentry,dirptr 'setzt zeiger auf position -{{ -- springt erst alle ganzen cluster weiter -- restbytes im letzten cluster werden geladen - -- code funktioniert nicht!!! -}} - -{{ - frem := bytenr - freeentry := SECTORSIZE << clustershift 'freeentry = clustergröße in bytes - if (fclust => $fff0) - fclust := 0 - repeat while (frem > freeentry) 'bis zum cluster springen - if (fclust < 2) - abort(-7) 'eof repeat while following chain - fclust := nextcluster 'springe zum nächsten cluster - frem -= freeentry 'berechne neue größe bis dateiende - 'in frem bleiben anzahl bytes im letzten cluster - floc := frem & constant(!(SECTORSIZE - 1)) 'sektornummer berechnen - bufend := SECTORSIZE - bufat := frem & constant(SECTORSIZE - 1) 'restbytes über clustergrenze berechnen - writelink := dirptr + 26 - direntry := dirptr - if (bufat) - sdspi.readblock(datablock, @buf) 'restbytes einlesen in buf - frem := freeentry - (floc & (freeentry - 1)) - else - if (fclust < 2 or frem == freeentry) - frem := 0 - else - frem := freeentry - (floc & (freeentry - 1)) - if (fclust => 2) - followchain - return 0 -}} - - -pub pread(ubuf, count) | r, t -{{ -' Read count bytes into the buffer ubuf. Returns the number of bytes -' successfully read, or a negative number if there is an error. -' The buffer may be as large as you want. -}} - r := 0 - repeat while (count > 0) - if (bufat => bufend) - t := pfillbuf - if (t =< 0) - if (r > 0) - return r - return t - t := bufend - bufat - if (t > count) - t := count - bytemove(ubuf, @buf+bufat, t) - bufat += t - r += t - ubuf += t - count -= t - return r - -pub pgetc | t -{{ -' Read and return a single character. If the end of file is -' reached, -1 will be returned. If an error occurs, a negative -' number will be returned. -}} - if (bufat => bufend) - t := pfillbuf - if (t =< 0) - return -1 - return (buf[bufat++]) - -pub pwrite(ubuf, count) | r, t -{{ -' Write count bytes from the buffer ubuf. Returns the number of bytes -' successfully written, or a negative number if there is an error. -' The buffer may be as large as you want. -}} - t := 0 - repeat while (count > 0) - if (bufat => bufend) - t := pflushbuf(bufat, 0) - t := bufend - bufat - if (t > count) - t := count - bytemove(@buf+bufat, ubuf, t) - r += t - bufat += t - ubuf += t - count -= t - return t - -pub pputc(c) -{{ -' Write a single character into the file open for write. Returns -' 0 if successful, or a negative number if some error occurred. -}} - if (bufat == SECTORSIZE) 'ist sectorende erreicht? - pflushbuf(SECTORSIZE, 0) - buf[bufat++] := c - return 0 - -pub opendir | off -{{ -' Close the currently open file, and set up the read buffer for -' calls to nextfile. -}} - pclose - off := rootdir - (dataregion << SECTORSHIFT) - fclust := off >> (clustershift + SECTORSHIFT) - floc := off - (fclust << (clustershift + SECTORSHIFT)) - frem := rootdirend - rootdir - filesize := floc + frem - return 0 - -pub nextfile(fbuf) | i, t, at, lns -{{ -' Find the next file in the root directory and extract its -' (8.3) name into fbuf. Fbuf must be sized to hold at least -' 13 characters (8 + 1 + 3 + 1). If there is no next file, -' -1 will be returned. If there is, 0 will be returned. -}} - repeat - if (bufat => bufend) - t := pfillbuf - if (t < 0) - return t - if (((floc >> SECTORSHIFT) & ((1 << clustershift) - 1)) == 0) - fclust++ - at := @buf + bufat - - if (byte[at] == 0) 'verzeichnisende erreicht - return -1 - - bufat += DIRSIZE - if (byte[at] <> $e5 and (byte[at][$0b] & $18) == 0) - fsize := brlong(at+$1c) 'dateigröße der datei lesen - fattrib := byte[at][$0b] 'attribute setzen - ftime := brlong(at+$0e) 'zeitstempel setzen - lns := fbuf - repeat i from 0 to 10 - byte[fbuf] := byte[at][i] - fbuf++ - if (byte[at][i] <> " ") - lns := fbuf - if (i == 7 or i == 10) - fbuf := lns - if (i == 7) - byte[fbuf] := "." - fbuf++ - byte[fbuf] := 0 - return 0 - -pub getfsize 'dateigröße übergeben - return fsize - -pub getfattrib 'attribute übergeben - return fattrib - -pub getftime 'zeitstempel übergeben - return ftime - - -{{ -' 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. -}} \ No newline at end of file diff --git a/flash/administra/admflash-sdspiqasm.spin b/flash/administra/admflash-sdspiqasm.spin deleted file mode 100644 index 4ffb9d19a54f3b489e742f9b95326f4f009cc34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16686 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 diff --git a/flash/administra/admflash.spin b/flash/administra/admflash.spin index 5d5f6d124d0a5620b55d1f27ac519693cb23b2cf..cd5feaf580b72a39f972676984f8e74e19f840e2 100644 GIT binary patch delta 9004 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 SJ&eW>+m?oGoBiMSbN&y2ZdFeJ delta 3741 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 NW3ZF|w)orP{|BCJ)rbH9 literal 0 HcmV?d00001 diff --git a/flash/administra/amdflash-rtc.spin b/flash/administra/amdflash-rtc.spin new file mode 100644 index 0000000000000000000000000000000000000000..8cd6854d7d4303775e76b023569e389d3d8b9ecc GIT binary patch literal 43102 zcmeI5OLHAZ700{Gj)E!{RFMUX!HLK<35g{;jsqc8vL3M#Nfwf9Cs0&MmMq&umW3q8 z7{?!o6&sd(sC)w8|Lb#)yJzlee6Jo?*3{IMW_o)1aUTCZ-RDft|Ni?Tya+!HKMp^c z2@JupsPaNOX|03KCAL#G2E#5@b|KgPe!O`_!b`TlSzJN)$;>k#Dj5n0f z5o^*AMph6N{df|#^>imAh-|>}#-YrY=(L2wZeJ4?1 zHtNQA;^w}%yC6w`>x{Q=_K_&?X7{sq?-B*pWo3Z_tFpFdDz-H?Ha5h*DSV&*n-^ZOQV=cYSs2jQgEP_7P1$pm6qPn4@uwAQK-L9Vk$Eb z#>&0e9{Ti1SIkLv&gh7kC~$m|Hr^#C3M@+&H{y!Jw>rBY-WRXW!(kNo`MF)03KMU& zvG8Sh88H!DoC&wWa=dzd8F)9mJHnGz-xVRsm2hX|a(?jxy&0|#_LRxTC?)*ohe8&@ zWv%1<^G8S5n%Ow2Y=m#Zig3953eX?a^QpMn0Z)qXuOGt1?|)#u@&?qNM)Azh4l(;aMPFEek=;B$ZKZMBv$ zYfbH-4r=6jDcUIMdR_Oi)l$k`U2o}`aw@jgQ_(2TIj`$S*^_Hg2gzln(H3t{J<3?? zm`ik{PJZ`;S0z_z;x#%2zKB#dYt?8lufE+=EAzA^<=U6c`7lyxT2>u>+iBCxsrN;s zrdb1=V+%u7)~K>CG#s!b1JTc z+tCs=8Dh<5v&~Cn*5n;Ih3ALrjd@5GW1a_UnU`ZZ&!_k4XVI@>6u8j#FCB_+`;vF4 zh~%NOn=uVUV0OdIBvG4{!^=wht$rVAG+_;KTO~XZ$5IJAYo06S1?IU*Gn&(z6C0iy z15`sNHC39ZHXH9@ElM^m9_$2{!w02 zkhu3aiAG|*Hab~HBg4cfI%#xHT6snK*^H9)=sr%lM%T%!eRVRegEd-NkMF~3kPFS1Z4cD}Ky#8tb)=Rt~F^c;i{CM+Thm*7#9+>2Xze zq3dB^4@!T3NZG@3a0cS1a^1y~bpDPi1k7I51m75Ob?6*EHTSiZbapy5$7- TSea@d>Y=?6Yf)e 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 PuT_ueUsCUa{ayYK!)rep literal 0 HcmV?d00001 diff --git a/system/regnatix/admtest.spin b/system/regnatix/admtest.spin index 4c2660876bdabec83a08cf0f2b3b226133fd6c32..69e05026623ad45042787d1c289cd7457e48c0be 100644 GIT binary patch literal 20396 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 B2Yvtm delta 63 zcmZ28pYfF`>;He%4Aqn0+Fzdh!GUYzlROU28U_W1Y=%^Z%FThCos7Z?KyD^OK0`5s Q9uSuRSp}Q7+kfQ;02AyLk^lez diff --git a/system/regnatix/ios.spin b/system/regnatix/ios.spin index 3f9a9ccc4ca3d99bb250a3fd12ee6328a177ae71..e2d6748fec577bb94ac15b334d58171ab716bb46 100644 GIT binary patch delta 1843 zcmb7FUrbwN6hAk+l(x|Bw#(%X7<#eIMqxzCgl(X#V?vyivN@H9i3{7Mv#zw=?QOR? zGG!)WvSbsEqX}`k`CyE3334BJQ!vE%NaEWPO$@v&G1>Ow6Azy6>!rQb%xIdn_d7j* ze&=_7=j)H(i(fqu7d7v$PUwbq=zs(C*-77F=)gyw`hz;8L5E40fFx*;gA|;n=M<>? z(||aA>vT5A(n5Y|?qlG|xQwdc$GcI{{Mfr+#!SFb)elh^!f>Fm<^;R}uS4mK4Z$hw z4%B(xgc0(I!BH570rG6x^$HBYF&Lur2*t!GY5-^36SQqEHYNot|k@Hm`hjpNDgXU(;)XAbS? z0TqWYj$-7Dh>_G9-qfY0Vn_EK9-NwF!y>r+4h<7JPcx|{A&z@?)NV~W* zPcteaJPipLLqQ99Ds1@Vn_h|xT9K{T5cAeVsI(P_;~S&RX*#j)wtGy_`8>QwAQD^` zI{GflP3PbpvYdkpWj)YY1J+6$?{_HpSngzu^crL@=1UXRm5r)AV@XjwgGzOnzX#kn zn++-D(c0tzFXQh=x=49W)&qXFS%<3T#-Ar8rHm{M8OoR{W11I*Lk!cwzhlyfH)cx^ zKBoOYN%L`voZviE;IT<<1Wu6DVuYl(0?GPqKQ3MoePtv$>WJ83{F0_5{AojaUL%W6 z^_cupBu9fdW*FGsG4Bg>VtdIf78kbKT>hK|du?xZl459HIGtB)_2WFx1gl@8!5Ny{ zI9W7Y-H=1uIEp@re@9?jK)z^P#h*vr))Xr0S26xB;jJ6>t{!^Q={1Gl-8q0#qxY~4 z1)mS|&Cy#W4V7oXqL}h>d@3a#JTc(i77vF^-c%&DfgXYh7on*?PrdmTpaZ<`5qJMRAoX z;TKUwvDX>{wu^1_V*A)$cvTQ;+p^SThL8MzL9Mo+;ty?&s1NPIg{)d}%l>zmH;nL8 zVXi)u&EVyTfNKx^=F*iN79kmovKyL9Za;-7yFLaoTUbIMXB0ZCYFS%^^4oZwrE>sT56|ULxLgnqG*h zy{LGj88aU`@!Mr5zI#1_nHdKzUGK(uW6!qT6{i0*9)YtZ?^=veRME?iZ^hjOsZQ8r ge^a>rwUd`$rt%9_+dUEH;BvBB=o6QBdxcitU!bnspa1{> delta 1210 zcmah|-%FEG7=DlYX0+z~G3V5ko|(o*8Jo_{qO{>Al`uggp^HLv>T0>UnL&BsZk9J) z*b9Ep9}v-nWS=kyk?11WWzV&_m0GtD9E*{n2D|Kno1RER52+2T3|RPpbu- z;1rn3apH}EBhQxK1kWjW94_u+p#luF&pl(LmL!I}6ITb!&2Fh0r~4x?O*c8<5+Q`P z@Z?7S2Xk{rNlb^tbe6<)N{pu@#v?IZB{5wBWA~QCcx8X=6=N_()h6H;)fGjyXw^36 zx68G6=^loG=NIr*x>l=Se4@96Ax2{m&7FWK!R0$vvq3Sc%G_zYJR5~cOraTFXgq|K zdel&a(QA{TpwaCPEv725#1= z->s}MQ)Xbl$|#Vn%dPASa@L3|-A47Pj@99tujT4O4O7(DIu^}%NIX`v|vH_`= zA-#}tBtK|$51O&cXHfZZrZjL$@Bp==1LQFDjDC7DRdlb(9E6%JLLZIAuNzcPNQ5n%yL=pYZuGDM;W}pkTc3pje;u zk|a41=>N)r2mg3&vJ2-pgs3>-YL;9*fcqp7pr>$97zz{oP$pptL0RlgJt8|pSs=r5AoEVNQe8~`YJI@bUI