Module für Hypra-Basic
Hypra-Basic, das Listing des Monats der letzten Ausgabe, wächst weiter! Die neuen Befehte befassen sich fast ausschließlich mit der Sprite-Programmierung.
Wie versprochen, hier die nächsten Befehle für Hypra-Basic. Sie sind wieder in eigenständige Module (Listings 1 bis 11) gefaßt. Jedes Modul ist für sich lauffähig. Geben Sie sie mit dem MSE ein. Wie die Befehle im einzelnen einzubauen sind, entnehmen Sie bitte Ausgabe 4, ab Seite 58.
Beachten Sie beim Modul Nummer 12, daß es, um richtig zu funktionieren, in einem Bereich zwischen 49152 und 53247 liegen muß. Denn dieses Modul enthält eigentlich keinen »üblichen« Befehl, vielmehr handelt es sich hier um einen recht komfortablen Sprite-Editor.
(R. Aretz/og)
Listing 1. Modulnummer 10:
Anzahl der Befehle: 1
1) SPRITE 49152-49255,0
Funktion: Schafft Platz für N Sprites im Basic-Speicher ab
2048
Syntax: SPRITE N
Beispiel: SPRITE 31
In diesem Fall werden 32*64 Bytes für Sprites reserviert.
Das ist gleichzeitig die maximale Anzahl.
PROGRAMM : 10ERW .ASS C000 C06A
-----------------------------------
C000 : 20 9E B7 86 F7 A2 00 86 D0
C008 : F8 18 06 F7 26 F8 E8 E0 1C
C010 : 06 D0 F6 A5 2B 85 5F A5 98
C018 : 2C 85 60 A5 2D 85 5A A5 87
C020 : 2E 85 5B A6 5F CA E0 FF 8C
C028 : D0 02 C6 60 86 5F 18 A5 C6
C030 : 5A 65 F7 85 58 A5 5B 65 D6
C038 : F8 85 59 20 BF A3 18 A9 1A
C040 : 01 65 F7 85 2B A9 08 65 8D
C048 : F8 85 2C 18 A5 2D 65 F7 5A
C050 : 85 2D A5 2E 65 F8 85 2E 2C
C058 : A5 2D 85 2F 85 31 A5 2E B0
C060 : 85 32 85 30 20 33 A5 60 59
C068 : 00 C0 24
Listing 1
Listing 2. Modulnummer: 11
Anzahl der Befehle: 1
1) SPREIN 49152-49303,0
Funktion: Schaltet Sprite ein.
Syntax: SPREIN nr,defnr,xk,yk,pr,mode
Beispiel: SPREIN 3,0,320,150,0,1
Die Bedeutung der Parameter ist folgende:
a) nr=Spritenummer (0-7) für das VIC Register 21
b) defnr=Definitionsnummer des Datenblocks in dem das
Sprite abgelegt ist (0-31). 0=ab Adresse 2048,1=ab Adresse
2112 und so weiter. Das sind Adressen innerhalb des Basic-
Speichers, die vorher mit dem Befehl SPRITE geschützt wer-
den müssen.
c) xk,yx=die Bildschirmkoordinaten
d) Pr=Priorität 0=Vordergrund,1=Hintergrund
e) mode=Modus 0=Singlecolor, 1=Multicolor
PROGRAMM : 11ERW .ASS C000 C09A
-----------------------------------
C000 : 20 9E B7 86 F7 A9 01 18 2F
C008 : CA 30 03 0A 90 FA 85 F8 D5
C010 : 0D 15 D0 8D 15 D0 20 FD E2
C018 : AE 20 9E B7 8A 18 69 20 C4
C020 : A6 F7 9D F8 07 20 FD AE 0F
C028 : 20 8A AD 20 F7 B7 20 FD B6
C030 : AE 20 9E B7 A5 F7 0A A8 20
C038 : A5 14 99 00 D0 C8 8A 99 FE
C040 : 00 D0 A5 15 F0 0B A5 F8 A4
C048 : 0D 10 D0 8D 10 D0 4C 5B B3
C050 : C0 A5 F8 49 FF 2D 10 D0 95
C058 : 8D 10 D0 20 FD AE 20 9E 38
C060 : B7 8A F0 0B A5 F8 0D 1B 86
C068 : D0 8D 1B D0 4C 79 C0 A5 BF
C070 : F8 49 FF 2D 1B D0 8D 1B 57
C078 : D0 20 FD AE 20 9E B7 8A 98
C080 : F0 0B A5 F8 0D 1C D0 8D 8E
C088 : 1C D0 4C 97 C0 A5 F8 49 C2
C090 : FF 2D 1C D0 8D 1C D0 60 05
C098 : 00 C0 E4
Listing 2
Listing 3. Modulnummer: 12
Anzahl der Befehle: 1
1) SPRTEDIT 49152-50217,60
Funktion: Sprite-Editor
Syntax: SPRTEDIT keine Parameter
Dieser Befehl bildet eine Ausnahme gegenüber den bisheri-
gen. Er kann nicht beliebig im Speicher plaziert werden.
Er läuft nur im Bereich 49152-53247 korrekt.
Dieser Sprite-Editor benutzt folgende Tasten:
F1 = Hintergrundfarbe + 1
F2 = Farbregister A + 1
F3 = Farbregister B + 1
F4 = Farbregister C + 1
F5 = Expand in x-Richtung
F6 = Expand in y-Richtung
F7 = Umschaltung Multicolor
F8 = Programm beenden
A,B,C = Zeichenfarben für Multicolormodus
D = Delete Multicolormodus
+ = Speicherblock +1
- = Speicherblock -1
↑ = Linie nach oben zeichnen
* = Linie nach oben löschen
= = Linie nach unten zeichnen
; = Linie nach unten löschen
← = Linie nach links zeichnen
SPACE = Punkt setzen
. = Punkt löschen
CLR = komplettes Sprite löschen.
Die Cursortasten behalten ihre Funktion.
Die Angabe »Block« hat die gleiche Bedeutung wie bei den
anderen Spritebefehlen. Es können 32 Blöcke angesprochen
werden (0 bis 31). Der erste Block liegt bei 2048 im Basic-
Speicher. Die Startadresse eines Blockes kann wie folgt
berechnet werden:
ad=2048+64*nummer
Es ist zweckmäßig zusätzlich zum Spriteeditor das Modul
Nummer 20 laden, damit die erstellten Sprites auch gespei-
chert werden können.
Speicherbereiche für Spritebewegung:
Sprite-Nummer Start Ende
0 ................. 40960 - 41215
1 ................. 41216 - 41471
2 ................. 41472 - 41727
3 ................. 41728 - 41983
4 ................. 41984 - 42239
5 ................. 42240 - 42495
6 ................. 42496 - 42751
7 ................. 42752 - 43007
PROGRAMM : 12ERW .ASS C000 C466
-----------------------------------
C000 : A9 93 20 D2 FF A9 0E 20 9B
C008 : D2 FF A9 05 20 D2 FF A9 D1
C010 : 80 8D 8A 02 A9 18 8D 3D 46
C018 : 03 A0 00 8C 20 D0 8C 21 FA
C020 : D0 98 85 02 8D 10 D0 85 86
C028 : 9B 99 A3 00 C8 C0 04 D0 BD
C030 : F8 A9 FA 8D 00 D0 A9 B4 04
C038 : 8D 01 D0 A2 01 8E 15 D0 49
C040 : A9 00 85 F7 A9 04 85 F8 0C
C048 : A9 00 85 D3 85 D6 20 10 7D
C050 : E5 20 24 EA A2 00 A0 00 58
C058 : A9 2E 91 D1 A9 01 91 F3 88
C060 : C8 C0 18 D0 F3 A5 D1 18 8C
C068 : 69 28 85 D1 85 F3 90 04 C3
C070 : E6 D2 E6 F4 E8 E0 15 D0 A3
C078 : DD A9 00 85 D6 A2 00 86 6A
C080 : 12 A9 19 85 D3 20 10 E5 A8
C088 : A6 12 BD 2A C4 20 D2 FF 85
C090 : E8 86 12 A5 D3 C9 21 D0 A6
C098 : EF E6 D6 E6 D6 A5 D6 C9 16
C0A0 : 0E D0 DE A2 07 20 B6 C1 F2
C0A8 : A0 00 B1 F7 09 80 91 F7 7E
C0B0 : 20 F4 C2 A2 14 20 A5 C3 B0
C0B8 : A9 00 85 C6 20 87 EA A5 D1
C0C0 : C6 F0 F5 AD 77 02 C9 8C F9
C0C8 : D0 03 4C B5 C1 C9 85 D0 06
C0D0 : 08 A2 00 20 B6 C1 4C B0 39
C0D8 : C0 C9 41 90 0A C9 45 B0 45
C0E0 : 06 20 6D C3 4C B0 C0 C9 AB
C0E8 : 86 90 0E C9 89 B0 0A 38 2A
C0F0 : E9 82 AA 20 B6 C1 4C B0 D5
C0F8 : C0 C9 89 D0 06 20 3D C2 F5
C100 : 4C B0 C0 C9 8A D0 06 20 95
C108 : 3D C2 4C B0 C0 C9 2B D0 78
C110 : 10 20 B0 C3 E6 02 A2 07 EC
C118 : 20 B6 C1 20 24 C4 4C B0 03
C120 : C0 C9 2D D0 10 20 B0 C3 77
C128 : C6 02 A2 07 20 B6 C1 20 78
C130 : 24 C4 4C B0 C0 C9 8B D0 0A
C138 : 0B 20 5F C2 A2 07 20 B6 D4
C140 : C1 4C B0 C0 C9 20 D0 07 5A
C148 : A9 69 20 79 C2 A9 1D C9 5F
C150 : 2E D0 05 20 79 C2 A9 1D BA
C158 : C9 3D D0 07 A9 69 20 79 2E
C160 : C2 A9 11 C9 3B D0 07 A9 1E
C168 : 2E 20 79 C2 A9 11 C9 5E 64
C170 : D0 07 A9 69 20 79 C2 A9 88
C178 : 91 C9 2A D0 07 A9 2E 20 49
C180 : 79 C2 A9 91 C9 5F D0 07 E0
C188 : A9 69 20 79 C2 A9 9D C9 A1
C190 : 93 D0 03 4C 48 C0 C9 11 AA
C198 : F0 0D C9 91 F0 09 A4 9B D4
C1A0 : F0 05 48 20 8E C2 68 20 0A
C1A8 : 8E C2 A0 00 B1 F7 09 80 BF
C1B0 : 91 F7 4C B0 C0 60 E0 07 07
C1B8 : F0 0D FE 21 D0 BD 21 D0 34
C1C0 : 30 05 A9 F0 9D 21 D0 A9 75
C1C8 : 00 85 D6 85 12 A9 22 85 F3
C1D0 : D3 20 10 E5 A6 12 BD 62 2B
C1D8 : C4 A8 B9 00 D0 38 E9 F0 B7
C1E0 : AA A9 00 20 CD BD A9 20 15
C1E8 : 20 D2 FF E6 D6 E6 D6 E6 1C
C1F0 : 12 A5 12 C9 04 D0 D6 A9 08
C1F8 : 22 85 D3 20 10 E5 A5 02 A1
C200 : 30 09 18 A9 20 65 02 C9 B9
C208 : 40 90 06 A9 20 A2 00 86 6B
C210 : 02 8D F8 07 A9 00 A6 02 31
C218 : 20 CD BD A9 20 20 D2 FF 12
C220 : A9 20 20 D2 FF E6 D6 E6 9C
C228 : D6 A9 22 85 D3 20 10 E5 56
C230 : A9 00 A6 9B 20 CD BD A9 B1
C238 : 20 20 D2 FF 60 C9 89 D0 39
C240 : 0F AD 1D D0 D0 04 A9 01 5D
C248 : D0 02 A9 00 8D 1D D0 60 49
C250 : AD 17 D0 D0 04 A9 01 D0 0A
C258 : 02 A9 00 8D 17 D0 60 A5 A5
C260 : 9B D0 09 A9 17 8D 3D 03 B4
C268 : A9 01 D0 07 A9 18 8D 3D B3
C270 : 03 A9 00 85 9B 8D 1C D0 31
C278 : 60 A4 9B D0 03 91 F7 60 89
C280 : A0 00 AD 40 03 91 F7 C8 C2
C288 : AD 41 03 91 F7 60 48 A0 AE
C290 : 00 B1 F7 29 7F 91 F7 68 C1
C298 : C9 11 D0 15 A6 A3 E8 E0 AD
C2A0 : 15 10 0D 86 A3 18 A5 F7 53
C2A8 : 69 28 90 02 E6 F8 85 F7 C6
C2B0 : 60 C9 1D D0 11 A6 A4 E8 01
C2B8 : EC 3D 03 10 08 86 A4 E6 1B
C2C0 : F7 D0 02 E6 F8 60 C9 91 5A
C2C8 : D0 13 A6 A3 CA 30 0D 86 AF
C2D0 : A3 38 A5 F7 E9 28 B0 02 9E
C2D8 : C6 F8 85 F7 60 C9 9D D0 E7
C2E0 : 12 A6 A4 CA 30 0D 86 A4 97
C2E8 : 38 A5 F7 E9 01 B0 02 C6 59
C2F0 : F8 85 F7 60 A5 02 85 F9 29
C2F8 : A9 00 85 FA A2 00 18 06 F9
C300 : F9 26 FA E8 E0 06 D0 F6 57
C308 : 18 A5 F9 69 00 85 F9 A5 FE
C310 : FA 69 08 85 FA A9 00 85 7A
C318 : 4E A9 04 85 4F A9 00 85 3A
C320 : 52 85 51 A2 00 A0 00 84 EC
C328 : 50 B1 4E C9 2E 38 F0 05 90
C330 : 38 C9 5F D0 01 18 26 50 49
C338 : C8 C0 08 D0 EC A4 51 A5 01
C340 : 50 91 F9 18 A9 08 65 4E E7
C348 : 90 02 E6 4F 85 4E E6 F9 D7
C350 : D0 02 E6 FA E8 E0 03 D0 7D
C358 : CC 18 A9 10 65 4E 90 02 AC
C360 : E6 4F 85 4E E6 52 A5 52 55
C368 : C9 15 D0 B7 60 8D FF 05 63
C370 : C9 41 D0 0A A9 5F 8D 40 9B
C378 : 03 A9 69 8D 41 03 C9 42 34
C380 : D0 08 A9 69 8D 40 03 8D EE
C388 : 41 03 C9 43 D0 0A A9 69 FC
C390 : 8D 40 03 A9 5F 8D 41 03 A1
C398 : C9 44 D0 08 A9 2E 8D 40 7B
C3A0 : 03 8D 41 03 60 A0 00 EA FB
C3A8 : EA C8 D0 FB CA D0 F6 60 7A
C3B0 : A9 01 85 12 A0 00 B1 F7 3E
C3B8 : 29 7F 91 F7 A2 00 E0 02 B6
C3C0 : F0 1A A9 00 85 4E A9 80 9A
C3C8 : 85 4F 18 A9 F8 65 4E 85 2F
C3D0 : 4E A9 01 65 4F 85 4F E8 10
C3D8 : E4 02 D0 EE A9 00 85 50 21
C3E0 : A9 04 85 51 78 A5 01 48 60
C3E8 : A9 36 85 01 A2 00 A0 00 DB
C3F0 : A5 12 F0 07 B1 50 91 4E 3C
C3F8 : 18 90 04 B1 4E 91 50 C8 D4
C400 : C0 18 D0 EC 18 A5 50 69 61
C408 : 28 90 02 E6 51 85 50 18 88
C410 : A5 4E 69 18 90 02 E6 4F 8D
C418 : 85 4E E8 E0 15 D0 CF 68 02
C420 : 85 01 58 60 A9 00 85 12 1D
C428 : F0 92 C8 49 4E 54 45 52 FE
C430 : 20 20 C6 41 2E D2 45 47 57
C438 : 20 C1 C6 41 2E D2 45 47 30
C440 : 20 C2 C6 41 2E D2 45 47 B8
C448 : 20 C3 C2 4C 4F 43 4B 20 00
C450 : 20 20 CD 55 4C 54 49 43 B1
C458 : 4F 4C C6 41 52 42 45 20 34
C460 : 20 20 21 25 26 27 47
Listing 3
Listing 4. Modulnummer 13:
Anzahl der Befehle: 1
1) MULCOL 49152-49185,0
Funktion: Setzt Spritefarben
Syntax: MULCOL nr,farbe,farbe1,farbe2
Beispiel: MULCOL 2,1,14,6
In diesem Beispiel erhält das Sprite Nummer 2 folgende
Farben:
a) 1=Spritefarbregister 39-46 (weiß)
b) 14=Farbregister 37 (hellblau)
c) 6=Farbregister 38 (blau)
Die beiden letzten Parameter sind nur in Verbindung mit
Multicolorsprites von Bedeutung müssen aber immer mit
angegeben werden.
PROGRAMM : 13ERW .ASS C000 C028
-----------------------------------
C000 : 20 9E B7 86 F7 20 FD AE 04
C008 : 20 9E B7 8A A4 F7 99 27 75
C010 : D0 20 FD AE 20 9E B7 8A 30
C018 : 8D 25 D0 20 FD AE 20 9E 83
C020 : B7 8A 8D 26 D0 60 00 C0 D6
Listing 4
Listing 5. Modulnummer: 14
Anzahl der Befehle: 1
1) SPRPAR 49152-49225,4
Funktion: Legt Spriteparameter fest.
Syntax: nr,Priorität,expandx,expandy,mode
Beispiel: SPRPAR 5,0,1,0,0
a) Das Sprite Nr. 5 erscheint im Vordergrund
b) es wird in X Richtung gedehnt (expandx=1 und expand y=0)
c) es ist ein Singlecolor-Sprite (mode=0, 1=multicolor)
PROGRAMM : 14ERW .ASS C000 C050
-----------------------------------
C000 : 20 9E B7 A9 01 85 F7 A9 02
C008 : 03 85 02 CA 30 05 06 F7 DB
C010 : 18 90 F8 20 FD AE 20 9E C5
C018 : B7 8A A6 02 9D 3C 03 C6 54
C020 : 02 10 F0 A5 F7 49 FF 85 F0
C028 : F8 A0 00 B9 4A C0 AA B9 70
C030 : 3C 03 F0 08 BD 00 D0 05 54
C038 : F7 18 90 05 BD 00 D0 25 69
C040 : F8 9D 00 D0 C8 C0 04 D0 65
C048 : E2 60 1C 17 1D 1B 00 C0 71
Listing 5
Listing 6. Modulnummer: 15
Anzahl der Befehle: 2
1) SETIRQ 49152-49214,0
Funktion: Schaltet Sprite Bewegung ein.
Syntax: SETIRQ n
n=1 Bewegung ein
n=0 Bewegung aus
Das Kürzel IRQ am Ende des Befehlswortes verrät schon, daß
die Bewegung Interruptgesteuert funktioniert. Wie, siehe
unter (2)
2) SPRIRQ 49215-49689,16
Funktion: Festlegen, welche Sprites bewegt werden sollen.
Syntax: SPRIRQ 76543210,blocktausch(,anzahl,tempo)
Beispiel: SPRIRQ 00100001,0
Die Ziffernfolge (7654...) gilt als Symbol für die 8-Bit-
Struktur eines Byte. Jeder Ziffer ist ein Bit zugeordnet.
1=Sprite an,0=Sprite aus. Im Beispiel sind die Bits 0 und 5
gesetzt. Das heißt, Sprite Nr. 0 und Nr. 5 sind eingeschal-
tet. Ferner ist der zweite Parameter=0. Die Bedeutung die-
ses Parameters wird in einem zweiten Beispiel erklärt.
Wie oben erwähnt können Sprites IRQgesteuert bewegt wer-
den. Nun stellt sich die Frage: »Wie sag ich dem Sprite wie
es sich bewegen soll?«
Für jedes Sprite ist im RAM-Bereich ab 40960 ein Speicher-
block von 256 Bytes reserviert in dem die Bewegungsvor-
schrift steht. Es gibt 8 Möglichkeiten der Bewegung, die
man mit der Lage der Himmelsrichtungen erklären kann.
1=Norden
2=Osten
3=Süden 1
4=Westen 8 5
5=Nord-Ost 4 + 2
6=Süd-Ost 7 6
7=Süd-West 3
8=Nord-West
Aufbau der Speicherblöcke hier für Sprite Nr. 0
40960 40961 40962 40963 40965 ...
1 2 3 4 5 ...
1) Spritegeschwindigkeit (0-255) je größer desto langsa-
mer.
2) Zeiger auf aktuelles Registerpaar muß am Anfang auf 0
gesetzt werden.
3) erste Bewegungsrichtung (identisch mit 40964)
Anschließend folgen paarweise die Zahl der Bewegungen und
die Richtung.
Beispiel: 17,1 Sprite wird um 17 Punkte nach oben bewegt.
Sie müssen nicht alle 256 Register benutzen. Wird ein Be-
wegungszähler (das ist immer das erste Byte der Bytepaa-
re) auf Null gesetzt so wird die Definition abgeschlossen.
Folgt im nächsten Register ebenfalls eine Null so ist die
Bewegung abgeschlossen und das Sprite bleibt stehen.
Folgt jedoch eine 1 so beginnt die Bewegung von vorne.
Beispiel 2: SPRIRQ 00100011,1,10,50
Im zweiten Beispiel sind die letzten 3 Parameter von Be-
deutung. Die 1 gibt an, daß die Blocktauschroutine einge-
schaltet ist. Das bedeutet: Der Block in dem die Sprite-
daten stehen kann ebenfalls IRQ-gesteuert verändert wer-
den. Unter Blöcken ist das zum Befehl SPRITE beschriebene
zu verstehen. Der zweite Parameter gibt an, bis zu welchem
Block getauscht werden soll. Die Zählung beginnt immer bei
0. Der letzte Parameter gibt die Geschwindigkeit an, mit
der das Ganze erfolgen soll (0-255).
In unserem Beispiel wird das Sprite Nr. 0 zyklisch verän-
dert, und zwar werden die Blöcke 0 bis 10 benutzt. Eine
mögliche Anwendung wäre zum Beispiel die Erzeugung einer
fließenden Bewegung, wobei die einzelnen Bewegungsphasen
in den Spriteblöcken 0 bis 10 untergebracht sein müssen.
Dieser Blocktausch funktioniert nur mit dem Sprite Nr. 0.
PROGRAMM : 15ERW .ASS C000 C22A
-----------------------------------
C000 : 78 A5 56 8D 15 03 18 A5 A7
C008 : 55 69 8A 90 03 EE 15 03 C8
C010 : 8D 14 03 20 9E B7 8A F0 20
C018 : 14 A9 F8 8D 12 D0 AD 11 71
C020 : D0 29 7F 8D 11 D0 A9 81 58
C028 : 8D 1A D0 58 60 EA A9 31 68
C030 : 8D 14 03 A9 EA 8D 15 03 33
C038 : A9 00 8D 1A D0 58 60 A9 2D
C040 : 00 8D 9B 02 20 79 00 C9 8F
C048 : 30 38 D0 01 18 2E 9B 02 4E
C050 : 20 73 00 C9 2C F0 0C C9 71
C058 : 30 38 D0 01 18 2E 9B 02 5E
C060 : 4C 50 C0 20 73 00 20 9E FD
C068 : B7 8E 9E 02 8A F0 1A 20 27
C070 : FD AE 20 9E B7 8E EF 03 56
C078 : A2 00 8E EE 03 20 FD AE 22
C080 : 20 9E B7 8E EC 03 8E ED AC
C088 : 03 60 AD 19 D0 8D 19 D0 C9
C090 : 30 07 AD 0D DC 58 4C 98 44
C098 : C1 A5 F8 48 A5 F7 48 A5 F9
C0A0 : 01 48 A9 35 85 01 AD 9B 25
C0A8 : 02 8D 9C 02 A2 00 8E 9D 78
C0B0 : 02 4E 9C 02 B0 03 4C 75 80
C0B8 : C1 DE F4 03 F0 03 4C 75 C9
C0C0 : C1 BD 1A C2 85 F8 A9 00 05
C0C8 : 85 F7 A8 B1 F7 9D F4 03 EF
C0D0 : C8 38 B1 F7 E9 01 91 F7 FC
C0D8 : D0 03 20 DF C1 A0 02 B1 BA
C0E0 : F7 A8 B1 F7 C9 01 D0 0A 93
C0E8 : 8A 0A AA E8 DE 00 D0 4C 09
C0F0 : 75 C1 C9 02 D0 0E 8A 0A B4
C0F8 : AA FE 00 D0 D0 03 20 C3 69
C100 : C1 4C 75 C1 C9 03 D0 0A 89
C108 : 8A 0A AA E8 FE 00 D0 4C 2B
C110 : 75 C1 C9 04 D0 13 8A 0A 3D
C118 : AA DE 00 D0 D0 57 A9 FF BA
C120 : 9D 00 D0 20 D0 C1 4C 75 2D
C128 : C1 C9 05 D0 0F 8A 0A AA EC
C130 : E8 DE 00 D0 A9 02 AE 9D 42
C138 : 02 4C F2 C0 C9 06 D0 0F 63
C140 : 8A 0A AA E8 FE 00 D0 A9 1D
C148 : 02 AE 9D 02 4C F2 C0 C9 3C
C150 : 07 D0 0F 8A 0A AA E8 FE 6C
C158 : 00 D0 A9 04 AE 9D 02 4C 24
C160 : 12 C1 C9 08 D0 0F 8A 0A 8A
C168 : AA E8 DE 00 D0 A9 04 AE 06
C170 : 9D 02 4C 12 C1 AE 9D 02 70
C178 : E8 8E 9D 02 E0 08 F0 03 67
C180 : 4C B1 C0 18 AD 12 D0 69 59
C188 : 14 8D 12 D0 68 85 01 68 89
C190 : 85 F7 68 85 F8 4C 81 EA A9
C198 : AD 9E 02 F0 23 CE EC 03 95
C1A0 : D0 1E AD ED 03 8D EC 03 FF
C1A8 : EE EE 03 AD EE 03 CD EF A2
C1B0 : 03 D0 0A A9 00 8D EE 03 01
C1B8 : A9 1F 8D F8 07 EE F8 07 4D
C1C0 : 4C 31 EA AE 9D 02 BD 22 5A
C1C8 : C2 0D 10 D0 8D 10 D0 60 8C
C1D0 : AE 9D 02 BD 22 C2 49 FF E2
C1D8 : 2D 10 D0 8D 10 D0 60 A0 3D
C1E0 : 02 18 A9 02 71 F7 B0 0D 4D
C1E8 : 91 F7 A8 88 B1 F7 F0 05 59
C1F0 : A0 01 91 F7 60 C8 B1 F7 77
C1F8 : F0 0F A0 03 B1 F7 A0 01 58
C200 : 91 F7 A0 02 A9 04 91 F7 E6
C208 : 60 AE 9D 02 BD 22 C2 49 F1
C210 : FF 2D 9B 02 8D 9B 02 4C 23
C218 : FA C1 A0 A1 A2 A3 A4 A5 74
C220 : A6 A7 01 02 04 08 10 20 1C
C228 : 40 80 A3
Listing 6
Listing 7. Modulnummer: 16
Anzahl der Befehle: 1
1) DETEKT 49152-49215,0
Funktion: Macht eine Kollisionsabfrage und verzweigt bei
Kollision in die angegebene Zeilennummer.
Syntax: DETEKT mode,spr1,(spr2),zeilennummer
mode =0 Sprite-Sprite Kollision.
mode =1 Sprite-Hintergrund. Bei mode=1 entfällt der Para-
meter spr2.
Beispiel: DETEKT 0,2,6,10000
Im Beispiel wird auf eine Kollision von Sprite Nummer 2 und
Nummer 6 geprüft. Hat diese stattgefunden wird nach Zeile
10000 verzweigt.
PROGRAMM : 16ERW .ASS C000 C04A
-----------------------------------
C000 : 20 9E B7 86 02 20 FD AE A4
C008 : 20 9E B7 BD 40 C0 85 F7 2D
C010 : A6 02 D0 0D 20 FD AE 20 7A
C018 : 9E B7 BD 40 C0 05 F7 85 28
C020 : F7 20 FD AE 20 8A AD 20 CA
C028 : F7 B7 A5 02 18 69 1E AA 3F
C030 : BD 00 D0 C5 F7 D0 08 A9 54
C038 : 00 9D 00 D0 4C A3 A8 60 66
C040 : 01 02 04 08 10 20 40 80 49
C048 : 00 C0 A3
Listing 7
Listing 8. Modulnummer: 17
Anzahl der Befehle: 1
1) SPRREG 49152-49186,0
Funktion: Besetzt Sprite-Einschaltregister mit angegebe-
ner Bitkombination.
Syntax: SPRREG 76543210
Beispiel: SPRREG 00100011
Die Sprites mit den Nummern 0,1 und 5 werden eingeschaltet
PROGRAMM : 17ERW .ASS C000 C025
-----------------------------------
C000 : A9 00 8D 15 D0 AA A4 7A 99
C008 : D0 02 C6 7B C6 7A 20 73 A2
C010 : 00 C9 31 38 F0 01 18 2E 1C
C018 : 15 D0 E8 E0 08 D0 EF 20 F2
C020 : 73 00 60 00 C0 F7
Listing 8
Listing 9. Modulnummer: 18
Anzahl der Befehle: 1
1) SETSPR 49152-49213,0
Funktion: Setzt ein Sprite auf bestimmte Position.
Syntax: SETSPR nr,xPos,yPos
Beispiel: SETSPR 3,180,100
Dieser Befehl setzt Sprite 3 auf die Position x=180,y=100.
PROGRAMM : 18ERW .ASS C000 C050
-----------------------------------
C000 : 20 9E B7 86 F7 8A 0A 85 35
C008 : F8 20 FD AE 20 8A AD 20 B3
C010 : F7 B7 20 FD AE 20 9E B7 80
C018 : 8A A6 F8 E8 9D 00 D0 CA 03
C020 : A5 14 9D 00 D0 A6 F7 BD D4
C028 : 46 C0 48 0D 15 D0 8D 15 BA
C030 : D0 68 A4 15 F0 07 0D 10 9C
C038 : D0 8D 10 D0 60 49 FF 2D 98
C040 : 10 D0 8D 10 D0 60 01 02 36
C048 : 04 08 10 20 40 80 00 C0 E2
Listing 9
Listing 10. Modulnummer: 19
Anzahl der Befehle: 2
1) BIGSPR 49152-49269,0
Funktion: Fügt die Sprites 0 bis 3 zu einem großen Sprite
zusammen, wobei folgende Zuordnung gilt:
0=oben links,1=oben rechts
2=unten links,3=unten rechts
Syntax: BIGSPR Pr,mo,expx,expy
Beispiel: BIGSPR 1,1,0,1
a) Pr=1 das Sprite erscheint im Hintergrund
b) mo=1 es ist ein Multicolorsprite
c) expx=0 das Sprite wird in x-Richtung nicht vergrößert
d) expy=1 das Sprite wird in y-Richtung vergrößert.
1) SETBIG 49270-49432,4
Funktion: Setzt das Bigsprite auf gewünschte Position.
Syntax: SETBIG mo,xpos,ypos
Beispiel: SETBIG 1,120,100
Dieser Befehl setzt das Bigsprite auf Position mit den
Koordinaten x=120,y=100.
mo=0 bedeutet Bigsprite aus. Hierbei kann die Positionsan-
gabe entfallen.
PROGRAMM : 19ERW .ASS C000 C11D
-----------------------------------
C000 : 20 9E B7 8A F0 0B A9 0F DB
C008 : 0D 1B D0 8D 1B D0 4C 1B 28
C010 : C0 A9 0F 49 FF 2D 1B D0 09
C018 : 8D 1B D0 20 FD AE 20 9E 7E
C020 : B7 8A F0 0B A9 0F 0D 1C 39
C028 : D0 8D 1C D0 4C 39 C0 A9 C5
C030 : 0F 49 FF 2D 1C D0 8D 1C 40
C038 : D0 20 FD AE 20 9E B7 8A 58
C040 : F0 0B A9 0F 0D 1D D0 8D 1A
C048 : 1D D0 4C 57 C0 A9 0F 49 F3
C050 : FF 2D 1D D0 8D 1D D0 20 8C
C058 : FD AE 20 9E B7 8A F0 0B 32
C060 : A9 0F 0D 17 D0 8D 17 D0 2F
C068 : 4C 75 C0 A9 0F 49 FF 2D 6A
C070 : 17 D0 8D 17 D0 60 20 9E 03
C078 : B7 D0 03 4C 0E C1 A9 0F 95
C080 : 0D 15 D0 8D 15 D0 20 FD 52
C088 : AE 20 8A AD 20 F7 B7 A5 8A
C090 : 14 8D 3C 03 A5 15 8D 3D 8E
C098 : 03 20 FD AE 20 9E B7 86 E3
C0A0 : F9 AD 1D D0 A2 30 C9 0F C2
C0A8 : F0 02 A2 18 86 F7 AD 17 52
C0B0 : D0 A2 28 C9 0F F0 02 A2 DA
C0B8 : 14 86 F8 A2 00 A0 00 F0 89
C0C0 : 11 AD 3C 03 85 14 AD 3D 41
C0C8 : 03 85 15 18 A5 F9 65 F8 88
C0D0 : 85 F9 A5 14 9D 00 D0 A5 A6
C0D8 : 15 F0 0C B9 19 C1 0D 10 94
C0E0 : D0 8D 10 D0 4C F2 C0 B9 68
C0E8 : 19 C1 49 FF 2D 10 D0 8D E6
C0F0 : 10 D0 E8 A5 F9 9D 00 D0 85
C0F8 : E8 18 A5 14 65 F7 90 02 35
C100 : E6 15 85 14 C8 C0 02 F0 D1
C108 : B8 C0 04 D0 C5 60 A9 0F 60
C110 : 49 FF 2D 15 D0 8D 15 D0 B6
C118 : 60 01 02 04 08 50
Listing 10
Listing 11. Modulnummer 20:
Anzahl der Befehle: 2
1) LODPRG 49152-49185,0
Funktion: Laden eines Maschinenprogramms an die Original-
adresse ohne Basic-Zeiger zu verstellen.
Syntax: LODPRG »name«, Gerätenummer
Beispiel: LODPRG »bild«,8
Der Filename kann auch als Variable übergeben werden.
2) SAVPRG 49186-49248,0
Funktion: Er ist das Gegenstück zu (1). Allerdings muß
hier Start- und Endadresse angegeben werden.
Syntax: SAVPRG »name«, Gerätenummer, Startadresse,
Endadresse
Beispiel: SAVPRG »bild«,8,1024,2023
Speichert den Inhalt des Bildschirmspeichers unter dem
Namen Bild auf Diskette.
PROGRAMM : 20ERW .ASS C000 C063
-----------------------------------
C000 : 20 9E AD 20 82 B7 A6 22 A3
C008 : A4 23 20 BD FF 20 FD AE 54
C010 : 20 9E B7 A0 01 20 BA FF 7D
C018 : A9 00 20 D5 FF 86 F7 84 A1
C020 : F8 60 20 9E AD 20 82 B7 7A
C028 : A6 22 A4 23 20 BD FF 20 9D
C030 : FD AE 20 9E B7 20 BA FF C8
C038 : 20 FD AE 20 8A AD 20 F7 8D
C040 : B7 A5 14 85 F7 A5 15 85 8C
C048 : F8 20 FD AE 20 8A AD 20 F3
C050 : F7 B7 A6 14 E8 D0 02 E6 3A
C058 : 15 A4 15 A9 F7 20 D8 FF 1E
C060 : 60 20 32 EB
Listing 11
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