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 mußte.

Als Mini-Programme eingelagert sind Routinen zum Auflisten von Kassetteninhalten (CLIST) und ein Debug-Zusatz zum Auflisten aller Variablen.

   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