BASIC-Tipps
Was so alles an Tricks mit dem BASIC möglich war (entgegen der offiziellen Dokumentation), demonstriert vielleicht recht gut folgendes BASIC-Programm (in einer Z1013-Version):
Das Programm startet nach dem Einlesen mit CLOAD„TIPS“ automatisch, es wird ein Startbildschirm angezeigt, nach Druck auf ENTER wird das Programm aufgelistet. Der Startbildschirm erscheint nicht im Listing: Durch die Anweisung in Zeile 520 wird der erste Teil des Programms „unsichtbar“. Im zweiten Teil ist dadurch sogar eine Neunummerierung der Zeilen möglich! Dieser Platz vor dem eigentlichen Programm eignete sich auch wunderbar für Maschinencode, der auch Nullbytes enthalten durfte und nicht erst umständlich aus DATA-Zeilen mittels POKE erstellt werden musste.
Als Mini-Programme eingelagert sind Routinen zum Auflisten von Kassetteninhalten (CLIST) und ein Debug-Zusatz zum Auflisten aller Variablen.
Beim ROM-BASIC muss man 10240 von den Speicherzellen abziehen (ROM-BASIC-Systemvariablen 300h-400h, RAM-BASIC 2B00h-2C00h).
11101 = 861+10240
11103 = 863+10240
11229 = 989+10240 usw.
10 CLS:POKE8291,29 100 PRINT 110 PRINT 120 PRINT" .... ..... ..... . ..... " 130 PRINT" . . . . . . . " 140 PRINT" . . . . . . . " 150 PRINT" ..... ..... ..... . . " 160 PRINT" . . . . . . . " 170 PRINT" .. . .. . .. . .. .. " 180 PRINT" ..... .. . ..... .. ..... " 190 PRINT 200 PRINT 210 PRINT" .... ....... " 220 PRINT" . .... .. .. ... .. . . " 230 PRINT" ..... .. .. .......... " 240 PRINT" .. " 250 PRINT 260 PRINT 270 PRINT" II. Z1013-Tagung der DDR " 280 PRINT" DRESDEN Februar 1988 " 290 PRINT 295 PRINT" geaendert 23.06.1990 " 300 PRINT 310 PRINT 320 PRINT"................................"; 330 PRINT". V.Pohlers ."; 340 PRINT". . ..... . .... Lomonossow-."; 350 PRINT". . ..... .... Allee 41/81."; 360 PRINT". ..soft .... Greifswald ."; 370 PRINT". 2200 ."; 380 PRINT"................................"; 390 PRINT 400 PRINT" "; 500 INPUT"";A$ 510 BEEP:CLS:LINES1:WIDTH0:RESTORE520 520 DOKE11103,DEEK(DEEK(11229)+1):LIST:END 10 !HC-BASIC TIPS+KNIFFE 11 ! 12 !V.Pohlers, Lomonossowallee 41/81, Greifswald, 2200 13 !fuer die zweite Z1013-Tagung Dresden Febr. 1988 14 ! 15 ! 16 ! 17 !Programmname fuer CSAVE/CLOAD in Stringvariable 18 ! 19 ! CSAVE""+A$ 20 ! 21 !INPUT AT(X,Y) -Funktion 22 ! 23 ! DOKE 112,256*X+Y:INPUT" text".;T$ 24 ! ^ Leerzeichen noetig, erscheint nicht im Text 25 ! 26 !RANDOMIZE -Funktion 27 ! 28 ! 10 PRINT "zum Start bel. Taste druecken!":I=0 29 ! 20 I=I-1:A=RND(I) 30 ! 30 IF INKEY$="" GOTO 20 31 ! 32 !Runden einer Zahl 33 ! 34 ! DEF FNRS(X)=INT(10^S*X+.5)/10^S auf S Nachkommastellen runden 35 ! 36 !rechtsbuendige Ausgabe von Zahlen 37 ! 38 ! DEF FNP(X)=8-LEN(STR$(INT(X))) 39 ! PRINT TAB(20+FNP(Z));Z Ausgabe Dezimalpunkt an Position 28 40 ! 41 !Programmschutz fuer LIST/CSAVE/EDIT 42 ! 43 ! POKE 11101,1:CSAVE"pgm" Abspeichern, bei erneutem Einlesen 44 ! Progamm geschuetzt 45 ! DOKE 11101,0 bzw. POKE 11102,0 Aufheben Schutz 46 ! 47 ! LINES 0 LIST-Tod 48 ! 49 !-Abfrage bei Bildschirmende innerhalb FOR...NEXT 50 ! 51 ! IF PEEK(113)>31 THEN PRINT TAB(22) "" :INPUT"";ET$:CLS 52 ! 53 !Cursorzeichen veraendern 54 ! 55 ! POKE 10846,neuer Cursor bei HC-BASIC H 392 56 ! 57 !BASIC-RAM-Ende bei Neustart bis max. 0EBFFH 58 ! 59 ! DOKE 834,-5121 60 ! 61 !selbststartende BASIC-Programme 62 ! 63 ! * vor Programm schreiben 64 ! 0 RESTORE 10: DOKE 11103,DEEK(11229)+1: RUN 65 ! 10 hier beginnt das Programm 66 ! * POKE 8291,29: CSAVE"name" 67 ! * bei erneutem Einlesen mit CLOAD Selbststart 68 ! Zeile 0 erscheint nicht bei LIST usw. ! 69 ! 100 !CLIST fuer HC-Routinen-gespeicherte BASIC-Programme 101 ! 102 PRINT"CLIST":PRINT:PRINT 103 DA=128 104 DOKE45,DA:POKE124,1 105 CALL*1FC 106 IF PEEK(123)<>1 THEN105 107 FOR I=DA+3 TO DA+10 108 PRINT CHR$(PEEK(I));:NEXT 109 I=PEEK(DA)-211 110 IF I=0 OR I=4 THEN PRINT " Progr. "; 111 IF I=1 OR I=5 THEN PRINT " Datei "; 112 IF I=2 OR I=6 THEN PRINT " ASCII "; 113 IF I>3 THEN PRINT " G"; :ELSE PRINT " "; 114 PRINT DEEK(DA+11) 115 GOTO104 116 ! 117 ! "G" :Pgm/Daten mittels POKE 11101,1 gschuetzt 118 ! 200 !LVAR fuer HC-BASIC 201 ! 202 ! * eigenes Pgm einladen, danach LVAR (60000-60190) einladen 203 ! * im eigenen Pgm an die zu ueberprufenden Stellen GOSUB60000 schreiben 204 ! 205 ! LVAR listet direkt den Variablenspeicher: 206 ! einf. Var. : Adresse Name akt. Wert 207 ! Strings : Adresse Name Stringadr. Stringlaenge String 208 ! Funktionsnamen haben vorm Namen ein "f" 209 ! 210 ! Felder : Adresse Name (Dimensionen ...) 211 ! 212 ! 60000 VI=0:VJ=0:FORVI=DEEK(11223)TODEEK(11225)-1STEP6 60010 PRINTVI;TAB(7)CHR$(SGN(128ANDPEEK(VI+1))*102); 60020 PRINTTAB(8)CHR$(127ANDPEEK(VI+1));CHR$(127ANDPEEK(VI)); 60030 PRINTCHR$(SGN(128ANDPEEK(VI))*36); 60040 IFPEEK(VI)<128THENPRINTTAB(12);:GOTO60060 60050 PRINTTAB(12)DEEK(VI+4);TAB(19)PEEK(VI+2);TAB(24); 60060 RESTORE60100:VJ=DEEK(11229)+6 60070 POKEVJ,PEEK(VI+1)AND127 60080 POKEVJ+1,PEEK(VI)AND127:IFPEEK(VJ+1)=0THENPOKEVJ+1,32 60090 IFPEEK(VI)>127THENPOKEVJ+2,36:ELSEPOKEVJ+2,32 60100 PRINTA $:! 60110 NEXT 60115 IFDEEK(11227)=DEEK(11225)THEN60190 60120 PRINT:FORVI=DEEK(11225)TODEEK(11227)-1 60130 PRINTVI;TAB(8)DEEK(VI+2)-1;TAB(15)CHR$(PEEK(VI+1));CHR$(127ANDPEEK(VI)); 60140 PRINTCHR$(SGN(128ANDPEEK(VI))*36); 60150 PRINT"(";:FORVJ=PEEK(VI+4)-1TO0STEP-1 60160 PRINTDEEK(2*VJ+VI+5)-1;CHR$(8);",";:NEXTVJ 60170 PRINTCHR$(8);")" 60180 VI=VI+DEEK(VI+2)+3:NEXT 60190 PRINTVI:RETURN 60200 ! 60210 !die Adressen sind dezimal und beziehen sich auf das 60220 !Riesa-10k-Basic bzw. auf das HC-BASIC m1, 60230 !beim HC-BASIC H u.a. stimmen sie nicht alle !!!!!!!!!! 60240 ! 60250 !bitte TIPS nur mit CSAVE abspeichern, damit es sich 60260 !ordentlich abarbeitet. 60270 ! 60280 !Volker Pohlers, Lomonossowallee 41/81, Greifswald, 2200
Programme mit MC-Vorspann
Mein Hinweis zu http://www.sax.de/~zander/z9001/tip/tipj.html (BASIC-Programme sind ungewöhnlich lang)
Wenn der Basic-Zeiger 863 manipuliert wurde, beginnt das BASIC-Programm nicht auf Adresse 401h, sondern irgendwo dahinter. Der Speicherplatz dazwischen steht dann für Maschinencode zur Verfügung. Beim Speichern mit CSAVE wird immer ab 401h abgespeichert.
Diesen Freiraum bekommt man wie folgt weg:
PRINT DEEK(863) --> wenn <> 1025, dann wurde ein MC-Teil davor aktiviert. DOKE 1025, DEEK(863) Zeilenende 1. Zeile auf Ende des Bereichs setzen DOKE 1027,1 Zeilennummer 1 festlegen DOKE (863), 1025 Basic-Zeiger rücksetzen 1 <Enter> Zeile 1 löschen fertig!
Achtung: Im JKCEMU geht das nur bei Nutzung der Kassettenrekorderemulation. Beim direkten Laden von TAP, SSS, ZBS werden nicht alle BASIC-Pointer korrekt gesetzt!
Achtung2: 1025 gilt nur im ROM-BASIC!