C 64
Listing des Monats

Hypra-Basic

Erstellen Sie sich Ihre eigene Befehlserweiterung mit den Befehlen, die Sie wirklich brauchen. Hypra-Basic ist eine universelle und ausbaufähige Basic-Erweiterung. Es überbietet die Mächtigkeit professioneller Erweiterungen und die Stärke teurer Toolkits bei weitem.

Hypra-Basic ist mehr als nur eine einfache Erweiterung. Durch seinen modularen Aufbau kann man in Hypra-Basic problemorientierte Erweiterungen erstellen, die die meisten kommerziellen Programme in den Schatten stellen werden. Hypra-Basic ist keine in allen Einzelheiten und Programmsegmenten feststehende Basic-Erweiterung. Vielmehr dient es zum Verknüpfen einzelner Maschinensprache-Routinen.

Es ist also als Linker (aus dem englischen »to link = verbinden, verketten«) zu bezeichnen. Die Vorteile von Hypra-Basic liegen damit klar auf der Hand:

Auch mehrere Programme, die sich im Bereich ab $C000 befinden, können so gleichzeitig im Speicher liegen. Hypra-Basic verschiebt diese Programme und paßt Adressen automatisch an.

Die erstellten Routinen können im Speicher fast frei verschoben werden.

Der Aufruf der einzelnen Routinen erfolgt, wie im normalen Basic, über von Hypra-Basic frei definierbare Namen (mit Ausnahme der Basic-Befehlsworte) und nicht über SYS-Aufrufe.

Die einzelnen Befehlserweiterungen können jeweils bestimmten Problemen angepaßt werden. Denkbar sind zum Beispiel Grafik- oder Soundprogramme genauso wie Tools oder genauere Rechenroutinen.

Im Laufe der Zeit können Sie sich eine umfassende Bibliothek anlegen, die Ihnen für alle Eventualitäten eine Lösung anbietet.

Natürlich werden wir in den nächsten Ausgaben noch viele Routinen unserer Leser abdrucken. Die vorgestellten Routinen machen den Anfang.

Ihre Aufgabe soll es sein, für Hypra-Basic Programm-Module zu schreiben. Die besten werden wir veröffentlichen.

(R. Aretz/og)

Stricken Sie sich Ihre persönliche Erweiterung mit Hypra-Basic. Ohne überflüssigen Ballast mitzuführen, können Sie sich mit Hypra-Basic die Erweiterungen selbst herstellen, deren Befehle, Mächtigkeit und Umfang Sie selbst bestimmen können.

Geben Sie zunächst das Programm »BASIC .ASS« (Listing 1) mit dem MSE ein und speichern Sie es auf Diskette. Beachten Sie bitte das Leerzeichen vor dem Punkt.

Dann geben Sie »HYPRA-BASIC« (Listing 2) sowie »DOKUMENT« (Listing 3) und »MG SPEICHER« (Listing 4) mit dem Checksummer ein und speichern diese ebenfalls.

Die Programme haben folgende Funktionen.

»MG SPEICHER« speichert ein Maschinenprogramm nach Angabe von Modulnummer, Start- und Endadresse.

»DOKUMENT« erstellt eine Auflistung der auf Diskette befindlichen Module mit allen wesentlichen Daten.

»HYPRA-BASIC« ist das Herz des Programms, das das menügesteuerte Verbinden der Module übernimmt.

»BASIC .ASS« enthält zum einen die Umrechnungsroutine, um Maschinenprogramme an andere Bereiche anzupassen. Dahinter befindet sich die Erweiterung für den Interpreter.

Eigene Programme einbinden

Wenn Sie eine eigene Routine in Hypra-Basic einbauen wollen, muß Ihr Unterprogramm folgende Voraussetzungen erfüllen: Start- und Endadresse müssen bekannt sein. Datenbytes, zum Beispiel für eine Fehlermeldung, müssen nach dem Maschinenprogrammteil stehen, also daran angehängt sein. Die Anzahl der Datenbytes muß ebenfalls bekannt sein. Die Befehlsworte der Module dürfen keine Basic-Anweisungen oder Funktionen enthalten. Verbotene Namen sind zum Beispiel »SPRITEON« (enthält das ON aus ON X GOTO/ GOSUB) oder »PRINTAT« (enthält PRINT). Module, die mehrere Befehle beinhalten, müssen in sich geschlossen sein. Es dürfen maximal 16 Befehle in einem Modul enthalten sein. Ein Filename muß folgendes Format haben: "xERW . ASS".

Dabei entspricht x der Nurnmmer des Moduls. Beispiele für Namen sind »4ERW .ASS«, »38ERW .ASS« etc. Beachten Sie im Namen bitte wieder das Leerzeichen vor dem Punkt.

Da eine Diskette maximal 144 Einträge im Directory aufnehmen kann, und für jedes Modul zwei Einträge benötigt werden, sind auf einer Diskette 70 Module das Maximum. Bei höheren Modulnummern wird vom Computer eine andere Diskette verlangt. Bei den Modulnummern von 71 bis 140 also Disk 2, von 141 bis 210 Disk 3 etc.

Die Lage der erstellten Erweiterung im C 64: Die Befehlstabelle und die Interpreter-Erweiterung können nur im RAM-Bereich liegen, der ständig aktiv ist und nicht zu weit unten im Basic-Bereich liegt (dort liegt ja das Hypra-Basic). Diese Bereiche sind:
13200 ($3390) bis 40959 ($9FFF) und
49152 ($C000) bis 53247 ($CFFF).

Die Befehlsmodule selbst können auch im RAM unter dem ROM liegen. Dadurch erschließt sich ein Bereich von:
13200 ($3390) bis 53247 ($CFFF) und
57344 ($E000) bis 65535 ($FFFF).

Natürlich dürfen sich die beiden Bereiche nicht überlappen. Deshalb ist es vorteilhaft, wenn die Befehlsmodule hinter der Befehlstabelle liegen.

Starten des Programms: Laden Sie »HYPRA-BASIC« und starten Sie es. Das Maschinenprogramm »BASIC .ASS« wird daraufhin selbständig nachgeladen.

Eigene Befehle: Mit dem Programm »MG SPEICHER« oder mit einem Monitor auf Diskette gespeicherte Programme müssen mit einem bestimmten Namen versehen sein (siehe oben). Mit dem Menüpunkt »Parameter eingeben« des Hauptprogrammes müssen Sie die zu jedem Modul folgenden Angaben machen: Die Anzahl der im Modul enthaltenen Befehle, den Namen, mit dem der Befehl aufgerufen wird, zu jedem Namen die Startadresse, die Endadresse und die Anzahl der Datenbytes. Die Parameter werden dann in einem File mit dem Namen »xMODUL« gespeichert. X ist dabei wieder die Nummer des Moduls.

Erweiterungen erstellen: Geben Sie einfach die Nummern der gewünschten Module nacheinander ein. Die Eingabe von »F« storniert das jeweils letzte Modul. Sind alle Erweiterungen im Speicher, beenden Sie die Eingaben mit »E«. Als nächsten Schritt geben Sie die Startadresse der Tabelle sowie der Befehle ein. Wenn die Befehle direkt nach der Tabelle liegen sollen, dann bestätigen Sie bei »Befehle« die vom Computer vorgeschlagene Adresse mit der RETURN-Taste. Daraufhin wird die Erweiterung generiert, jedoch noch nicht gespeichert. Sie steht jetzt im Speicher des Computers an den von Ihnen angegebenen Adressen.

Speichern einer Erweiterung: Mit der Taste F3 gelangen Sie in das Speicher-Menü. Zwei Angaben werden hier von Ihnen erwartet: Der Name, unter dem die Befehlstabelle und die Interpreter-Erweiterung gespeichert wird sowie der Name, unter dem die Befehle gespeichert werden. Wenn Tabelle und Befehle direkt hintereinander liegen, genügt zum Speichern natürlich ein Name. In diesem Fall geben Sie bei »Befehle« nichts ein, sondern tippen einfach nur RETURN. Daraufhin wird die Erweiterung auf Diskette gespeichert.

Protokoll: Alle wichtigen Daten der im Speicher des C 64 liegenden Erweiterung werden noch einmal gezeigt. Eventuell sollten Sie hier noch einmal prüfen, ob es zwischen der Tabelle und den Befehlen keine Überschneidung gegeben hat. Das Protokoll können Sie auf Drucker ausgegeben.

Starten einer Erweiterung: Bringen Sie Ihren C 64 in den Einschaltzustand und laden Sie Ihre Erweiterung mit LOAD "name",8,1. Danach geben Sie NEW ein, um alle Zeiger wieder richtig zu setzen. Ist die Tabelle von den Befehlen getrennt, so laden Sie diese nun nach und geben auch danach wieder ein NEW ein. Der Start der Erweiterung, also das Einbinden in die Interpreterschleife, geschieht durch den Befehl SYS (Startadresse der Tabelle). Nach dem READY des Computers sind die neuen Befehle aktiv.

Hinweise für Programmierer: Wenn Sie selbst in Maschinensprache programmieren und sich einige Module selbst anfertigen wollen, beachten Sie bitte folgende Punkte: Ein Modul muß, bevor es mit Namen aufgerufen wird, auch über einen SYS-Befehl zu erreichen sein. Ein entsprechender Aufruf wäre zum Beispiel: SYS (Adresse) P1,P2,P3.

Vor dem ersten Parameter darf also kein Komma stehen, denn dieser müßte ja sonst nach dem Befehlswort mit eingegeben werden. Achten Sie bitte darauf, daß ein Modul mit mehreren Befehlen in sich geschlossen lauffähig sein muß, also nicht in ein anderes Modul verzweigt.

Module

Die in dieser Ausgabe veröffentlichten Module (Listings 5 bis 13) sind Beispiele, die die Fähigkeiten des Hypra-Basic demonstrieren und den Umgang veranschaulichen sollen. Die Erklärungen und Parameter dazu sind jeweils beim Modul selbst in der Bildunterschrift enthalten.

Bestimmt werden auch Sie Module für Hypra-Basic entwickeln. Die besten Module, die uns zugeschickt werden, werden wir gegen ein entsprechendes Honorar abdrucken. Somit kann sichjeder in kurzer Zeit eine Bibliothek von Basic-Befehlen, Tools und sonstigen nützlichen Routinen anlegen. Erstrebenswert wäre ein Standard-Basic für den C 64, für das dann auch Listings veröffentlicht würden. In diesem Sinne wünschen wir Ihnen viel Erfolg mit Hypra-Basic.

(R. Aretz/og)
PROGRAMM : BASIC .ASS     3138 3383
-----------------------------------
3138 : 20 FD AE 20 8A AD 20 F7   8D
3140 : B7 A0 00 84 F7 84 F8 B1   C3
3148 : 14 85 02 B9 88 31 C5 02   04
3150 : F0 0A C8 C0 95 D0 F4 A9   96
3158 : 00 85 F7 60 84 A7 C0 1D   E7
3160 : B0 07 A9 01 85 F7 4C 87   77
3168 : 31 C0 65 B0 07 A9 02 85   3A
3170 : F7 4C 87 31 A9 03 85 F7   4E
3178 : A9 01 85 F8 A0 01 B1 14   23
3180 : 85 F9 C8 B1 14 85 FA 60   84
3188 : 0A 4A 2A 6A 8A AA 98 A8   41
3190 : BA 9A 08 28 48 68 00 40   E7
3198 : 60 EA 18 38 58 78 B8 D8   58
31A0 : F8 88 C8 CA E8 69 29 C9   7A
31A8 : E0 C0 49 A9 A2 A0 09 E9   97
31B0 : 65 25 06 24 C5 E4 C4 C6   D2
31B8 : 45 E6 A5 A6 A4 46 05 26   8B
31C0 : 66 E5 85 86 84 75 35 16   40
31C8 : D5 D6 55 F6 B5 B4 56 15   C1
31D0 : 36 76 F5 95 94 61 21 C1   CE
31D8 : 41 A1 01 E1 81 71 31 D1   72
31E0 : 51 B1 11 F1 91 10 30 50   87
31E8 : 70 90 B0 D0 F0 6D 2D 0E   32
31F0 : 2C CD EC CC CE 4D EE AD   46
31F8 : AE AC 4E 0D 2E 6E ED 8D   5B
3200 : 8E 8C 7D 3D 1E DD DE 5D   E2
3208 : FE BD BC 5E 1D 3E 7E FD   99
3210 : 9D 79 39 D9 59 B9 BE 19   84
3218 : F9 99 20 4C 6C 20 8A AD   BD
3220 : 20 F7 B7 A5 14 85 F7 A5   77
3228 : 15 85 F8 20 FD AE 20 8A   2D
3230 : AD 20 F7 B7 A5 14 85 F9   E7
3238 : A5 15 85 FA 20 FD AE 20   15
3240 : 8A AD 20 F7 B7 A5 14 85   AC
3248 : 9B A5 15 85 9C A0 00 A5   C6
3250 : 01 85 02 78 A9 35 85 01   00
3258 : B1 F7 91 9B E6 F7 D0 02   52
3260 : E6 F8 E6 9B D0 02 E6 9C   E1
3268 : A5 F8 C5 FA D0 EA A5 F7   45
3270 : C5 F9 D0 E4 A5 02 85 01   85
3278 : 58 20 79 00 A8 D0 9E 60   8B
3280 : 20 9E AD 20 82 B7 A6 22   23
3288 : A4 23 20 BD FF 20 FD AE   D4
3290 : 20 9E B7 A0 01 20 BA FF   FD
3298 : A9 00 20 D5 FF 86 F7 84   21
32A0 : F8 60 20 9E AD 20 82 B7   FA
32A8 : A6 22 A4 23 20 BD FF 20   1D
32B0 : FD AE 20 9E B7 20 BA FF   48
32B8 : 20 FD AE 20 8A AD 20 F7   0D
32C0 : B7 A5 14 85 F7 A5 15 85   0C
32C8 : F8 20 FD AE 20 8A AD 20   73
32D0 : F7 B7 A6 14 E8 D0 02 E6   BA
32D8 : 15 A4 15 A9 F7 20 D8 FF   9E
32E0 : 60 A9 EC 8D 08 03 A9 32   A5
32E8 : 8D 09 03 60 20 73 00 C9   F8
32F0 : 7F 90 06 20 79 00 4C E7   D6
32F8 : A7 A9 82 85 F7 A9 33 85   6A
3300 : F8 A0 00 B1 F7 85 F9 18   42
3308 : 69 05 85 FA E6 F7 D0 02   2A
3310 : E6 F8 B1 F7 F0 DD D1 7A   18
3318 : D0 07 C8 C4 F9 F0 13 D0   4B
3320 : F1 18 A5 F7 65 FA 85 F7   BA
3328 : A5 F8 69 00 85 F8 A0 00   46
3330 : F0 CF B1 F7 85 55 C8 B1   FD
3338 : F7 85 56 C8 18 A5 7A 65   04
3340 : F9 85 7A 90 02 E6 7B A9   45
3348 : 82 85 57 A9 33 85 58 A5   A4
3350 : 01 85 02 78 A9 35 85 01   00
3358 : B1 F7 85 59 C8 B1 F7 85   96
3360 : 5A C8 B1 F7 AA A0 00 B1   9D
3368 : 59 91 57 C8 D0 F9 E6 5A   A6
3370 : E6 58 CA 10 F0 A5 02 85   86
3378 : 01 58 20 54 00 4C AE A7   A4
3380 : 00 00 00                  05
Listing 1. »BASIC .ASS« geben Sie bitte mit dem MSE ein
5 iffg<>0then10
7 fg=1:load"basic .ass",8,1
10 dima%(100):an=1:md=1:poke53280,0:poke53281,0:f=1:poke646,f:mp=12600
15 poke55,56:poke56,49
20 hl$="                                       "
30 h$="{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}"
40 rem****hauptmenue*******
50 printchr$(147)tab(9)"{rvon} hauptmenue {rvof} hypra-basic":printh$:an=1:md=1
60 print"folgende optionen sind moeglich:":printh$:print
70 printtab(5)"{rvon}[f1]{rvof} erweiterung erstellen
80 printtab(5)"{down}{rvon}[f3]{rvof} erweiterung abspeichern
90 printtab(5)"{down}{rvon}[f5]{rvof} parameter eingeben
100 printtab(5)"{down}{rvon}[f7]{rvof} parameter anzeigen"
110 printtab(5)"{down}{rvon}[f2]{rvof} protokoll":print:printh$
115 printtab(10)"bitte waehlen sie !!"
120 poke198,0:wait198,1:gets$:s=asc(s$)
130 ifs<133ors>137then120
140 s=s-132
150 onsgosub210,410,600,800,11000
160 goto50
200 rem*****erweiterungerstellen***
210 gosub1010
220 poke211,8:poke214,0:sys58640:print"sind sie sicher ? (j/n)"
230 poke198,0:wait198,1:gets$:ifs$<>"j"oran=0thenreturn
240 gosub10010
250 printchr$(147)"sie muessen jetzt zwei speicherbereiche"
260 print"auswaehlenen":print:print"1) bereich fuer befehlstabelle.dieser"
270 printtab(3)"darf nur im 'normalen ram' liegen.
280 print:print"2) bereich fuer die erweiterung.hier
290 printtab(3)"ist der speicherbereich beliebig.":print
292 print"falls beide programmteile nacheinander"
293 print"stehen sollen,bitte bei 'befehle' nur"
294 print"<return> druecken.":printh$
295 print"die befehlstabelle braucht";hg" bytes":printh$
300 input"1) tabelle:";sd$:sd=val(sd$):ifsd=0then250
305 printtab(12)sd+hg
310 input"{up}2) befehle:";ma$:ma=val(ma$):ms=ma
320 ifma=0thenreturn
330 printchr$(147)"erweiterung wird generiert":print
340 la=sd+162+ha:gosub10410
350 forki=1toan:mo%=a%(ki):printmo%,
360 hm=int(mo%/70)+1:ifmd<>hmthengosub10210
370 gosub10660:next:return
400 rem*****programmabspeichern**
410 printchr$(147)tab(10)"erweiterung speichern":printh$
420 print"beim abspeichern koennen zwei verschie- dene";
430 print" files abgelegt werden.":print
440 print"1) befehlstabelle"
450 print"2) module":print
460 print"dies ist erforderlich,wenn beide pro-"
470 print"grammteile unabhaengig voneinander
480 print"existieren. falls sie beide programme"
490 print"gemeinsam generiert haben, geben sie un-";
500 print"ter module einen leerstring ein.":printh$
510 input"tabelle:";na$
520 input"befehle:";nb$:printh$
525 print"sind sie sicher,dass die richtige dis- "
527 print"kette im laufwerk ist? (j/n)"
528 poke198,0:wait198,1:geta$:ifa$="n"thenreturn
530 ifnb$=""thensys(mp+362)"@:"+na$,8,sd,ma+1:return
540 sys(mp+362)"@:"+na$,8,sd,bt+1
550 sys(mp+229)ms,ma+1,mp+2000
560 close1:open1,8,1,"@:"+nb$:print#1,chr$(ms-int(ms/256)*256);chr$(ms/256);
570 n=ma+1-ms
580 fori=0ton-1:print#1,chr$(peek(mp+2000+i));:next:close1
590 return
600 rem*******parametereingeben***
610 printchr$(147)tab(10)"parameter eingeben":printh$
615 input"modulnummer     :";mo$
620 input"wieviele befehle:";ab
630 printh$
640 fori=1toab
650 poke211,0:poke214,5:sys58640:printi"{left}) ";:input"name:";na$(i):printh$
660 input"    startadresse:";as$(i)
670 input"    endadresse  :";ae$(i)
680 input"    datenbytes  :";ad$(i)
690 printh$:next
700 printtab(10)"sind sie sicher (j/n)"
710 poke198,0:wait198,1:geta$:ifa$="n"thenreturn
720 close1:open1,8,1,"@:"+mo$+"modul,s"
730 print#1,str$(ab)
740 fori=1toab:print#1,na$(i):print#1,as$(i):print#1,ae$(i):print#1,ad$(i)
750 next:close1:return
800 rem******parameteranzeigen****
810 printchr$(147)tab(10)"parameter anzeigen":printh$
820 input"von modulnummer:";m1
830 input"bis modulnummer:";m2:printh$
840 fork=m1tom2:poke214,5:sys58640
845 fori=1to15:printhl$:next
850 poke211,0:poke214,5:sys58640
860 mo%=k:gosub10530:print"modulnummer:"k:print"anzahl der befehle:"ab:printh$
870 fori=1toab
880 poke214,9:sys58640:printi"{left}) name:"na$(i);left$(hl$,10):print
890 print"startadresse:"as(i);left$(hl$,10)
900 print"endadresse  :"ae(i);left$(hl$,10)
910 print"datenbytes  :"ad(i);left$(hl$,10)
930 printh$:printtab(6)"weiter mit beliebiger taste"
940 poke198,0:wait198,1:next:next:return
999 end
1000 rem*****moduleauswaehlen*****
1010 printchr$(147)tab(10)"module auswaehlen!"
1020 printh$
1040 print"bitte modulnummern eingeben:"
1050 printh$
1060 fori=1to19:printhl$:next
1070 printh$:printtab(5)"{rvon} e {rvof} = ende         {rvon} f {rvof} = fehler";
1080 poke211,30:poke214,2:sys58640:poke19,1:inputmn$:poke19,0:print
1090 ifleft$(mn$,1)="e"thenan=an-1:return
1100 ifleft$(mn$,1)="f"andan>1thenan=an-1:mn$="   ":goto1130
1110 iflen(mn$)>3orval(mn$)=0then1080
1120 a%(an)=val(mn$)
1130 z=int(an/10)+4:s=(an-(z-4)*10)*4:poke211,s:poke214,z:sys58640:printmn$
1150 ifmn$<>"   "thenan=an+1
1160 goto1080
10000 rem****laengedecodebestimmen*
10010 hg=0:ha=0:ab=0:zb=0:forji=1toan
10015 hm=int(a%(ji)/70)+1:ifhm<>mdthengosub10210
10020 close1:open1,8,0,mid$(str$(a%(ji)),2,4)+"modul,s"
10030 input#1,a$:h=val(a$):zb=zb+h
10040 forj=1toh
10050 input#1,h1$,h2$(j),h3$(j),h4$(j):ha=ha+len(h1$)+6
10060 next
10070 hb=(val(h3$(h))+val(h4$(h)))-val(h2$(1)):ifhb>hgthenhg=hb
10090 close1:next
10100 hg=int((hg/256)+1)*256:hg=hg+ha+170:return
10200 rem****moduldiskausgeben****
10210 h1=peek(211):h2=peek(214)
10212 forx=1984to2023:pokex-1156,peek(x):pokex,32:x1=x1+1:next
10215 poke211,0:poke214,24:sys58640
10220 printtab(3)"{gry2}bitte moduldisk nr."hm" einlegen! ";
10230 md=hm:poke646,f:poke198,0:wait198,1
10240 forx=1984to2023:pokex,peek(x-1156):pokex+54272,f:next:poke211,h1
10250 poke214,h2:sys58640:return
10300 rem******programmladen*****
10310 hi=int(la/256):lo=la-256*hi
10330 sys(57812)na$,8,0:poke780,0:poke781,lo:poke782,hi:sys65493
10340 return
10400 rem******decoderoutineholen**
10410 h=la:la=sd:sys(mp+229)13025,13184,sd
10430 la=h:h=sd+11:hi=int(h/256):lo=h-256*hi:pokesd+1,lo:pokesd+6,hi
10440 h=sd+161:hi=int(h/256):lo=h-256*hi:pokesd+25,lo:pokesd+29,hi
10460 hi=int(la/256):lo=la-256*hi:pokesd+103,lo:pokesd+107,hi
10470 pokela-1,0:bt=sd+161:return
10500 rem*****parameterladen*****
10530 fl$=mid$(str$(mo%)+"modul,s,r",2,13)
10540 close2:open2,8,2,fl$
10550 input#2,a$:ab=val(a$)
10560 forji=1toab:input#2,na$(ji):input#2,a$:as(ji)=val(a$)
10570 input#2,a$:ae(ji)=val(a$)
10580 input#2,a$:ad(ji)=val(a$)
10590 next
10600 close2:return
10610 rem****befehlstabellebearbeiten**
10615 yy=len(na$(i)):pokebt,yy
10620 fork=1toyy:pokebt+k,asc(mid$(na$(i),k,1)):next:bt=bt+k
10630 hi=int(pz/256):lo=pz-256*hi:pokebt,lo:pokebt+1,hi
10635 hi=int(ma/256):lo=ma-256*hi:pokebt+2,lo:pokebt+3,hi
10636 le=ae(ab)+ad(ab)-as(1):pokebt+4,int(le/256):bt=bt+5
10640 return
10650 rem**********verschieb**********
10660 gosub10530:a$=str$(mo%)+"erw .ass":na$=mid$(a$,2,13):gosub10310:pz=la
10670 n1=pz:fori=1toab:gosub10610:n=as(i)
10680 sysmp,pz:a=peek(247)
10690 ifa<>3then10740
10700 a1=peek(249)+256*peek(250)
10710 ifa1<as(1)ora1>ae(ab)+ad(ab)then10750
10720 a1=a1-as(1):a1=n1+a1:hi=int(a1/256):lo=a1-256*hi
10730 pokepz+1,lo:pokepz+2,hi
10740 ifa=0thena=1
10750 pz=pz+a:n=n+a:ifn<>ae(i)+1then10680
10760 pz=pz+ad(i):next
10770 sys(mp+229)la,pz,ma
10780 ma=ma+le+1:return
11000 rem******protokoll********
11010 printchr$(147)tab(12)"protokoll":printh$
11020 gn=3
11025 close1:open1,gn
11030 print#1,"erweiterung hypra-basic version 1.1":print#1,h$
11040 print#1,"anzahl der befehle:         ";zb
11050 print#1,"startadresse befehlstabelle:";sd
11060 print#1,"startadresse der module:    ";ms:print#1,h$
11070 print#1,"bytes fuer tabelle:         ";hg
11080 print#1,"bytes fuer befehle:         ";ma-ms:print#1,h$
11082 print#1,"die erweiterung enthaelt folgende module":print#1
11085 fori=1toki-1:print#1,a%(i);:next:print#1
11090 iffk=1thenfk=0:gn=3:close1:return
11100 print#1,h$:print#1,"  ausgabe auf drucker (j/n)"
11110 poke198,0:wait198,1:geta$:ifa$="n"thenclose1:return
11120 gn=4:fk=1:close1:goto11025
Listing 2. »HYPRA-BASIC«, das Hauptprogramm
10 rem ****** dokument ******
20 poke53280,0:poke53281,0:diman$(16),as$(16),ae$(16),ad$(16)
30 input"{clr}{wht}geraetenummer 3=bild,4=drucker ";g
40 input"{down}startmodul:";sm
50 input"{down}endmodul:";em:print"{clr}";
60 fori=smtoem:gosub 500
70 open 1,g:i$=str$(i)+")  "
80 print#1,left$(i$,4);:a$=" "
100 for k=1toab:ifk<>1thena$="     "
110 print#1,a$;an$(k)"        "as$(k)" - "ae$(k)"     "ad$(k)
120 next
130 print#1,"{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}":close1
135 if g=3thenprint"{down}         weiter mit taste !!":poke198,0:wait198,1:print
140 next
150 ifg=3then60
160 end
500 rem **** subr. parameter holen ****
505 na$=mid$(str$(i),2,4)+"modul,s,r"
510 open 1,8,3,na$
520 input#1,ab$:ab=val(ab$)
530 for k=1 to ab
540 input#1,an$(k),as$(k),ae$(k),ad$(k):next:close1:return
Listing 3. »DOKUMENT« zeigt die Module einer Diskette an
10 poke53280,0:poke53281,0:print"{clr}{wht}"
20 input "modulnummer:";a$
30 input "{down}startadresse:";as
35 print"{down}endadresse des letzten befehls + daten-":print"bytes des letzten befehls!
40 input"{down}";ae:ae=ae+1
45 input"{down}   sind sie sicher (j/n)  e=ende ";s$:ifs$="j"then 50
47 ifs$="e"thenend
48 goto 10
50 h1=int(as/256):l1=as-256*h1
60 h2=int(ae/256):l2=ae-256*h2
70 sys(57812)"@:"+a$+"erw .ass",8:poke193,l1:poke194,h1
80 poke 174,l2:poke175,h2:sys62957
Listing 4. »MG SPEICHER«. Mit ihm kann man Maschinensprache-Programme auf Diskette bringen. Es geht aber auch mit einem Monitor oder dem MSE.
PROGRAMM : 1ERW .ASS      C000 C05B
-----------------------------------
C000 : A5 39 8D 4C C0 A5 3A 8D   6C
C008 : 4D C0 A5 7A 85 F7 A5 7B   14
C010 : 85 F8 A5 F7 85 7A A5 F8   2E
C018 : 85 7B A9 00 85 C6 20 87   E3
C020 : EA A5 C6 F0 F5 AD 77 02   5B
C028 : 85 02 4C 35 C0 20 79 00   5B
C030 : F0 E0 20 FD AE 20 8A AD   CA
C038 : 20 F7 B7 20 FD AE 20 9E   59
C040 : B7 E4 02 D0 E8 A9 00 85   EB
C048 : C6 4C A3 A8 00 00 AD 4C   82
C050 : C0 85 14 AD 4D C0 85 15   A9
C058 : 4C A3 A8                  05
Listing 5
PROGRAMM : 1MODUL         3220 3248
-----------------------------------
3220 : 0D 4B 45 59 0D 34 39 31   09
3228 : 35 32 0D 34 39 32 32 37   9D
3230 : 0D 32 0D 52 45 54 4B 45   93
3238 : 59 0D 34 39 32 33 30 0D   E4
3240 : 34 39 32 34 32 0D 30 0D   8A
Modulnummer: 1
PROGRAMM : 2ERW .ASS      C000 C0C5
-----------------------------------
C000 : 20 9E B7 E0 19 30 03 4C   31
C008 : 85 C0 8E 3C 03 86 F7 20   9D
C010 : FD AE 20 9E B7 E0 28 10   83
C018 : 6C 8E 3D 03 20 FD AE 20   68
C020 : 9E B7 E0 19 10 5F E8 8E   B2
C028 : 3E 03 20 FD AE 20 9E B7   85
C030 : E0 28 10 51 E8 8E 3F 03   59
C038 : AD 3C 03 CD 3E 03 30 02   3F
C040 : 10 43 AD 3D 03 CD 3F 03   A6
C048 : 30 02 10 39 AD 3D 03 85   80
C050 : D3 AD 3C 03 85 D6 20 10   19
C058 : E5 AC 3D 03 B1 D1 10 04   35
C060 : 29 7F 10 02 09 80 91 D1   0C
C068 : C8 CC 3F 03 D0 EE 18 A5   F7
C070 : D1 69 28 90 02 E6 D2 85   C0
C078 : D1 EE 3C 03 AD 3C 03 CD   94
C080 : 3E 03 D0 D5 60 A2 0E 4C   1B
C088 : 37 A4 20 00 C0 A9 00 85   7E
C090 : C6 85 A7 20 FD AE 20 9E   1A
C098 : B7 86 F8 A6 F8 A5 F7 8D   5D
C0A0 : 3C 03 A0 00 EA EA C8 D0   51
C0A8 : FB CA D0 F6 20 4C C0 E6   50
C0B0 : A7 A5 C6 F0 E6 A5 A7 4A   C8
C0B8 : B0 08 A5 F7 8D 3C 03 20   DC
C0C0 : 4C C0 60 00 C0            33
Listing 6
PROGRAMM : 2MODUL         3220 324A
-----------------------------------
3220 : 0D 49 4E 56 45 52 53 0D   7F
3228 : 34 39 31 35 32 0D 34 39   BB
3230 : 32 38 39 0D 30 0D 42 4C   7B
3238 : 49 4E 4B 0D 34 39 32 39   65
3240 : 30 0D 34 39 33 34 36 0D   F3
3248 : 30 0D                     FC
Modulnummer: 2
PROGRAMM : 3ERW .ASS      C000 C16B
-----------------------------------
C000 : 20 9E B7 8E 3C 03 20 FD   87
C008 : AE 20 9E B7 8E 3D 03 20   84
C010 : FD AE 20 9E B7 8E 3E 03   2F
C018 : 20 FD AE 20 9E B7 86 F7   98
C020 : AD 3C 03 85 D6 AD 3D 03   33
C028 : 85 D3 20 10 E5 20 24 EA   67
C030 : AC 3D 03 A2 40 B1 D1 C9   FC
C038 : 5D D0 02 A2 5B 8A 91 D1   C6
C040 : A5 F7 91 F3 C8 A2 40 CE   04
C048 : 3E 03 D0 E9 60 20 9E B7   6A
C050 : 8E 3C 03 20 FD AE 20 9E   D4
C058 : B7 8E 3D 03 20 FD AE 20   F3
C060 : 9E B7 8E 3E 03 20 FD AE   CC
C068 : 20 9E B7 86 F7 AD 3C 03   7A
C070 : 85 D6 AD 3D 03 85 D3 20   5F
C078 : 10 E5 20 24 EA A2 5D 18   71
C080 : AD 3C 03 6D 3E 03 C9 1A   11
C088 : 10 29 AC 3D 03 B1 D1 C9   98
C090 : 40 D0 02 A2 5B 8A 91 D1   01
C098 : A5 F7 91 F3 18 A5 D1 69   E4
C0A0 : 28 90 04 E6 D2 E6 F4 85   31
C0A8 : D1 85 F3 A2 5D CE 3E 03   D8
C0B0 : D0 D8 60 A2 0E 4C 37 A4   C2
C0B8 : 20 9E B7 8E 3F 03 20 FD   70
C0C0 : AE 20 9E B7 8E 40 03 20   54
C0C8 : FD AE 20 9E B7 8E 41 03   F3
C0D0 : 20 FD AE 20 9E B7 8E 42   05
C0D8 : 03 20 FD AE 20 9E B7 86   23
C0E0 : F7 AD 3F 03 8D 3C 03 AD   00
C0E8 : 40 03 8D 3D 03 AD 41 03   5E
C0F0 : 8D 3E 03 20 20 C0 AD 42   A4
C0F8 : 03 8D 3E 03 20 6D C0 18   52
C100 : AD 3F 03 6D 42 03 AA CA   38
C108 : 8E 3C 03 AD 41 03 8D 3E   0A
C110 : 03 20 20 C0 AD 3F 03 8D   3F
C118 : 3C 03 18 AD 41 03 6D 40   F4
C120 : 03 AA CA 8E 3D 03 AD 42   24
C128 : 03 8D 3E 03 20 6D C0 AD   AE
C130 : 3F 03 85 D6 AD 40 03 85   21
C138 : D3 20 10 E5 A4 D3 A9 70   4C
C140 : 91 D1 98 18 6D 41 03 48   60
C148 : A8 88 A9 6E 91 D1 18 AD   D0
C150 : 3F 03 6D 42 03 AA CA 86   72
C158 : D6 20 10 E5 AC 40 03 A9   2B
C160 : 6D 91 D1 68 A8 88 A9 7D   88
C168 : 91 D1 60                  D8
Listing 7
PROGRAMM : 3MODUL         3320 335E
-----------------------------------
3320 : 0D 57 4C 49 4E 45 0D 34   C1
3328 : 39 31 35 32 0D 34 39 32   49
3330 : 32 38 0D 30 0D 53 4C 49   F7
3338 : 4E 45 0D 34 39 32 32 39   53
3340 : 0D 34 39 33 33 35 0D 30   8E
3348 : 0D 52 45 43 4C 4F 57 0D   EF
3350 : 34 39 33 33 36 0D 34 39   63
3358 : 35 31 34 0D 30 0D         10
Modulnummer: 3
PROGRAMM : 4ERW .ASS      C000 C065
-----------------------------------
C000 : 20 8A AD 20 F7 B7 A5 14   D1
C008 : 85 F7 A5 15 85 F8 20 FD   31
C010 : AE 20 8A AD 20 F7 B7 A5   12
C018 : 14 85 F9 A5 15 85 FA 20   CC
C020 : FD AE 20 8A AD 20 F7 B7   F9
C028 : A5 14 85 9B A5 15 85 9C   FE
C030 : A0 00 A5 01 85 02 78 A9   F7
C038 : 35 85 01 B1 F7 91 9B E6   EF
C040 : F7 D0 02 E6 F8 E6 9B D0   D3
C048 : 02 E6 9C A5 F8 C5 FA D0   E4
C050 : EA A5 F7 C5 F9 D0 E4 A5   C8
C058 : 02 85 01 58 20 79 00 A8   87
C060 : D0 9E 60 00 C0            95
Listing 8
PROGRAMM : 4MODUL         3120 3135
-----------------------------------
3120 : 0D 54 52 41 4E 53 0D 34   30
3128 : 39 31 35 32 0D 34 39 32   49
3130 : 35 30 0D 30 0D            F3
Modulnummer: 4
PROGRAMM : 5ERW .ASS      C000 C096
-----------------------------------
C000 : 20 76 C0 20 8A AD 20 F7   16
C008 : B7 20 FD AE 20 9E B7 86   07
C010 : 02 A2 00 20 73 00 F0 06   6E
C018 : 9D 3C 03 E8 D0 F5 A5 01   06
C020 : 85 9E 78 A9 35 85 01 A0   0C
C028 : 00 B1 14 9D 3C 03 E8 C8   CB
C030 : C4 02 D0 F5 A5 9E 85 01   4F
C038 : 58 20 83 C0 20 A5 A9 A5   BA
C040 : 9B 85 7A A5 9C 85 7B 60   96
C048 : 20 76 C0 20 8A AD 20 F7   5E
C050 : B7 20 FD AE 20 28 AF 20   AF
C058 : 82 B7 85 02 A5 01 85 9B   07
C060 : 78 A9 35 85 01 A0 00 B1   23
C068 : 33 91 14 C8 C4 02 D0 F7   11
C070 : A5 9B 85 01 58 60 A2 00   77
C078 : A9 00 9D 3C 03 E8 E0 C4   95
C080 : D0 F8 60 A5 7A 85 9B A5   27
C088 : 7B 85 9C A9 3C 85 7A A9   4F
C090 : 03 85 7B 60 00 C0         D2
Listing 9
PROGRAMM : 5MODUL         3220 3252
-----------------------------------
3220 : 0D 52 41 4D 56 41 52 0D   23
3228 : 20 34 39 31 35 32 0D 20   30
3230 : 34 39 32 32 33 0D 20 30   50
3238 : 0D 56 41 52 52 41 4D 0D   89
3240 : 20 34 39 32 32 34 0D 20   48
3248 : 34 39 32 36 39 0D 20 33   4F
3250 : 30 0D                     1D
Modulnummer: 5
PROGRAMM : 6ERW .ASS      C000 C0FB
-----------------------------------
C000 : 20 28 AF A5 47 85 F7 A5   A1
C008 : 48 85 F8 A0 00 B1 F7 99   06
C010 : 3C 03 C8 C0 05 D0 F6 20   0B
C018 : FD AE 20 28 AF A0 00 B1   DD
C020 : 47 91 F7 C8 C0 05 D0 F7   AE
C028 : A0 00 B9 3C 03 91 47 C8   2A
C030 : C0 05 D0 F6 60 20 28 AF   8D
C038 : A5 46 48 A5 45 48 20 C4   68
C040 : C0 A9 02 F0 26 A5 F7 85   EE
C048 : F9 A5 F8 85 FA 20 FD AE   09
C050 : 20 28 AF 20 C4 C0 A9 02   71
C058 : F0 11 A0 00 68 91 F7 A5   37
C060 : 45 91 F9 C8 68 91 F7 A5   43
C068 : 46 91 F9 60 20 28 AF A5   4F
C070 : 46 48 A5 45 48 20 C4 C0   06
C078 : A5 F7 85 F9 48 A5 F8 85   5A
C080 : FA 48 A5 02 F0 30 20 FD   55
C088 : AE 20 28 AF 20 C4 C0 A0   B3
C090 : 02 B1 F7 85 9B C8 B1 F7   D0
C098 : 85 9C A0 00 A0 00 B1 F7   54
C0A0 : 91 F9 E6 F7 D0 02 E6 F8   91
C0A8 : E6 F9 D0 02 E6 FA C6 9B   98
C0B0 : D0 EA C6 9C 10 E6 68 85   1F
C0B8 : F8 68 85 F7 68 91 F7 C8   C9
C0C0 : 68 91 F7 60 A6 2F A5 30   D6
C0C8 : 86 F7 85 F8 C5 32 D0 04   03
C0D0 : E4 31 F0 1D A0 00 B1 F7   ED
C0D8 : C8 C5 45 D0 06 A5 46 D1   39
C0E0 : F7 F0 13 C8 B1 F7 18 65   33
C0E8 : F7 AA C8 B1 F7 65 F8 90   4C
C0F0 : D7 A9 00 85 02 60 A9 01   18
C0F8 : 85 02 60                  BD
Listing 10
PROGRAMM : 6MODUL         3320 336A
-----------------------------------
3320 : 0D 53 57 41 50 56 41 0D   AC
3328 : 20 34 39 31 35 32 0D 20   30
3330 : 34 39 32 30 34 0D 20 30   20
3338 : 0D 53 57 41 50 41 52 0D   5F
3340 : 20 34 39 32 30 35 0D 20   30
3348 : 34 39 32 35 39 0D 20 30   29
3350 : 0D 44 55 50 45 41 52 0D   A0
3358 : 20 34 39 32 36 30 0D 20   80
3360 : 34 39 33 34 37 0D 20 35   4B
3368 : 35 0D                     91
Modulnummer: 6
PROGRAMM : 7ERW .ASS      C000 C00D
-----------------------------------
C000 : A9 E4 8D 08 03 A9 A7 8D   B7
C008 : 09 03 60 00 C0            D7
Listing 11
PROGRAMM : 7MODUL         3120 3133
-----------------------------------
3120 : 0D 4F 46 46 0D 34 39 31   E9
3128 : 35 32 0D 34 39 31 36 32   9B
3130 : 0D 30 0D                  C5
Modulnummer: 7
PROGRAMM : 8ERW .ASS      C000 C153
-----------------------------------
C000 : 20 9E B7 A9 00 48 4C 10   26
C008 : C0 48 20 FD AE 20 9E B7   8A
C010 : 68 A8 8A 99 A7 00 C8 98   71
C018 : C0 05 D0 ED A5 A8 85 D3   AA
C020 : A5 A9 85 D6 20 10 E5 20   30
C028 : 24 EA A5 A7 D0 48 18 A5   1B
C030 : D1 69 28 85 F7 85 F9 A5   4F
C038 : D2 69 00 85 F8 18 A5 F8   48
C040 : 69 D4 85 FA A4 A8 B1 F7   1A
C048 : 91 D1 B1 F9 91 F3 C8 C4   D3
C050 : AA 30 F3 18 A5 D1 69 28   F1
C058 : 85 D1 A5 D2 69 00 85 D2   DC
C060 : 20 24 EA E6 A9 A5 A9 C5   24
C068 : AB D0 C3 85 D6 20 10 E5   97
C070 : 20 FD AE 4C A4 AA C9 01   8D
C078 : D0 50 E6 AA A5 A8 85 D3   DD
C080 : A5 AB 85 D6 20 10 E5 20   91
C088 : 24 EA 38 A5 D1 E9 28 85   FC
C090 : F7 85 F9 A5 D2 E9 00 85   04
C098 : F8 18 A5 F8 69 D4 85 FA   6E
C0A0 : A4 A8 B1 F7 91 D1 B1 F9   66
C0A8 : 91 F3 C8 C4 AA 30 F3 38   6A
C0B0 : A5 D1 E9 28 85 D1 A5 D2   E0
C0B8 : E9 00 85 D2 20 24 EA C6   B9
C0C0 : AB A5 AB C5 A9 D0 C3 4C   AA
C0C8 : 6B C0 C9 02 D0 3C E6 AB   28
C0D0 : A4 A8 C8 A5 D1 85 F7 18   08
C0D8 : A5 D2 69 D4 85 F8 B1 D1   66
C0E0 : 48 B1 F7 88 91 F7 68 91   AD
C0E8 : D1 C8 C8 C4 AA D0 EF 88   EA
C0F0 : A9 20 91 D1 18 A5 D1 69   11
C0F8 : 28 85 D1 A5 D2 69 00 85   8F
C100 : D2 E6 D6 A5 D6 C5 AB D0   9B
C108 : C7 60 C6 AA E6 AB A5 AA   BE
C110 : 85 D3 A5 A9 85 D6 20 10   CD
C118 : E5 A5 D1 85 F7 A5 D2 18   1D
C120 : 69 D4 85 F8 A4 AA 88 B1   99
C128 : D1 48 B1 F7 C8 91 F7 68   52
C130 : 91 D1 88 88 C4 A8 10 EF   8F
C138 : C8 A9 20 91 D1 18 A5 D1   27
C140 : 69 28 85 D1 A5 D2 69 00   EF
C148 : 85 D2 E6 D6 A5 D6 C5 AB   4A
C150 : D0 C7 60                  E9
Listing 12
PROGRAMM : 8MODUL         3120 3139
-----------------------------------
3120 : 0D 53 43 52 4F 4C 4C 0D   95
3128 : 20 34 39 31 35 32 0D 20   30
3130 : 34 39 34 39 30 0D 20 30   81
3138 : 0D                        8B
Modulnummer: 8
PROGRAMM : 9ERW .ASS      C000 C0E0
-----------------------------------
C000 : A5 2D 85 F7 A5 2E 85 F8   70
C008 : A0 00 84 C6 B1 F7 10 47   4C
C010 : 29 7F 20 D2 FF C8 B1 F7   58
C018 : 29 7F 20 D2 FF A9 25 20   85
C020 : D2 FF A9 3D 20 D2 FF C8   2E
C028 : B1 F7 85 F9 C8 B1 F7 85   7A
C030 : FA A5 F9 10 18 38 A9 FF   67
C038 : E5 FA 85 FA A9 FF E5 F9   81
C040 : 85 F9 A9 2D 20 D2 FF E6   38
C048 : FA D0 02 E6 F9 A5 F9 A6   0A
C050 : FA 20 CD BD 4C B8 C0 20   53
C058 : D2 FF C8 B1 F7 10 3A 29   CD
C060 : 7F 20 D2 FF A9 24 20 D2   86
C068 : FF A9 3D 20 D2 FF A9 22   A7
C070 : 20 D2 FF A0 02 B1 F7 F0   7D
C078 : 18 85 A7 C8 B1 F7 85 22   8B
C080 : C8 B1 F7 85 23 A0 00 B1   6A
C088 : 22 20 D2 FF C8 C6 A7 D0   72
C090 : F6 A9 22 20 D2 FF 18 90   96
C098 : 1F 20 D2 FF A9 3D 20 D2   26
C0A0 : FF 18 A5 F7 69 02 48 A5   27
C0A8 : F8 69 00 A8 68 20 A2 BB   F3
C0B0 : 20 BC AA A9 91 20 D2 FF   73
C0B8 : 18 A5 F7 69 07 85 F7 A5   96
C0C0 : F8 69 00 85 F8 A9 0D 20   6F
C0C8 : D2 FF A5 F8 C5 30 D0 07   51
C0D0 : A5 F7 C5 2F 30 01 60 A5   A0
C0D8 : C6 F0 FC 4C 08 C0 00 00   66
Listing 13
PROGRAMM : 9MODUL         3120 3134
-----------------------------------
3120 : 0D 44 55 4D 50 0D 34 39   FF
3128 : 31 35 32 0D 34 39 33 37   6A
3130 : 33 0D 30 0D               7A
Modulnummer: 9
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →