/
Basic3_5.spin
3861 lines (3332 loc) · 195 KB
/
Basic3_5.spin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{{ ---------------------------------------------------------------------------------------------------------
Hive-Computer-Projekt
Name : TRIOS-Basic
Chip : Regnatix-Code
Version : 3.5
Dateien :
Beschreibung : Modifiziertes, stark erweitertes FemtoBasic für den Hive.
Eigenschaften : -Benutzung externer Ram, Stringverarbeitung, Array-Verwaltung
-Gleitkommafuktion, Tile-Grafikunterstützung
-SID-Sound-Unterstützung
-3 Grafik-Modi
-0=64-Farb-VGA-Treiber;
-1=320x256 Pixel 31-Vordergrund und 8 Hintergrundfarben;
-2=160x120 Pixel 64 Farben pro Pixel
-Maus-Unterstützung, Button-Verwaltung
-Fensterverwaltung
-durch Tile-Fonts, verschiedene Schriftarten und Fensterstile
-bewegte Tile-Sprites
-lange Variablennamen
-dynamische Variablen-Verwaltung
-Pixelgrafik im Modus 1 und 2
Logbuch :
'############################################################ Version 3.5 ######################################################################################################
07-01-2021 -Nach langer Zeit geht es wieder weiter
-den Befehl BMP mit den Parametern W (E-Ram-Bilddaten auf SD schreiben) und R (E-Ram-Bilddaten von SD lesen erweitert
-damit können im Mode4 Bilder schneller geladen werden, da die Bilddaten nicht mehr konvertiert werden müssen
-somit sinkt die Ladezeit auf ca.4 Sekunden (statt über 30 sek.)
-600 Longs frei
13-01-2021 -einige Optimierungen durchgeführt
-Grafiktreiber über clob-con mit Flash-Variante in Einklang gebracht, jetzt sind beide Varianten von der gleichen glob-con abhängig
-Venatrix-Funktionen entfernt - kein Interesse - mehr Platz
-650 Longs frei
14-01-2021 -Grafikmodus 2 und 3 entfernt - kaum sinnvolle Nutzung (manchmal ist weniger mehr)
-671 Longs frei
22-01-2021 -Routine READ_PARAMETER deaktiviert, war wohl mal als Batchfunktion gedacht um Basic mit Startbefehlen zu starten (Basic Befehlszeile...)
-machte Probleme, wenn keine oder falsche Werte im Ram standen
-dadurch wieder etwas Platz gespart
-705 Longs frei
19-02-2021 -Dump-Befehl nur Hub und E-Ram, das reicht
-710 Longs frei
01-04-2021 -Fehler in FOR-NEXT - Befehl ->Variablen waren zu klein dimensioniert -> in den E-Ram verschoben, dadurch wieder etwas Platz gewonnen
-Fehler wurde bei der Arbeit am Tiny-Basic entdeckt und von dort übernommen
-815 Longs frei
09-04-2021 -Fehler in REM-Befehl behoben -> wurde bei PRINT als Fehler behandelt
-814 Longs frei
--------------------------------------------------------------------------------------------------------- }}
obj
ios :"reg-ios-bas"
FS :"BasFloatString2"
TMRS :"timer"
Fl :"BasF32.spin"
gc :"glob-con"
con
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
version = 3.5
fEof = $FF ' dateiende-kennung
linelen = 85 ' Maximum input line length
quote = 34 ' Double quote
caseBit = !32 ' Uppercase/Lowercase bit
point = 46 ' point
FIELD_LEN = 64000 ' Array-Feldgröße (max Feldgröße 40x40x40 -> Dim a(39,39,39)
DIR_ENTRY = 546 ' max.Anzahl mit DIR-Befehl gefundener Einträge
STR_MAX = linelen ' maximale Stringlänge für Printausgaben und Rom
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(Modus0) oder 8 BMP-Bilder(Modus4)
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
MAP_RAM = $6B000 '....$6CC27 ' Shadow-Display (Pseudo-Kopie des Bildschirmspeichers)
FOR_LOOP = $6D000 '.... $6DFFF ' For-Loop Speicher
FOR_STEP = $6E000 '.... $6EFFF ' FOR-Step Speicher
FOR_LIMIT = $6F000 '.... $6FFFF ' FOR-Limit Speicher
'FREI_RAM $70000 .... $7A3FF ' freier RAM-Bereich A3FF 41983 Bytes (42kB)
DATA_RAM = $7A400 '.... $7E3FF ' 16kB DATA-Speicher
BUTT_RAM = $7E400 '.... $7E8FF ' ca.1kB Button Puffer
WTILE_RAM= $7E900 '.... $7E9FF ' Win-Tile Puffer hier können die Tiles, aus denen die Fenster gebaut werden geändert werden
FUNC_RAM = $7EA00 '.... $7F3FF ' Funktions-Speicher, hier werden die selbstdefinierten Funktionen gespeichert
ERROR_RAM = $7F400 '....$7FEFF ' ERROR-Texte
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Ó
MMARK_RAM = $7FFF3 ' Flag für Grafikmode
STR_ARRAY = $80000 '....$EE7FF ' Variablen und Stringarray-Speicher
USER_RAM = $EE800 '....$FAFFF ' Freier Ram-Bereich, für Anwender, Backup-Funktion usw. 51200Bytes 50kb
VAR_TBL = $FB000 '....$FCFFF ' Variablen-Tabelle
STR_TBL = $FD000 '....$FEFFF ' String-Tabelle
ADM_SPEC = gc#A_FAT|gc#A_LDR|gc#A_SID|gc#A_RTC|gc#A_PLX'%00000000_00000000_00000000_11110011
'***************** Button-Anzahl ************************************************
BUTTON_CNT = 32 'Anzahl der möglichen Button
'******************Farben Mode0,2,3,4 *******************************************
#$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
'Farben im Mode1
{
Vordergrundfarben
0-schwarz
1-dunkelblau
2-dunkelgruen
3-blau
4-Gruen
5-hellblau
6-hellgruen
7-Türkis
8-rot
9-lila
10-orange
11-pink
12-teal
13-hellgrau
14-gelbgruen
15-blaugruen
Hintergrundfarben
1-Blau
2-Gruen
3-Türkis
4-rot
5-Lila
6-Gelb
7-Weiß
}
'*****************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 = -99999
MAX_EXP = 999999
set_x =gc#BEL_DPL_SETX
Cursor_set =gc#BEL_CURSORRATE
Del_button =gc#BEL_ERS_3DBUTTON'19
Thirdcolor =gc#BEL_THIRDCOLOR'28
Print_Window =gc#BEL_DPL_WIN'33
SPEED =gc#BEL_SPRITE_SPEED'48
MOVE =gc#BEL_SPRITE_MOVE'47
_Line =gc#BEL_DPL_LINE
_Circ =gc#BEL_DPL_CIRCLE
_Rect =gc#BEL_RECT
' _IMPORT =72'8 '(Speicherstelle im Flashrom der IMPORT-DLL)
' _EXPORT =73'9 '(Speicherstelle im Flashrom der Export-Dll)
var
long sp, tp, nextlineloc, rv, curlineno, pauseTime 'Goto,Gosub-Zähler,Kommandozeile,Zeilenadresse,Random-Zahl,aktuelle Zeilennummer, Pausezeit
long stack[maxstack],speicheranfang,speicherende 'Gosub,Goto-Puffer,Startadresse-und Endadresse des Basic-Programms
' long forStep[26], forLimit[26], forLoop[26] 'Puffer für For-Next Schleifen
long prm[10] 'Befehlszeilen-Parameter-Feld (hier werden die Parameter der einzelnen Befehle eingelesen)
long gototemp,gotobuffer,gosubtemp,gosubbuffer 'Gotopuffer um zu verhindern das bei Schleifen immer der Gesamte Programmspeicher nach der Zeilennummer durchsucht werden muss
long datapointer 'aktueller Datapointer
long restorepointer 'Zeiger für den Beginn des aktuellen DATA-Bereiches
long usermarker,basicmarker 'Dir-Marker-Puffer für Datei-und Verzeichnis-Operationen
long tp_back 'sicherheitskopie von tp ->für Input
long Var_Neu_Platz 'nächste freie Variablen-Adresse
word tilecounter 'Zaehler fuer Anzahl der Tiles in einer Map
word filenumber 'Anzahl der mit Dir gefundenen Dateien
word VAR_NR 'Variablenzähler
word STR_NR 'Stringzähler
byte var_arr[3] 'temp array speicher varis-funktion für direkten Zugriff
byte var_tmp[3] 'temp array speicher varis-funktion für zweite Variable (in pri factor) um Rechenoperationen u.a. auszuführen
byte var_temp[3] 'temp array speicher erst mit dem dritten Speicher funktioniert die Arrayverwaltung korrekt
byte prm_typ[10] 'parametertyp variable oder string
byte workdir[12] 'aktuelles Verzeichnis
byte fileOpened,tline[linelen]',tline_back[linelen] 'File-Open-Marker,Eingabezeilen-Puffer,Sicherheitskopie für tline ->Input-Befehl
byte debug 'debugmodus Tron/Troff
byte cursor 'cursor on/off
byte win 'Fensternummer
byte farbe,hintergr 'vorder,hintergrundfarbe
byte file1[12],dzeilen,xz,yz,buff[8],modus 'Dir-Befehl-variablen extension[12]
byte volume,play 'sidcog-variablen
byte xtiles[16] 'xtiles fuer tilenr der Tile-Dateien '
byte ytiles[16] 'ytiles fuer tilenr der Tile-Dateien
byte str0[STR_MAX],strtmp[STR_MAX] 'String fuer Fontfunktion in Fenstern
byte aktuellestileset 'nummer des aktuellen tilesets
byte font[STR_MAX] 'Stringpuffer fuer Font-Funktion und str$-funktion
byte mapram 'Map-Schreibmarker
byte ongosub 'on gosub variable
byte actionkey[5] 'Belegung der Spielertasten -> nach Bella verschoben
byte item[6] 'von Spielerfigur einsammelbare Gegenstände
byte block[10] 'tiles, die nicht überquert werden können
byte collision[6] 'tiles mit denen man kollidieren kann
byte itemersatz[30] 'Item-Ersatztiles, die das eingesammelte item im Display-Ram und auf dem Bildschirm ersetzen
byte f0[STR_MAX] 'Hilfsstring
byte ADDA,PORT 'Puffer der Portadressen der Sepia-Karte
byte returnmarker 'Abbruchmarker für Zeileneditor
byte editmarker 'Editmarker für Zeileneditor
byte actorpos[2] 'Zwischenspeicher für x,y-Position des Spieler-Tiles
byte button_art[BUTTON_CNT] 'Puffer für die Art des Buttons (Text-oder Icon)
'byte sid_command[7] 'SID-Sound-Kommando
byte GMode 'Grafikmodus
byte Big_Font 'Font-Modus (0=Tile/1=ROM)
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 *****************************************************************
tok11 byte "RND", 0 'Zufallszahl von x '139 getestet
tok46 byte "PI",0 'Kreiszahl PI '174 getestet
tok83 byte "FN",0 'mathematische Benutzerfunktionen 211 getestet
tok117 byte "ABS",0 ' 245 getestet
tok118 byte "SIN",0 '246 getestet
tok119 byte "COS",0 '247 getestet
tok120 byte "TAN",0 ' 248 getestet
tok121 byte "ATN",0 '249 getestet
tok122 byte "LN",0 ' 250 getestet
tok123 byte "SGN",0 ' 251 getestet
tok124 byte "SQR",0 ' 252 getestet
tok125 byte "EXP",0 ' 253 getestet
tok126 byte "INT",0 '254 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 "COLOR",0 'Farbe setzen 1,2 Vordergrund,Hintergrund 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
tok65 byte "GETX",0 'x-Cursorposition '193 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 "CUR",0 'Cursor ein/ausschalten 196 getestet
tok69 byte "SCRLEFT",0 'Bildschirmausschnitt y-yy nach links scrollen '197 getestet
tok45 byte "GETY",0 'y-Cursorposition '173 getestet
tok107 byte "HEX",0 'Ausgabe von Hexzahlen mit Print '235 getestet
tok73 byte "BIN",0 'Ausgabe von Binärzahlen mit Print '201 getestet
tok82 byte "LINE",0 'Linie zeichnen 210 getestet M0,M1
tok43 byte "RECT",0 'Rechteck 171 getestet M0,M1
tok64 byte "PSET",0 'Pixel setzen 192 getestet M0,M1
''************************* Modus0 ***********************************************************************
tok39 byte "WIN", 0 'Fenster C,T,S,R erstellen 167 * getestet M0,M1
tok74 byte "BUTTON",0 'Button erzeugen 202 getestet
tok103 byte "BOX",0 '2dbox zeichnen 231 getestet M0,M1
tok75 byte "RECOVER",0 'Bildschirmbereich wiederherstellen '203 getestet M0,M1
tok94 byte "BACKUP",0 'Bildschirmbereich sichern '222 getestet M0,M1
'************************* Modus1-3 ***********************************************************************
tok81 byte "CIRC",0 'Kreis zeichnen 209 getestet M1,M2
tok44 byte "PTEST",0 'Pixeltest 172 getestet M1,M2
'************************* 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
tok111 byte "TIMER",0 'Timer-Funktionen set,read,clear?,entry,delete 239 getestet
'**************************** STRINGFUNKTIONEN ********************************************************************
tok35 byte "LOWER$", 0 'String in Kleinbuchstaben zurückgeben 163 * getestet
tok104 byte "UPPER$",0 'String in Großbuchstaben zurückgeben '232 getestet
tok72 byte "LEFT$",0 'linken Teilstring zurückgeben '200 getestet
tok101 byte "MID$",0 'Teilstring ab Position n Zeichen zurückgeben '229 getestet
tok98 byte "RIGHT$",0 'rechten Teilstring zurückgeben '226 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 NUR MODUS 0 ****************************************************
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
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
tok95 byte "SPRITE",0 'Sprite-Parameter p, m, s(parameter, move,speed,usw) '223 * 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 '243 * getestet
'***********************SID-Synth-Befehle**************************************************************************
tok30 byte "SID", 0 'SID_Soundbefehle 158 getestet
tok31 byte "PLAY", 0 'SID DMP-Player '159 getestet
tok32 byte "GDMP", 0 'SID DMP-Player-Position '160 getestet
'************************ 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
tok106 byte "XBUS",0 'Zugriff auf System-Funktionen 234 getestet
'************************ ende Basic-Befehle **********************************************************************
'************************ Befehle in der Testphase ****************************************************************
tok33 byte "PUT", 0 'einzelnes Zeichen an x,y-Position ausgeben '161 gestestet - Verbleib noch offen
tok41 byte "RDEF",0 'Font umdefinieren '169
tok42 byte "SYS",0 'Systemfunktionen z.Bsp.anderer Grafikmodus '170
tok99 byte "BMP",0 'Bitmap laden, speichern, anzeigen (nur Mode4) '227
'******************************************************************************************************************
'******************************* freie Befehle für Erweiterungen **************************************************
tok49 byte "FREI1",0 'Frei 177
' ---------------------------- 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
Dat '*************** Verschiedene Grafikmodi **************************
Gmode0 byte "mode0.sys" 'Tiletreiber 64Farben 40x30 Zeichen bzw.Tiles
Gmode1 byte "mode1.sys" 'Pixeltreiber 32 Vordergrund- (16+16 blinkend) und 8 Hintergrundfarben 320x256 Pixel 40x32 Zeichen Farbblock 8x4Pixel
Gmode2 byte "mode2.sys" 'Pixeltreiber 64 Farben 20x15 Zeichen 160x120 Pixel Farbblock 1Pixel'"mode2.sys" 'Pixeltreiber 64 Farben 64x48 Zeichen 512x384 Pixel Farbblock 4x4Zeichen
Gmodes word @Gmode0,@Gmode1,@Gmode2',@Gmode3,@Gmode4
GmodeLine byte 39,39,19 'Spaltenanzahl-1 der Treiber
Gmodey byte 29,31,14 'Zeilenanzahl-1 der Treiber
gmodexw word 640,320,160 'x-weite des Treibers
gmodeyw word 480,256,120 'y-weite des Treibers
gmodepicsize word 4800,10240,19200 'Bildgröße
gmodeoffset word 4800,10240,19040 'Speicheroffset für letzte Bild-Zeile
DAT
ext5 byte "*.*",0 'alle Dateien anzeigen
tile byte "Tile",0 'tile-Verzeichnis
adm byte "adm.sys",0 'Administra-Treiber
sysfont byte "sysfontb.dat",0 'system-font
errortxt byte "errors.txt",0 'Error-Texte
importfile byte "import.sys",0 'externe Funktion Import
exportfile byte "export.sys",0 'externe Funktion Export
basicdir byte "BASIC",0
windowtile byte 135,137,136,7,141,134,132,130,128,8,129,133,0,131,8,8,8 'Fenster-Tiles für WIN-Funktion im Modus 0
con'****************************************** Hauptprogramm-Schleife *************************************************************************************************************
PUB main | sa
init 'Startinitialisierung
sa := 0 'startparameter
curlineno := -1 'startparameter
repeat
\doline(sa) 'eine kommandozeile verarbeiten
sa := 0 'Zeile verwerfen da abgearbeitet
con'****************************************** Initialisierung *********************************************************************************************************************
PRI init |pmark,newmark,x,y,i
ios.start
ios.sdmount 'SD-Karte Mounten
activate_dirmarker(0) 'in's Rootverzeichnis
ios.sdchdir(@basicdir) 'in's Basicverzeichnis wechseln
basicmarker:= get_dirmarker 'usermarker von administra holen
usermarker:=basicmarker
pmark:=ios.ram_rdbyte(PMARK_RAM) 'Programmarker abfragen, wenn 161 dann reclaim ausführen um Programm im Speicher wieder herzustellen
FS.SetPrecision(6) 'Präzision der Fliesskomma-Arithmetik setzen
FL.Start
'*********************************** Timer-Cog starten ********************************************************************************************************
TMRS.start(10) 'Timer-Objekt starten mit 1ms-Aufloesung
'**************************************************************************************************************************************************************
'*********************************** EEPROM-I2C Treiber starten ***********************************************************************************************
'ios.start_i2c(%000)
'*********************************** Startparameter ***********************************************************************************************************
pauseTime := 0 'pause wert auf 0
fileOpened := 0 'keine datei geoeffnet
volume:=15 'sid-cog auf volle lautstaerke
speicheranfang:=$0 'Programmspeicher beginnt ab adresse 0 im eRam
speicherende:=$2 'Programmende-marke
mapram:=0 'Map-Schreibmarker auf 0
farbe:=orange 'Schreibfarbe
hintergr:=black 'Hintergrundfarbe
'***************************************************************************************************************************************************************
'******************* Speicher löschen oder wiederherstellen *****************
'zum Bsp nach aufruf der Hilfefunktion
newmark:=ios.ram_rdbyte(BMARK_RAM) 'Marker steht auf 121, wenn Basic schonmal gestartet wurde
ios.ram_wrbyte(121,BMARK_RAM) 'Marker setzen,das Basic gestartet wurde
'******************* Rückkehr aus Unterprogramm Import.sys oder Export.sys *************************************************************************************
if pmark==161
reclaim 'Programm im Speicher wieder hestellen
ios.ram_wrbyte(0,PMARK_RAM) 'Reclaim-Marker löschen
GMode:=ios.ram_rdbyte(MMARK_RAM) 'Flag für Grafikmodus lesen
else
'*********************************** Abfrage welche Administra und Bellatrix- Codes geladen sind *************************************************************
'Diese Funktionen sorgen dafür, das die Treiber nur geladen werden, wenn sie noch nicht vorhanden sind und Basic noch nicht gestartet wurde also nicht bei jedem Start
if ios.admgetspec<>ADM_SPEC
ios.admload(@adm) 'administra-code laden, springt nach dem booten ins Root (falls man aus einem Unterverzeichnis startet,
activate_dirmarker(basicmarker) 'usermarker wieder in administra setzen
ios.belload(@@gmodes[0]) 'Basic-Grafiktreiber Mode0
Mode_Ready 'Treiber-bereit-Meldung abwarten
'**************************************************************************************************************************************************************
ios.ram_fill(ERROR_RAM,$BF0,0) 'Errortext-Speicher loeschen
mount
ios.sdopen("R",@errortxt)
fileload(ERROR_RAM) 'Error-Text einlesen
if newmark<>121 'Basic wurde noch nicht gestartet
ios.ram_fill($0,userPtr,0) 'Basic-Programmspeicher löschen
ios.ram_fill(TMP_RAM,userPtr,0) 'Bearbeitungsspeicher loeschen
clearall 'alle Variablen, Strings ,Window-Parameter,Mapdaten usw.löschen,Zeiger zurücksetzen
else
clearing 'nur Variablen,Strings,Mapdaten und Window-Parameter löschen
'************************** Startbildschirm ***********************************************************************************************************************************
'*************** Bildschirmaufbau ***********************************
ios.window(0,farbe,hintergr,farbe,0,0,0,0,0,0,0,29,39,1,0)
ios.printchar(12) 'cls
LoadTiletoRam(15,@sysfont,16,11) 'Logo und Font in eram laden
loadtile(15) 'Logo und Font in den Puffer laden
'*************** Logo anzeigen **************************************
x:=y:=0
ios.plotfunc(0,0,10,0,light_blue,0,_Line)
ios.plotfunc(0,1,9,1,light_orange,0,_Line)
ios.plotfunc(0,2,8,2,light_red,0,_Line)
repeat i from 144 to 151
ios.displayTile(i,light_blue,0,0,y,x)
ios.displayTile(i+8,light_red,0,0,y+2,x)
ios.displayTile(i+16,light_orange,0,0,y+1,x)
ios.displayTile(i+16+8,light_green,0,0,y+3,x)
x++
ios.setpos(0,13)
errortext(40,0) 'Versionsanzeige
ios.setpos(2,10)
ios.print(string("* "))
ios.printdec(userptr-speicherende) 'freie bytes anzeigen usrptr-speicherende
errortext(42,0) 'Basic-Bytes Free
ios.displaymouse(0,0) 'Maus abschalten, falls an
GMode:=0
ios.ram_wrbyte(GMode,MMARK_RAM)
win:=0 'aktuelle fensternummer 0 ist das Hauptfenster
cursor:=3 'cursormarker für Cursor on
ios.set_func(cursor,Cursor_Set)
ios.set_func(0,Print_Window)
'*******************************************************************************************************************************************************************************
'******************************************************************************************************************************************************
ios.sid_resetregisters 'SID Reset
ios.sid_beep(1)
'************ startparameter fuer Dir-Befehl *********************************************************************************************************
dzeilen:=18
xz :=2
yz :=4
modus :=2 'Modus1=compact, 2=lang 0=unsichtbar
'*****************************************************************************************************************************************************
ios.printchar(13)
ios.printchar(13)
'******************************************************************************************************************************************************
ios.setactionkey(2,3,4,5,32) 'Cursorsteuerung-Standardbelegung
actionkey[0]:=2 'links
actionkey[1]:=3 'rechts
actionkey[2]:=4 'hoch
actionkey[3]:=5 'runter
actionkey[4]:=32 'feuer
ADDA:=$48 'Portadressen und AD-Adresse für Sepia-Karte vorbelegen
PORT:=$38
ios.set_plxAdr(ADDA,PORT)
'READ_PARAMETER 'eventuelle Startparameter einlesen
Big_Font:=0
pri Mode_Ready
repeat while ios.bus_getchar2<>88 'warten auf Grafiktreiber
obj '************************** Datei-Unterprogramme ******************************************************************************************************************************
con '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PRI ifexist(dateiname) 'abfrage,ob datei schon vorhanden, wenn ja Überschreiben-Sicherheitsabfrage
ios.printchar(13)
mount
if ios.sdopen("W",dateiname)==0 'existiert die dateischon?
errortext(8,0) '"File exist! Overwrite? y/n" 'fragen, ob ueberschreiben
if ios.keywait=="y"
if ios.sddel(dateiname) 'wenn ja, alte Datei loeschen, bei nein ueberspringen
close
return 0
ios.sdnewfile(dateiname)
ios.sdopen("W",dateiname)
else
ios.printchar(13)
return 2 'datei nicht ueberschreiben
else 'wenn die Datei noch nicht existiert
if ios.sdnewfile(dateiname)
close
return 0
ios.sdopen("W",dateiname)
ios.printchar(13)
return 1
PRI close
ios.sdclose
ios.sdunmount
PRI mount
playerstatus
ios.sdmount
activate_dirmarker(usermarker)
if strsize(@workdir)>0
if strcomp(@workdir,string("\")) 'ins Root-Verzeichnis
activate_dirmarker(0)
else
ios.sdchdir(@workdir)
usermarker:=get_dirmarker
con '********************************** Speicher und Laderoutinen der Basic-Programme als Binaerdateien, ist erheblich schneller *************************
pri binsave|datadresse,count
datadresse:= 0
count:=speicherende-2
ios.sdxputblk(datadresse,count)
close
PRI binload(adr)|count
count:=fileload(adr)
writeendekennung (adr+count)
RAM_CLEAR
PRI RAM_CLEAR
ios.ram_fill(speicherende,$20000-speicherende,0) 'Programmspeicher hinter dem Programm loeschen
con '********************************** Fehler-und System-Texte in den eRam laden ****************************************************************************************************************
PRI fileload(adr): cont
cont:=ios.sdfattrib(0) 'Anzahl der in der Datei existierenden Zeichen
ios.sdxgetblk(adr,cont)
close
PRI errortext(nummer,ton)|ad 'Fehlertext anzeigen
ad:=ERROR_RAM
ram_txt(nummer,ad)
if ton<2 'alle fehlertexte mit 0 und 1
ios.print(@font) 'fehlertext
if ton==1 'mit system-beep bei Ton==0 wird nur der Text ausgegeben und kein Beep erzeugt (bei Systemtexten)
sysbeep
if curlineno>0 'Ausgabe der Zeilennummer bei Programmmodus (im Kommandomodus wird keine Zeilennummer ausgegeben)
errortext(10,0)
ios.printdec(curlineno)
ios.printchar(13)
Prg_End_Pos
close
abort
clearstr 'Stringpuffer löschen
PRI sysbeep
ios.sid_dmpstop
ios.sid_beep(0)
PRI ram_txt(nummer,ad)|c,i
i:=0
repeat nummer
repeat while (c:=ios.ram_rdbyte(ad++))<>10
if nummer==1 and c>13
byte[@font][i++]:=c
nummer--
byte[@font][i]:=0
con '********************************** Basic-Programm als TXT-Datei von SD-Card Importieren oder Exportieren ******************************************************************
pri import(mode)|i,adr
adr:=ios#PARAM
i:=0
ios.ram_wrbyte(GMode,MMARK_RAM) 'Grafikmode merken
repeat strsize(@f0)
ios.ram_wrbyte(f0[i++],adr++)
ios.ram_wrbyte(0,adr++)
if mode
ios.ram_wrlong(speicherende-2,adr++)
else
ios.ram_wrlong(0,adr++)
ios.ram_wrbyte(161,PMARK_RAM) 'Programmmarker wird bei rüeckkehr abgefragt und das Programm im Speicher wieder hergestellt
mount
activate_dirmarker(basicmarker) 'ins Basic Stammverzeichnis
if mode
ios.sdopen("r",@exportfile)
ios.ldbin(@exportfile)
else
ios.sdopen("r",@importfile)
ios.ldbin(@importfile)
close
con '************************************* Basic beenden **************************************************************************************************************************
PRI ende
ios.admreset
ios.belreset
reboot
con'**************************************** Basic-Zeile aus dem Speicher lesen und zur Abarbeitung uebergeben ********************************************************************
PRI doline(s) | c,i,xm
curlineno := -1 'erste Zeile
i:=0
if ios.key == ios#CHAR_ESC 'Wenn escape gedrueck dann?
cursor:=3
ios.set_func(cursor,Cursor_Set) 'Cursor einschalten
ios.set_func(2,MOVE) 'sprites anhalten
playerstatus 'stoppe Player falls er laeuft
errortext(4,0) 'Break in Line ausgeben
sysbeep 'Systemsignal
Prg_End_Pos 'ans Programmende springen, um das Programm abzubrechen
ios.printdec(xm) 'Ausgabe der Zeilennummer bei der gestoppt wurde
abort
if nextlineloc < speicherende-2 'programm abarbeiten
curlineno :=xm:=ios.ram_rdword(nextlineloc) 'Zeilennummer holen
'**********************TRON-Funktion*************************************************
if debug == 1 'bei eingeschaltetem Debugmodus wird
ios.printchar(60) 'die aktuell bearbeitete Zeilennummer
ios.printdec(curlineno) 'ausgegeben
ios.printchar(62)
'*******************ende TRON-Funktion***********************************************
'*******************Zeile aus eram holen*********************************************
nextlineloc+=2
repeat while tline[i++]:=ios.ram_rdbyte(nextlineloc++)
tline[i]:=0
tp:= @tline
texec 'befehl abarbeiten
else
pauseTime := 0 'oder eingabezeile
if s
bytemove(tp:=@tline,s,strsize(s)) 'Zeile s in tp verschieben
else
if nextlineloc == speicherende - 2 and returnmarker==0 'nächste Zeile, wenn Programm zu ende und nicht Return gedrückt wurde (da bei Eingabezeile ebenfalls ein Zeilenvorschub erzeugt wird)
ios.printchar(13)
returnmarker:=0
ios.print(string("OK>")) 'Promt ausgeben
getline(0) 'Zeile lesen und
c := spaces
if c=>"1" and c =< "9" 'ueberprüfung auf Zeilennummer
insertline2 'wenn programmzeile dann in den Speicher schreiben
Prg_End_Pos 'nächste freie position im speicher hinter der neuen Zeile
else
tokenize 'keine Programm sondern eine Kommandozeile
if spaces
texec 'dann sofort ausfuehren
con'************************************* Basic-Zeile uebernehmen und Statustasten abfragen ***************************************************************************************
PRI getline(laenge):e | i,f, c , x,y,t,m,a 'zeile eingeben
i := laenge
f:=0'laenge
e:=0
repeat
'********************* Playerstatus abfragen, wenn er laeuft und am ende des Titels stoppen und SD-Card freigeben********************************
if play:=1 and ios.sid_dmppos<20 'Player nach abgespielten Titel stoppen
playerstatus
'************************************************************************************************************************************************
c := ios.keywait
case c
008:if i > 0 'bei backspace ein zeichen zurueck 'solange wie ein zeichen da ist
x:=ios.getx
y:=ios.gety
ios.printchar(8)'printbs 'funktion backspace ausfueren
laenge--
i--
x--
if laenge=>i 'dies Abfrage verhindert ein einfrieren bei laenge<1
bytemove(@tline[i],@tline[i+1],laenge-i)
tline[laenge]:=0
ios.print(@tline[i])
ios.printchar(32)
if x<0
x:=GmodeLine[gmode]
y--
if y<1
y:=0
ios.setpos(y,x)
ios.printchar(2) 'Treiber 0 braucht das, um die Cursorposition zu aktualisieren
002:if i>0 'Pfeiltaste links
ios.printchar(5)'printleft
i--
003:if i < linelen-1
ios.printchar(6)'printright 'Pfeiltaste rechts
i++
162,7,5:repeat while i<laenge 'Ende,Bild runter,Cursor runter-Taste ans ende der Basiczeile springen
ios.printchar(6)'printright
i++
160,6,4:repeat i 'POS1,Bild hoch,Cursor hoch-Taste an den Anfang der Basic-Zeile springen
ios.printchar(5)'printleft
i:=0
027:ios.printchar(13)'printnl 'Abbruch
editmarker:=0
e:=1 'Abbruchmarker
quit
186:'Entf
x:=ios.getx
y:=ios.gety
if laenge>i
bytemove(@tline[i],@tline[i+1],laenge-i)
laenge--
tline[laenge]:=0
ios.print(@tline[i])
ios.printchar(32)
ios.setpos(y,x)
ios.printchar(2)
'******************* Funktionstasten abfragen *************************
157..159:'m:=159-c 'Nummer des GModes Alt-Gr + F1-F4
Load_Gmode(159-c) 'Grafikmodus laden
ios.print(string("OK>")) 'Promt ausgeben
218:if gmode==0
loadtile(15) 'F11 Fontsatz zurücksetzen (nur Mode0)
219:ende 'F12 basic beenden
214:i := put_command(@tok92,0) 'F7 edit
215:ios.print(string("TRON")) 'F8 TRON
debug:=1
return
216:ios.print(string("TROFF")) 'F9 TROFF
debug:=0
return
217:ios.print(string("RECLAIM")) 'F10 Reclaim
reclaim
return
213:i := put_command(@tok9,1) 'F6 list in doline
tline[i]:=0
tp:=@tline
return
212:i := put_command(@tok10,1) 'F5 RUN
tline[i]:=0
tp := @tline
return
211:
h_dir(dzeilen,modus,@ext5) 'taste F4 DIR aufrufen
210:i := put_command(@tok19,0) 'save F3
209:i := put_command(@tok20,0) 'Load F2
208:repeat a from 46 to 61 'Funktionstastenbelegung F1
errortext(a,0)
ios.printnl
return
'**********************************************************************
13:Returnmarker:=1 'wenn return gedrueckt
ios.printnl
tline[laenge] := 0 'statt i->laenge, so wird immer die komplette Zeile übernommen
tp := @tline 'tp bzw tline ist die gerade eingegebene zeile
return
32..126:
if i < linelen-1
if i<laenge and laenge<linelen-1
x:=ios.getx
y:=ios.gety
t:=0
bytemove(@tline[i+1],@tline[i],laenge-i)
tline[i]:=c
x++
laenge++
tline[laenge+1]:=0
ios.print(@tline[i])
if y==Gmodey[gmode] and (x+laenge-i-1)>GmodeLine[gmode] 'scroll hoch->dann y-position -1
t:=1
if x>GmodeLine[gmode] 'x>Zeilenlänge des Treibers
y+=1
x:=0
ios.setpos(y-t,x)
ios.printchar(2)
i++
else
ios.printchar(c)
tline[i++] :=c
if i>laenge
laenge:=i 'laenge ist immer die aktuelle laenge der zeile
PRI put_command(stradr,mode) 'Kommandostring nach tp senden
result:=strsize(stradr)
ios.print(stradr)
if mode==1
ios.printnl
bytemove(@tline[0],stradr,result)
con '****************************** Basic-Token erzeugen **************************************************************************************************************************
PRI tokenize | tok, c, at, put, state, i, j', ntoks
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 126'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
con '*********************************** Routinen zur Programmzeilenverwaltung im E-Ram********************************************************************************************
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