Basic/source/Import.spin

548 lines
34 KiB
Plaintext
Raw Permalink Normal View History

2014-05-18 19:57:12 +02:00
con
{{
---------------------------------------------------------------------------------------------------------
Hive-Computer-Projekt
Name : TRIOS-Basic
Chip : Regnatix-Code
Version : 2.108
Dateien :
Beschreibung : Importmodul für Text-Dateien ->importiert ein, als Textdatei vorliegendes Basic-Programm von SD-Karte in den Speicher
Notes:
01-05-2014 -erste funktionierende Version
-um die Sache optisch besser zu gestalten, wird noch ein Hinweisfenster mit dem System-Tile-Font erstellt
-6761 Longs frei
11-05-2014 -Laderoutine durch Sicherheitsabfrage ergänzt, es wird überprüft, ob es sich bei der zu ladenden Datei um eine Textdatei handelt
-überflüssige Variablen entfernt
-PI und Wurzelzeichen in der Abfrage gültiger Zeichen hinzugefügt
-6798 Longs frei
}}
obj
ios :"reg-ios-bas"
gc :"glob-con"
con
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
version = 2.108
fEof = $FF ' dateiende-kennung
linelen = 85 ' Maximum input line length
quote = 34 ' Double quote
caseBit = !32 ' Uppercase/Lowercase bit
point = 46 ' point
STR_LEN = 34 ' Stringlänge von Stringvariablen in Arrays
FIELD_LEN = 512 ' Array-Feldgröße (max Feldgröße 8x8x8 -> Dim a(7,7,7)
DIR_ENTRY = 546 ' max.Anzahl mit DIR-Befehl gefundener Einträge
STR_MAX = 41 ' maximale Stringlänge für Printausgaben und font
DPL_CNT = 1200 ' Map-und Bildschirm-Shadow-Speicher-Zähler (40Spalten*30Zeilen=1200-Tiles)
'*****************Speicherbereiche**********************************************
maxstack = 20 ' Maximum stack tiefe fuer gosub
userPtr = $1FFFF ' Ende Programmspeicher 128kb
TMP_RAM = $20000 '....$3FFFF ' Bearbeitungsspeicher 128kb (fuer die Zeileneditierung bzw.Einfuegung von Zeilen)
TILE_RAM = $40000 '....$667FF ' hier beginnt der Tile-Speicher fuer 14 Tiledateien
SYS_FONT = $66800 '....$693FF ' ab hier liegt der System-Font 11kb
MOUSE_RAM = $69400 '....$6943F ' User-Mouse-Pointer 64byte
DIR_RAM = $69440 '....$6AFFF ' Puffer fuer Dateinamen 7103Bytes fuer 546 Dateinamen
VAR_RAM = $6B000 '....$77FFF ' Variablen-Speicher fuer Array-Variablen a[0...511]-z[0...511] (13312 moegliche Variablen)
MAP_RAM = $78000 '....$79C27 ' Shadow-Display (Pseudo-Kopie des Bildschirmspeichers)
'FREI_RAM $79C28 .... $79FFF ' freier RAM-Bereich 984 Bytes auch für Shadow-Display
DATA_RAM = $7A000 '.... $7DFFF ' 16kB DATA-Speicher
BUTT_RAM = $7E000 '.... $7E4FF ' ca.1kB Button Puffer
WTILE_RAM= $7E500 '.... $7E5FF ' Win-Tile Puffer hier können die Tiles, aus denen die Fenster gebaut werden geändert werden
FUNC_RAM = $7E600 '.... $7EFFF ' Funktions-Speicher, hier werden die selbstdefinierten Funktionen gespeichert
ERROR_RAM = $7F000 '....$7FAFF ' ERROR-Texte
DIM_VAR = $7FB00 '....$7FBFF ' Variablen-Array-Dimensionstabelle
DIM_STR = $7FC00 '....$7FCFF ' String-Array-Dimensionstabelle
BACK_RAM = $7FD00 '....$7FDFF ' BACKUP RAM-Bereich 256 Bytes für Ladebalken
'Frei-Ram = $7FE00 ....$7FEFF ' noch freier Bereich 256 Bytes
PMARK_RAM = $7FFF0 ' Flag für Reclaim Wert= 161
BMARK_RAM = $7FFF1 ' Flag für Basic-Warm-Start Wert= 121
SMARK_RAM = $7FFF2 ' Flag für übergebenen Startparameter Wert = 222
STR_ARRAY = $80000 '....$EE7FF ' Stringarray-Speicher
USER_RAM = $EE800 '....$FFEFF ' Freier Ram-Bereich, für Anwender, Backup-Funktion usw.
ADM_SPEC = gc#A_FAT|gc#A_LDR|gc#A_SID|gc#A_LAN|gc#A_RTC|gc#A_PLX'%00000000_00000000_00000000_11110011
'***************** Button-Anzahl ************************************************
BUTTON_CNT = 32 'Anzahl der möglichen Button
'******************Farben ********************************************************
#$FC, Light_Grey, #$A8, Grey, #$54, Dark_Grey
#$C0, Light_Red, #$80, Red, #$40, Dark_Red
#$30, Light_Green, #$20, Green, #$10, Dark_Green
#$1F, Light_Blue, #$09, Blue, #$04, Dark_Blue
#$F0, Light_Orange, #$E6, Orange, #$92, Dark_Orange
#$CC, Light_Purple, #$88, Purple, #$44, Dark_Purple
#$3C, Light_Teal, #$28, Teal, #$14, Dark_Teal
#$FF, White, #$00, Black
'*****************Tastencodes*****************************************************
ENTF_KEY = 186
bspKey = $C8 ' PS/2 keyboard backspace key
breakKey = $CB ' PS/2 keyboard escape key
fReturn = 13
fLinefeed = 10
KEY_LEFT = 2
KEY_RIGHT = 3
KEY_UP = 4
KEY_DOWN = 5
MIN_EXP = -999999
MAX_EXP = 999999
var
long tp, nextlineloc 'Kommandozeile,Zeilenadresse
long speicheranfang,speicherende 'Startadresse-und Endadresse des Basic-Programms
byte tline[linelen] 'Eingabezeilen-Puffer
dat
tok0 byte "IF",0 '128 getestet
tok1 byte "THEN",0 '129 getestet
tok110 byte "ELSE",0 '238 getestet
tok2 byte "INPUT",0 ' INPUT {"<prompt>";} <var> {,<var>} '130 getestet
tok3 byte "PRINT",0 ' PRINT '131 getestet
tok88 byte "ON",0 ' ON GOSUB GOTO 216 getestet
tok4 byte "GOTO",0 '132 getestet
tok5 byte "GOSUB", 0 '133 getestet
tok6 byte "RETURN", 0 '134 getestet
tok7 byte "REM", 0 '135 getestet
tok8 byte "NEW", 0 '136 getestet
tok9 byte "LIST", 0 'list <expr>,<expr> listet von bis zeilennummer 137 getestet NICHT AENDERN Funktionstaste!!
tok10 byte "RUN", 0 '138 getestet NICHT AENDERN Funktionstaste!!
tok26 byte "FOR", 0 ' FOR <var> = <expr> TO <expr> 154 getestet
tok27 byte "TO", 0 '155 getestet
tok28 byte "STEP", 0 ' optional STEP <expr> 156 getestet
tok29 byte "NEXT", 0 ' NEXT <var> 157 getestet
tok52 byte "END", 0 ' 180 getestet
tok53 byte "PAUSE", 0 ' PAUSE <time ms> {,<time us>} 181 getestet
tok58 byte "DUMP", 0 ' DUMP <startadress>,<anzahl zeilen>,<0..1> (0 Hram,1 Eram) 186 getestet
tok86 byte "BYE",0 ' Basic beenden 214 getestet NICHT AENDERN Funktionstaste!!
tok84 byte "INKEY",0 'Auf Tastendruck warten Rueckgabe ascii wert 212 getestet
tok85 byte "CLEAR",0 'alle Variablen loeschen 213 getestet
tok87 byte "PEEK",0 'Byte aus Speicher lesen momentan nur eram 215 getestet
tok80 byte "POKE",0 'Byte in Speicher schreiben momentan nur eram 208 getestet
tok89 byte "BEEP",0 'beep oder beep <expr> piepser in versch.Tonhoehen 217 getestet
tok92 byte "EDIT",0 'Zeile editieren 220 getestet
tok61 byte "RENUM",0 'Renumberfunktion 189 getestet
'************************** Dateioperationen **************************************************************
tok12 byte "OPEN", 0 ' OPEN " <file> ",<mode> 140 getestet
tok13 byte "FREAD", 0 ' FREAD <var> {,<var>} 141 getestet
tok14 byte "WRITE", 0 ' WRITE <"text"> : 142 getestet
tok15 byte "CLOSE", 0 ' CLOSE 143 getestet
tok16 byte "DEL", 0 ' DELETE " <file> " 144 getestet
tok17 byte "REN", 0 ' RENAME " <file> "," <file> " 145 getestet
tok102 byte "CHDIR",0 ' Verzeichnis wechseln 230 getestet kann nicht CD heissen, kollidiert sonst mit Hex-Zahlen-Auswertung in getanynumber
tok18 byte "DIR", 0 ' dir anzeige 146 getestet NICHT AENDERN Funktionstaste!!
tok19 byte "SAVE", 0 ' SAVE or SAVE [<expr>] or SAVE "<file>" 147 getestet NICHT AENDERN Funktionstaste!!
tok20 byte "LOAD", 0 ' LOAD or LOAD [<expr>] or LOAD "<file>" ,{<expr>} 148 getestet NICHT AENDERN Funktionstaste!!
tok54 byte "FILE", 0 ' FILE wert aus datei lesen oder in Datei schreiben 182 getestet
tok24 byte "GFILE",0 ' GETFILE rueckgabe der mit Dir gefundenen Dateien ,Dateinamen 152 getestet
tok78 byte "MKDIR",0 ' Verzeichnis erstellen 206 getestet
tok112 byte "GATTR",0 ' Dateiattribute auslesen 240 getestet
tok90 byte "BLOAD",0 'Bin Datei laden 218 getestet
tok57 byte "MKFILE", 0 'Datei erzeugen 185 getestet
'************************* logische Operatoren **********************************************************************
tok21 byte "NOT" ,0 ' NOT <logical> '139 getestet
tok22 byte "AND" ,0 ' <logical> AND <logical> '150 getestet
tok23 byte "OR", 0 ' <logical> OR <logical> '151 getestet
'************************* mathematische Funktionen *****************************************************************
tok106 byte "FN",0 'Mathematische funktionen 234 getestet
' ^,!,//, Sin,Cos,Tan,ArcTan,Ln,e,EXP,Round,Min,Max,Log
'Wurzel, Fraction,Int,Floor,Ceil,SHL;SHR;REV;ROR;ROL;ODER;XODER,UND
tok11 byte "RND", 0 'Zufallszahl von x '139 getestet
tok83 byte "FUNC",0 'mathematische Benutzerfunktionen 211 getestet
'******************************** Mouse Befehle *********************************************************************
tok93 byte "MGET",0 'Mouse-xyz-position ' 221 getestet
tok97 byte "MB",0 'Mouse-Button ' 225 getestet
tok63 byte "MOUSE",0 'Mouse on off Mouse on,farbe ' 191 getestet
tok96 byte "MBOUND",0 'Mouse-Bereich definieren ' 224 getestet
'************************* Bildschirmbefehle ***********************************************************************
tok59 byte "COL",0 'Farbe setzen 1,2,3 Vordergrund,hintergrund,Cursor 187 getestet
tok60 byte "CLS",0 'Bildschirm loeschen cursor oberste Zeile Pos1 188 getestet
tok62 byte "POS",0 'Cursor an Pos x,y setzen -> Locate(x,y) 190 getestet
tok64 byte "PLOT",0 'Pixel setzen 192 getestet
tok66 byte "SCRDN",0 'n Zeilen runterscrollen -> Scrdown(n) 194 getestet
tok67 byte "SCRUP",0 'n Zeilen hochscrollen -> Scrup(n) 195 getestet
tok68 byte "CROFF",0 'Cursor ausschalten 196 getestet
tok69 byte "CRON",0 'Cursor einschalten 197 getestet
tok39 byte "WIN", 0 'Fenster C,T,S,R erstellen 167 getestet
tok49 byte "FREE",0 'freien Speicher anzeigen 177 getestet
tok74 byte "BUTTON",0 'Button erzeugen 202 getestet
tok98 byte "FRAME",0 'Rahmen zeichnen 226 getestet
tok99 byte "WSET",0 'in ein zuvor definiertes Fenster springen 227 getestet
tok101 byte "SCROLL",0 'Textzeile nach links scrollen 229 getestet
tok81 byte "CIRC",0 'Kreis zeichnen 209 getestet
tok82 byte "LINE",0 'Linie zeichnen 210 getestet
tok103 byte "BOX",0 '2dbox zeichnen 231 getestet
tok118 byte "GETX",0 'Cursor X-Position lesen 246 getestet
tok119 byte "GETY",0 'Cursor Y-Position lesen 247 getestet
tok122 byte "HEX",0 'Ausgabe von Hex-Zahlen mit Print ' 250 getestet
tok120 byte "BIN",0 'Ausgabe von Binärzahlen mit Print ' 248 getestet
tok125 byte "VER",0 'Versionsanzeige ' 253 getestet
tok123 byte "BACKUP", 0 'Bildschirmbereich sichern ' 251 getestet
tok124 byte "RECOVER",0 'Bildschirmbereich restaurieren ' 252 getestet
'************************* Datum und Zeit funktionen ***************************************************************
tok70 byte "STIME",0 'Stunde:Minute:Sekunde setzen -> 198 getestet
tok71 byte "SDATE",0 'Datum setzen 199 getestet
tok76 byte "GTIME",0 'Zeit abfragen 204 getestet
tok77 byte "GDATE",0 'Datum abfragen 205 getestet
tok65 byte "TIME",0 'Zeit anzeigen 193 getestet
tok111 byte "TIMER",0 'Timer-Funktionen set,read,clear?,entry,delete 239 getestet
'**************************** STRINGFUNKTIONEN ********************************************************************
tok35 byte "STR$", 0 'l,m,r,g,k left, mid, right ,groß,klein 163 getestet
tok36 byte "COMP$", 0 'Stringvergleich 164 getestet
tok37 byte "LEN", 0 'Stringlänge zurueckgeben 165 getestet
tok48 byte "CHR$", 0 'CHR$(expr) 176 getestet
tok105 byte "ASC",0 'ASCII-Wert einer Stringvariablen zurueckgeben 233 getestet
tok56 byte "TAB", 0 'Tabulator setzen 184 getestet
tok113 byte "VAL",0 'String in FLOAT-Zahlenwert umwandeln 241 getestet
tok108 byte "STRING$",0 'Zeichenwiederholung 236 getestet
tok109 byte "DIM",0 'Stringarray dimensionieren 237 getestet
tok116 byte "INSTR",0 'Zeichenkette in einer anderen Zeichenkette suchen ' 244 getestet
'**************************** Grafik-Tile-Befehle *****************************************************************
tok34 byte "TLOAD", 0 'Tileset in eram laden 162 getestet
tok51 byte "TILE", 0 'Tileblock aus aktuellem Tileset anzeigen 179 getestet
tok50 byte "STILE", 0 'tileset in bella laden 178 getestet
tok100 byte "TPIC",0 'komplettes Tileset als Bild anzeigen 228 getestet
tok104 byte "FONT",0 'Text mit aktuellem Tileset als Font ausgeben 232 getestet
tok25 byte "MAP", 0 'MAP-Befehle L=load,S=Save,D=Display,W=Write in Ram ' 153 getestet
tok91 byte "PLAYER",0 'Spielerfigur-Parameter p,k,g(parameter,Keys,collision,get) 219 getestet
tok114 byte "PLAYXY",0 'Spielerbewegung 242 getestet
tok121 byte "SPRITE",0 'Sprite-Parameter p, m, s(parameter, move,speed,usw) 249 getestet
'**************************** Daten-Befehle *****************************************************************
tok38 byte "READ", 0 'Data Lesen '166 getestet
tok40 byte "DATA", 0 'Data-Anweisung '168 getestet
tok47 byte "RESTORE", 0 'Data-Zeiger zurücksetzen 175 getestet
'**************************** Funktionen der seriellen Schnittstelle **********************************************
tok115 byte "COM",0 'serielle Schnittstelle öffnen / schliessen 243 getestet
'***********************SID-Synth-Befehle**************************************************************************
tok30 byte "SID", 0 'SID_Soundbefehle 158 getestet
tok31 byte "PLAY", 0 'SID DMP-Player '159
tok32 byte "GDMP", 0 'SID DMP-Player-Position '160
'************************ Port-Funktionen *************************************************************************
tok79 byte "PORT",0 ' Port-Funktionen Port s,i,o,p 207 getestet
tok55 byte "JOY",0 ' Joystick abfragen für 2 Joysticks 183 getestet
tok117 byte "XBUS",0 ' direkte Bus-Kommunikation zu den Props 245 getestet
'************************ ende Basic-Befehle **********************************************************************
'************************ Befehle in der Testphase ****************************************************************
'******************************************************************************************************************
'******************************* freie Befehle für Erweiterungen **************************************************
tok33 byte "BFC", 0 '161
tok41 byte "BFD", 0 '169
tok42 byte "BFE", 0 '170
tok43 byte "BFH", 0 '171
tok44 byte "BFI", 0 '172
tok45 byte "BFJ", 0 '173
tok46 byte "BFK", 0 '174
tok72 byte "BFL",0 '200
tok73 byte "BFM",0 '201
tok75 byte "BFN",0 '203
tok94 byte "LAN",0 ' 222
tok95 byte "BF1",0 ' 223
tok107 byte"BFF",0 '235
tok126 byte"BFG",0 '254
' ---------------------------- Mehr Befehle sind nicht möglich --------------------------
'******************************************************************************************************************
toks word @tok0, @tok1, @tok2, @tok3, @tok4, @tok5, @tok6, @tok7
word @tok8, @tok9, @tok10, @tok11, @tok12, @tok13, @tok14, @tok15
word @tok16, @tok17, @tok18, @tok19, @tok20, @tok21, @tok22, @tok23
word @tok24, @tok25, @tok26, @tok27, @tok28, @tok29, @tok30, @tok31
word @tok32, @tok33, @tok34, @tok35, @tok36, @tok37, @tok38, @tok39
word @tok40, @tok41, @tok42, @tok43, @tok44, @tok45, @tok46, @tok47
word @tok48, @tok49, @tok50, @tok51, @tok52, @tok53, @tok54, @tok55
word @tok56, @tok57, @tok58, @tok59, @tok60, @tok61, @tok62, @tok63
word @tok64, @tok65, @tok66, @tok67, @tok68, @tok69, @tok70, @tok71
word @tok72, @tok73, @tok74, @tok75, @tok76, @tok77, @tok78, @tok79
word @tok80, @tok81, @tok82, @tok83, @tok84, @tok85, @tok86, @tok87
word @tok88, @tok89, @tok90, @tok91, @tok92, @tok93, @tok94, @tok95
word @tok96, @tok97, @tok98, @tok99, @tok100, @tok101, @tok102,@tok103
word @tok104, @tok105, @tok106, @tok107, @tok108, @tok109, @tok110
word @tok111, @tok112, @tok113, @tok114, @tok115, @tok116, @tok117
word @tok118, @tok119, @tok120, @tok121, @tok122, @tok123, @tok124
word @tok125, @tok126
tokx word
dat
BASIC byte "BASIC.BIN",0
pub main
ios.start
speicheranfang:=$0 'Programmspeicher beginnt ab adresse 0 im eRam
speicherende:=$2 'Programmende-marke
ios.printCursorRate(0)
read_filename
' ios.print(@tline)
ios.sdmount
ios.sdopen("R",@tline)
processload
ios.sdclose
ios.sdopen("r",@basic)
ios.ldbin(@basic)
ios.sdclose
ios.printcursorrate(3)
ios.stop
pri read_filename|i,adr
adr:=ios#PARAM
i:=0
repeat while tline[i++]:=ios.ram_rdbyte(adr++)
tline[i]:=0
PRI processLoad | a,b,c,e',pr
ios.Backup_Area(0,29,39,29,BACK_RAM) 'Backup_Area(x,y,xx,yy,adr) Backup der untersten Zeile
b:=0
e:=ios.sdfattrib(0)
repeat
a := 0
repeat
c := ios.sdgetc
'############### Überprüfung auf gültige Zeichen ###############
if (c<32 or c>125) and not c==13 and not c==10 and not c==17 and not c==21
ios.ram_wrbyte(0,PMARK_RAM)
ios.print(string("Wrong Fileformat!"))
ios.sid_beep(0)
return
'###############################################################
b++
if c == fReturn or b==e 'c==ios.sdeof sdeof funktioniert nicht so richtig
tline[a] := 0
tp := @tline
quit
elseif c == fLinefeed
next
elseif c < 0
quit
elseif a < linelen-1
tline[a++] := c
if b==e and tline[a] == 0 'c==ios.sdeof sdeof funktioniert nicht so richtig
quit
if c < 0
ios.ram_wrbyte(0,PMARK_RAM)
ios.print(string("Error while loading file!"))
ios.sid_beep(0)
return
tp := @tline
a := spaces
if a=>"0" and a =< "9"
percent(b,e) 'Ladeanzeige ->Fortschritts-Balken
writeram 'normaler Programmload
Prg_End_Pos
else
if a <> 0
ios.ram_wrbyte(0,PMARK_RAM)
ios.print(string("Missing Linenumber!"))
ios.sid_beep(0)
return
ios.Restore_Area(0,29,39,29,BACK_RAM) 'unterste Zeile wiederherstellen
RAM_CLEAR 'Programmspeicher hinter dem Programm loeschen
ios.printnl
PRI percent(b,e)|block 'Fortschrittsbalken am unteren Bildschirmrand zeichnen
block:=e/40 'daten pro block
result:=b/block
if result>39
result:=39 'nicht weiter, als bis Spalte 39
ios.Plot_Line(0, 29, result, 29,0)
pri binsave|datadresse,count
datadresse:= 0
count:=speicherende-2
ios.sdxputblk(datadresse,count)
ios.sdclose
PRI writeendekennung(adr)
ios.ram_wrword($FFFF,adr) 'Programmendekennung schreiben
speicherende:=adr+2 'neues Speicherende
PRI Prg_End_Pos 'letztes Zeichen der letzten Zeile (Programmende)
nextlineloc := speicherende - 2
PRI findline(lineno):at
at := speicheranfang
repeat while ios.ram_rdword(at) < lineno and at < speicherende-2 'Zeilennummer
at:=ios.ram_keep(at+2)'+1 'zur nächsten zeile springen
PRI eram_rw(beginn,adr)|temp,zaehler
'******************** Bereich nach der bearbeiteten Zeile in Bearbeitungsspeicher verschieben **************************
temp:=TMP_RAM 'Anfang Bearbeitungsbereich
zaehler:=speicherende-2-adr
if adr<speicherende-2
ios.ram_copy(adr,TMP_RAM,zaehler)
'******************** Bereich aus dem Bearbeitungsspeicher wieder in den Programmspeicher verschieben ******************
if zaehler>0 'wenn nicht die letzte Zeile
ios.ram_copy(TMP_RAM,beginn,zaehler)
writeendekennung(beginn+zaehler)
PRI einfuegen(adr,diff,mode)|anfang
'*********************** aendern und einfuegen von Zeilen funktioniert*************************************************
anfang:=adr
if mode>0
adr:=ios.ram_keep(adr+2) 'eigentliche Zeile beginnt nach der Adresse
'****** letzte Zeile? *************
if ios.ram_rdword(adr)==$FFFF 'Ueberpruefung, ob es die letzte Zeile ist
if mode==2 'Zeile loeschen
writeendekennung(anfang) 'an alte Adresse Speicherendekennung schreiben
return 'und raus
'*********************************
eram_rw(anfang+diff,adr) 'schreibe geaenderten Bereich neu
PRI insertline2 | lineno, fc, loc, locat, newlen, neuesende
lineno := parseliteral
neuesende:=0 'Marker, das Programmende schon geschrieben wurde auf null setzen
if lineno < 0 or lineno => 65535 'Ueberpruefung auf gueltige Zeilennummer
ios.sdclose
'errortext(2,1)'@ln
tokenize 'erstes Zeichen nach der Zeilennummer ist immer ein Token, diesen lesen
fc := spaces 'Zeichen nach dem Token lesen
loc := findline(lineno) 'adresse der basic-zeile im eram, die gesucht wird
locat := ios.ram_rdword(loc) 'zeilennummer holen
newlen := strsize(tp)+1 'laenge neue zeile im speicher 1 fuer token + laenge des restes (alles was nach dem befehl steht)
if locat == lineno 'zeilennummer existiert schon
if fc == 0 'zeile loeschen
einfuegen(loc,0,2) 'Zeile hat null-laenge also loeschen
neuesende:=1 'Marker, das Programmende schon geschrieben wurde
else 'zeile aendern
einfuegen(loc,newlen+2,1) 'platz fuer geaenderte Zeile schaffen +2 fuer Zeilennummer wenn es nicht die letzte Zeile ist sonst muss die 2 weg
neuesende:=1 'Marker, das Programmende schon geschrieben wurde
if fc 'zeilennummer existiert noch nicht
if locat <65535 and locat > lineno 'Zeile einfuegen zwischen zwei Zeilen
einfuegen(loc,newlen+2,0) 'Platz fuer neue Zeile schaffen
neuesende:=1 'Marker, das Programmende schon geschrieben wurde
ios.ram_wrword(lineno,loc) 'Zeilennummer schreiben
loc+=2
repeat newlen
ios.ram_wrbyte(byte[tp++],loc++) 'neue Zeile schreiben entweder ans ende(neuesende=0) oder in die lücke (neuesende=1)
if neuesende==0 'Marker, das Programmende noch nicht geschrieben wurde (zBsp.letzte Zeile ist neu)
writeendekennung(loc) 'Programmendekennung schreiben
RAM_CLEAR 'Programmspeicher hinter dem Programm loeschen
PRI writeram | lineno
lineno := parseliteral
if lineno < 0 or lineno => 65535
ios.sdclose
'errortext(2,1)'@ln
tokenize
ios.ram_wrword(lineno,nextlineloc) 'zeilennummer schreiben
nextlineloc+=2
skipspaces 'leerzeichen nach der Zeilennummer ueberspringen
repeat strsize(tp)+1
ios.ram_wrbyte(byte[tp++],nextlineloc++) 'Zeile in den Programmspeicher uebernehmen
writeendekennung(nextlineloc) 'Programmende setzen
PRI tokenize | tok, c, at, put, state, i, j, ntoks
ntoks :=Get_toks 'anzahl token
at := tp
put := tp
state := 0
repeat while c := byte[at] 'solange Zeichen da sind schleife ausführen
if c == quote 'text in Anführungszeichen wird ignoriert
if state == "Q" 'zweites Anführungszeichen also weiter
state := 0
elseif state == 0
state := "Q" 'erstes Anführungszeichen
if state == 0 'keine Anführungszeichen mehr, also text untersuchen
repeat i from 0 to ntoks-1 'alle Kommandos abklappern
tok := @@toks[i] '@token' 'Kommandonamen einlesen
j := 0
repeat while byte[tok] and ((byte[tok] ^ byte[j+at]) & caseBit) == 0'zeichen werden in Grossbuchstaben konvertiert und verglichen solange 0 dann gleich
j++
tok++
if byte[tok] == 0 and not isvar(byte[j+at]) 'Kommando keine Variable?
byte[put++] := 128 + i 'dann wird der Token erzeugt
at += j
if i == 7 'REM Befehl
state := "R"
else
repeat while byte[at] == " "
at++
state := "F"
quit
if state == "F"
state := 0
else
byte[put++] := byte[at++]
else
byte[put++] := byte[at++]
byte[put] := 0 'Zeile abschliessen
pri Get_toks 'Tokenanzahl ermitteln
result:=(@tokx - @toks) / 2
PRI spaces | c
'einzelnes zeichen lesen
repeat
c := byte[tp]
if c==21 or c==17 'Wurzelzeichen und Pi-Zeichen
return c
if c == 0 or c > " "
return c
tp++
PRI skipspaces
if byte[tp]
tp++
return spaces
PRI parseliteral | r, c 'extrahiere Zahlen aus der Basiczeile
r := 0
repeat
c := byte[tp]
if c < "0" or c > "9"
return r
r := r * 10 + c - "0"
tp++
PRI fixvar(c) 'wandelt variablennamen in Zahl um (z.Bsp. a -> 0)
if c => "a"
c -= 32
return c - "A"
PRI isvar(c) 'Ueberpruefung ob Variable im gueltigen Bereich
c := fixvar(c)
return c => 0 and c < 26
PRI RAM_CLEAR
ios.ram_fill(speicherende,$20000-speicherende,0) 'Programmspeicher hinter dem Programm loeschen