ABBUC Magazin 031

Frohe Weihnachten

 

Waltraud’s Spielecke

 

Hallo, inzwischen ist die Jahreszeit gekommen, in der man in der warmen Stube auch öfter am Computer sitzt. Weihnachten steht auch vor der Tür und darum als erstes einige Tips zu einem Spiel, in dem man den Stress vor einer Bescherung so richtig zu spüren bekommt.

Ich nenne jetzt die Räume, in denen man die Gegenstände findet, die man in diesem Spiel unbedingt braucht.

 

X MAS-HORROR

  1. Schlüssel zum Keller: Straße
  2. Diskette: Flur im ersten Stock
  3. Taschenlampe: Schlafzimmer 1. Stock
  4. Wunschzettel und Schaufel: Kinderzimmer 1. Stock
  5. Krippe: Dachboden, Luke öffnen
  6. Safeschlüssel: Keller (kleiner Raum)
  7. Mehl: Keller (Vorratsraum)
  8. Joystick: Vorratsraum (hier eingeben: untersuche Mäuseloch, dann CTRL B)
  9. Christbaumkugeln: Keller (kleiner Raum)
  10. Videospiel: Im Safe hinterm Bild im untersten Flur
  11. Kerzen: Wohnzimmer
  12. Eier: Küche
  13. Butter: Küche
  14. Zucker: Küche
  15. Backrezept: Dachboden (Schrank verschieben, Norden gehen)
  16. Plätzchen backen: Küche
  17. Plätzchen hinlegen und Christbaum schmücken: Wohnzimmer

Alles in zwei Stunden geschafft? Gratuliere!

Paradox

In diesem deutschen Grafik-Adventure sollte man sich über nichts wundern! Es beginnt mit einem Baum in der Steppe. Um einen größeren Überblick zu bekommen, klettern wir rauf. Und da geht’s auch schon los! Da ein Spiegel in einem Baum nun wirklich nichts zu suchen hat, nehmen wir ihn mit.

Wieder unten angekommen, müssen wir uns für eine Richtung entscheiden. Wenden wir uns einfach mal nach Süden. Wir gelangen in eine Schlucht mit vielen Steinen. Ganz unbewaffnet wollen wir uns nicht in dieser Gegend herumtreiben, also nehmen wir einen mit. Die Schlucht wirkt nicht sehr einladend, also gehen wir wieder zurück und diesmal zur Abwechslung am Baum nach Osten. Hach – eine Telefonzelle in der Steppe! Nicht wundern, sondern reingehen. Am Telefon hängt ein Schild, das wir neugierig lesen. Toll – Schwarz-Schilling ist überall! Da wir aber nicht solange warten wollen (denn bei der Post geht’s auch nicht so schnell), gehen wir wieder zurück zu unserem Baum und von dort nach Norden.

Das wird ja immer besser, doch dem Hinweis folgen wir. Was ist das denn? Para…, na ja! Nehmen und kaputthauen ist eins. Schwein muß der Mensch haben! Weiter geht es nach Norden. Mann-O-Mann, wo kommt der denn her? Nein, nicht daher!! Aber sein Angebot nehmen wir an, vielleicht ist es ja ein fliegender… Nach einer windigen Luftreise und einer sanften Landung gehen wir nach Norden und finden auf einem Hügel eine Flasche. Nachdem wir sie genommen und geöffnet haben, kommen wir uns vor wie in „Tausendundeine Nacht“. Leider entpuppt sich der Geist als böser Djinn. Damit er sieht, wie dämlich er aussieht, zeigen wir ihm den Spiegel und – futsch isser. Hat sich bestimmt vor sich selbst erschrocken.

Weiter geht es nach Westen. Oje, sogar hier herrscht Johnny Controletti! Gott sei Dank haben wir einen Ausweis bei uns und können durch. Der Eingang sieht zwar wie eine Gefängnistür aus, aber es führt kein anderer Weg… Wieder einmal klettern! Oben sehen wir nur ein Loch und als wir hineingehen – na sowas!!!

Blinkys Scary School

(Lösungsweg für Diskversion)

  1. Vom Start nach rechts bis zum Raum „Scrolling Along“
  2. Fragezeichen = Rezept (drücken)
  3. Zurück nach oben (Flour Power/Mehl nehmen)
  4. Runter und nach rechts
  5. Toilettenpapier noch nicht nehmen, sondern nach oben (Flushed with Succes)
  6. Taschenlampe nehmen (Have you seen the light)
  7. Nach unten und nach rechts. In den linken Abgrund fallen
  8. Über die Schnecken nach rechts
  9. Über den Abgrund und Parfüm nehmen (Phew de Cologne)
  10. Nach unten fallen
  11. Erst nach links, dann über den Abgrund rechts springen, Toilettenpapier nehmen und Taschenlampe ablegen. So oft drücken, bis sie verschwindet („have you seen the light“ muß oben stehen)
  12. Nach rechts runterfallen
  13. Es ist dunkel. „Have you seen the light“ muß oben stehen
  14. Nach links gehen, bis man etwas tiefer fällt, dann nach links raus
  15. Etwa in der Mitte des dunklen Raumes ist ein Teleporter. Darauf springen
  16. „Scrolling Allong“! Zwei Räume nach links und auf den Kochtopf springen. (Zwei Zutaten: Mehl und Parfüm)
  17. Nach rechts zum Raum mit den zwei Abgründen, am linken runterfallen
  18. Links raus und weiter nach links bis zum Frosch
  19. Runter und nach rechts. Den Hering nehmen (red herring)
  20. Nach links und wieder links. Achtung. Frosch und Spieße!
  21. Von oberer (oder unterer) Plattform den Raum verlassen und im nächsten das Toilettenpapier nehmen (bei der Figur links)
  22. Nach unten fallen, dann nach links
  23. Über den rechten Abgrund springen und „Lemon Aid“ nehmen
  24. Am linken Abgrund runter, dann nach links. Toilette!
  25. Hochspringen (Transporter)
  26. Zwei Räume nach links und Hering und Lemon in den Topf geben (Transport nach links oben auf den Absatz)
  27. Drei Räume nach links, über die Maus springen. Spieße von oben! Im dritten Raum ist das Lurchauge (Eye of Newt)
  28. Über die Plattformen nach oben (zwei Räume im Zickzack)
  29. Nach rechts und gleich am linken Screenrand das Teegebäck nehmen (Time Sconeby). Vorsicht Wespen!
  30. Auf der oberen Mauer soweit nach rechts gehen (fünf Räume mit Vögeln), bis es nicht mehr weitergeht Dort die Luft nehmen (Air today)
  31. Vier Räume zurück nach links. Im Raum mit dem Abgrund nach unten fallen
  32. Nach rechts, an gebrochener Säule vorbei. Raum mit Rezept für den zweiten Trank
  33. Runterfallen und in Topf II die Zutaten hinein
  34. Nach oben raus, nach links und über Plattformen in den Raum darüber 
  35. Hier den unteren Gang nach rechts(Schnecken!) und im Raum mit Gummi (Gum)
  36. Zweimal nach links und dann nach unten fallen, rechts gehen und dann runter. Zutat in Topf II
  37. Ganz normal nach oben raus. dann nach links und an der gebrochenen Säule nach unten fallen. Ein Raum wird vollständig im Fallen durchquert. Man landet weich
  38. Nach rechts gehen zum Absatz. Runter und nach rechts an Topf I vorbei
  39. Immer weiter nach rechts bis zum Toilettenpapier. Nehmen!
  40. Weiter bis zu den zwei Abgründen. Den linken benutzen
  41. Unten angelangt, nach rechts gehen, wieder runterfallen
  42. Sprung links/rechts zum Absatz wo die Taschenlampe ist. Diese nehmen und sich fallenlassen
  43. Nach rechts den Raum verlassen
  44. Am Wasser! Reinspringen
  45. Abwärts schwimmen
  46. < li>Im nächsten Bild ganz unten nach rechts

  47. Jetzt vier „Räume“ ganz hoch, bis es nur noch nach rechts weitergeht
  48. Dort rechts raus und nach einem weiteren Bild das Wasser verlassen
  49. Stur nach rechts (Vorsicht! Springen!) bis zum Ende
  50. Über die Grabsteine zum Wecker springen, Wecker nehmen und zurück zum Wasser (links gehen!)
  51. Ins Wasser tauchen, vier Räume abwärts, dann links und hoch, bis man das Wasser wieder verlassen muß (dabei muß man immer ein Leben opfern)
  52. Nach links, wieder nach links. Hier steht ein Teleporter, der einen wieder nach oben transportiert
  53. Der Kochtopf ist zwei Räume weiter und mit seiner Hilfe fliegt man wieder auf den Absatz links
  54. Im nächsten Raum links den Ausgang nach oben benutzen
  55. Im Zickzack den nächsten durchspringen und man ist wieder an der Kreuzung, wo man links „abbiegt“
  56. Bei „Hamish“. Über ihn auf die „Ziegel“ springen

Hinweis: Damit die Zeit nicht so schnell abläuft, während des Suchens PAUSE machen!
SELECT = Pause ein, START = Pause aus, OPTION = neues Spiel.

Logistik (alle 99 Codewörter)

von Florian Baumann

01: Mikado 02: Aceton 03: Albino
04: Bistro 05: Yankee 06: Reflex
07: Kopeke 08: Memnon 09: Perfid
10: Barium 11: Yersin 12: Neutra
13: Kalach 14: Relief 15: Stefan
16: Xylose 17: Alaska 18: Maikie
19: Menton 20: Ruptur 21: Ganove
22: Zirkus 23: Neapel 24: Cupido
25: Quaden 26: Alexis 27: Raglan
28: Genese 29: Madras 30: Bronze
31: Oviedo 32: Nickel 33: Papier
34: Bairam 35: Palais 36: Island
37: Elegie 38: Warthe 39: Lidice
40: Bauxit 41: Tender 42: Hyphen
43: Feston 44: Trance 45: Pappel
46: Alkali 47: Nubien 48: Sardou
49: Orange 50: Dezime 51: Oradea
52: Zwinge 53: Ironie 54: Pandit
55: Nikias 56: Hestia 57: Geibel
58: Ozelot 59: Lullus 60: Rubens
61: Kallus 62: Sirius 63: Parzen
64: Aragon 65: Topeka 66: Xerose
67: Jersey 68: Karnak 69: Zander
70: Darwin 71: Orsini 72: Lublin
73: Ararat 74: Lignit 75: Mozart
76: Calvin 77: Rostra 78: Dotter
79: Regent 80: Berlin 81: Lemnos
82: Elster 83: Anubis 84: Verdun
85: Radium 86: Scapin 87: Hoover
88: Disney 89: Zephyr 90: Olivin
91: Flores 92: Wisent 93: Fauves
94: Saigon 95: Hamada 96: Utopie
97: Qualle 98: Diskus 99: Hebron

WHOOPS (Passwörter)

von Markus Witte

1 WOE 2 PSI 3 SEE 4 NGA
5 MEG 6 SCHE 7 REV 8 END
9 OOR 10 THE 11 MIS 12 SIN
13 GLI 14 NKD 15 EMU 16 ZIE
17 KIS 18 GES 19 CHR 20 EVE
21 NDO 22 ORJ 23 ESL 24 ERG
25 ROE 26 TEN 27 GAA 28 NNA
29 ARF 30 RAN 31 KEN 32 STE
33 INJ 34 ENT 35 RYS 36 OFT
37 WAR 38 EEN 39 JES 40 LER

CHEATS:

Laser Robot:

Freezer:
Leben: $2633, $25E6
Zeit: $ 2592
Level: $25E2, $263A
(bei Leben und Level in beiden Stellen den gleichen Wert poken)

Editor:
unendl. Leben: Sektor 293 (dez) $125 (hex) Byte Pos. 39 (dez) $26 (dex) von 01 in 00 ändern und Sektor 293(dez) Byte Pos. 53 (dez) $34 (hex) von 01 in 00 ändern.
unendl. Zeit: Sektor 273 (dez) $111 (hex) Byte Pos. 06 (dez) $05 (hex) von 01 in 00 ändern

 

Elektraglide:

Editor:
Sektor 451 (dez) Byte $1F (hex) von AD, D3, 1F in EA, EA, EA ändern (unendl. Zeit)

Nachtrag zur Bestell-Liste:

Eternal Dagger
(Übersetzung in Deutsch: Hauptbuch, Handbuch für Strategie, Taktik, Tips und schlaue Manöver, Cheats und Befehle, 42 Seiten)

DM 10 Unkostenbeitrag

The Jewels of Darkness
(deutsche Anleitung, Beschreibung der Scenarios, Tips und Kommandos. Durch den Lenslokmodus für Raubkopien nicht geeignet)

DM 2.50 Unkostenbeitrag

Ich warten immer noch auf Eure Cheats und Tips!! Ich weiß, ich weiß – keine Zeit. Bedenkt einmal, wenn ich das auch sagen würde und die „Spiele-Ecke“ deswegen abgebe. Aber vielleicht wollt ihr sie ja gar nicht! Das würde mich tatsächlich mal interessieren! Wenn ihr sie aber weiterhin haben wollt, dann müßte in Zukunft ein wenig mehr Beteiligung von euch kommen. Der ABBUC lebt zwar nicht von der „Spiele-Ecke“, aber eine Bereicherung des Magazins ist sie doch allemal, oder?

Jedenfalls gilt mein besonderer Dank allen, die mir bisher geholfen haben, damit diese Rubrik nicht immer mehr zusammenschrumpft.

Für heute sage ich Tschüss…

Waltraud

 

MyDOS Unterverzeichnisse

Heute möchte ich den Umgang mit Unterverzeichnissen und MyDOS erläutern, wie es im letzten ABBUC-Magazin # 30 von Karl Pelzer bzw. Wolfgang Burger gewünscht wurde. Ich setze allerdings vorraus, daß der Umgang mit einem DOS bereits geläufig ist.

Bekanntlich benötigt man (genauer: Das Disk-Operating-System = DOS) auf der Diskette einen Bereich, in dem die wichtigsten Informationen der abgespeicherten Dateien aufbewahrt werden können. Dieser „heißt“ Inhaltsverzeichnis, Directory oder auch Index. Er kann und darf unter normalen Umständen nicht von einer Datei belegt werden. Ebenso gibt es eine Art „Bitmap“, in der vermerkt ist, welche Sektoren belegt und welche frei sind. Diesen Bereich nennt man (beim ATARI XL) „Volume Table Of Contents“, oder krz: VTOC. Während ein Direktory immer 8 Sektoren lang ist, kann die VTOC theoretisch fast beliebig viele Sektoren lang sein. Bei einer normalen Single-Density Disk  belegt die VTOC gerade mal einen Sektor.

Dazu sei gesagt, daß z.B. DOS 2.5 keine anderen Formate als Single- und Medium Density verwalten kann (bei MD gibt’s aber eine zweite VTOC, um die zusätzlichen Sektoren zu verwalten). Wichtig ist nur, daß bei nahezu jedem 2.x-kompatiblen DOS das Direktory ab Sektor 361 beginnt und mit Sektor 368 endet. In einem Verzeichnissektor finden max. 8 Einträge Platz, wobei ein Eintrag aus Dateinamen, Extender, Startsektor, Länge (in Sektoren) und dem Status-Byte besteht. Jeder Eintrag belegt 16 Bytes (8 Einträge * 16 Bytes = 128 Bytes). Bei DD-Sehtoren werden von anderen DOSen meines Wissens nur die unteren 128 Bytes benutzt). Diese 16 Bytes setzen sich zusammen aus: Name (8), Extender (3), Startsektor (2), Länge (8) und dem Status (1) = 16 Bytes.

Uns soll heute nur das Statusbyte interessieren. Ist es $00, sagt dieses dem DOS, daß keine weiteren Einträge mehr im Direktory stehen. Ebenso wird hier festgehalten, ob der aktuelle Eintrag gelöscht ($80), schreibgeschützt, oder zum Schreiben geöffnet ist.

Der Programmierer des MyDOS ging hier einen „fast“ neuen Weg: Er „schuf“ einen neuen Statuscode welcher aussagt, daß der aktuelle Eintrag keine Datei, sondern der Name eines neuen (Unter-) Verzeichnisses ist. Der Startsektor zeigt nun auf den Anfang des neuen Direktorys, die Länge ist immer 8. Einige Leute kennen vielleicht noch die Pokes, mit denen das DOS 2.0 oder 2.5 angewiesen werden konnte, einen neuen Bereich als Verzeichnis zu nutzen. So konnte zu damaligen „Kopierschutzzwecken“ die eigentliche Programmdatei in einem neuen Direktory stehen. Erst beim Laden des Autorun.sys (im „richtigen“ Verzeichnis) wurde der Directorystart „umgepoked“ und das Hauptprogramm geladen.

Nun zurück zum MyDOS. Die „Kommunikation“ mit dem DOS geschieht jo über das Betriebssystem und die Input-Output-Control-Blocks, kurz IOCB. Bestimmte Kommandos haben sich (zum Glück!) eingebürgert, sie sind also zum Standard geworden. Dazu zählen die Kommandos Open, Close, Get, Put, Status und „Spezial“. In der Handlertabelle stehen die entsprechenden Routineadressen minus 1. Alle nicht-Standard-Kommandos gehen über den „Spezial“-Vektor, in dem dann , in der Gerätetreiberroutine das Kommando manuell ausgewertet werden muß. Dort (und nur dort!) werden dann die Spezialkommandos bearbeitet. Beim DOS z. B. Schreibschutz aktivieren/deaktivieren, Date
i löschen, Diskette formatieren usw. Unter MyDOS

besteht so die Möglichkeit mit

„XIO 34,#1,8,0,“D8:SUBDIR“‚

ein Unterverzeichnis zu erzeugen, und zwar im Hauptdirektory der RAMDisk. Der BASIC-Befehl

„OPEN #1,8,0,“D1:TEST“ entspricht exakt einem

„XIO 3,#1,8,0,“D1:TEST“, da die „3“ das Kommando für Open ist!

Das MyDOS setzt seinen internen Direktory-Anfangspointer bei der Neuinitialisierung (z. B. System-Reset) auf den Anfang des Hauptverzeichnisses zurück (361 = $169). Ein Unterverzeichnis wird im Inhaltsverzeichnis mit einem vorangestellten „:“‚ gekennzeichnet. also z. B.. „:SUBDIR 0008“ (MyDOS 4.50 arbeitet mit einer 4-stelligen Sektoranzahl). Um nun auf die Datei TEST, welche im Verzeichnis SUBDIR steht (das wiederum in einem Verzeichnis stehen kann!) zuzugreifen, können wir als „Dateiname“ z. B. die Zeichenkette „D8:SUBDIR:TEST“ oder auch „D8:SUBDIR>TEST“ benutzen! Das MyDOS sucht im Hauptverzeichnis auf Laufwerk 8 nach dem Verzeichnis SUBDIR, und dort nach der Datei „TEST“! MyDOS unterscheidet übrigens zwischen Groß- und Kleinschrift. so sind „test“, „Test“ und „TEST“ unterschiedliche Dateien. Als Bonbon bietet MyDOS im Menü die Funktion „Pick Dir.“, die im BASIC mit „XIO 41,#1,0,0,“D8:SUBDIR“ ausgeführt werden kann. Nun beziehen sich alle Dateioperationen OHNE Laufwerksangabe auf dieses Verzeichnis! So würde „OPEN #1,4,0,“D:TEST“ die Datei „TEST“ im Verzeichnis „SUBDIR“ in der RAMDisk öffnen, während „D1:TEST“ in Hauptverzeichnis von LW 1 sucht! Unter TurboBASIC gibt „DIR „D8:SUBDIR>*.*“ den Inhalt des Direktorys „SUBDIR“ aus!

WICHTIGE HINWEISE!

Sollte das Defaultverzeichnis auf ein Subdir gesetzt sein, so darf auf keinen Fall die betreffende Diskette gewechselt werden und z. B. mit „OPEN #1,8,0,“D:TEST“ eine Datei geschrieben werden, da der Direktory-Anfangszeiger nicht automatisch zurückgesetzt wird! Im schlimmsten Fall befindet sich an der Stelle, wo auf der „alten“ Diskette das Unterverzeichnis begann, auf der „neuen“ Diskette ein Datensektor. Dieser wird dann gnadenlos zerstört, da das MyDOS immer noch von einem Verzeichnis ausgeht! Abhilfe schafft hier ein Druck auf Reset oder „XIO 41,#1,0,0,’D1:“! Ebenso darf z. B. vom DOS 2.5 nicht auf den Namen eines Subdirektorys zugegriffen werden. Ein MyDOS-Verzeichnisname erscheint beim DOS 2.5 als normaler Dateiname. Ein Schreibzugriff von einem anderen DOS als MyDOS macht diesem Verzeichnis (und den dort enthaltenen Verzeichnissen/Dateien) mit Sicherheit den Garaus! Wenn man diese Punkte beachtet kann nichts schieflaufen.

Noch eine Besonderheit des MyDOS: Das Dateiformat ist zu DOS 2.5 kompatibel, zumindest bei Single Density. Das MD-Format des MyDOS ist NICHT zu DOS 2.5 kompatibel. Bei anderen Diskettenformaten verzichtet das MyDOS auf die File-Information in den Sektorlinks! So enthält ein Datensektor in den letzten 3 Bytes die Sektornummer des Folgesektors, wobei im Highbyte die Dateinummer kodiert ist, sowie die Anzahl der gültigen Datenbytes in diesem Sektor. Ist der letzte Wert z. B. 10, bedeutet dies. das die ersten 10 Bytes zur Datei gehören und die restlichen nicht belegt sind. Nun, für den Sektor-Link stehen 2 Bytes (= 16 Bit) zur Verfügung. Für die Dateinummer (64 Dateien = 0 bis 63) benötigen wir 6 Bit, bleiben 10 für die Nummer des Folgesektors. Daher kann man unter Medium Density auch nur 1024 (von 1040) Sektoren benutzen – bei DOS 2.5! MyDOS verwendet aber (bei nicht-DOS 2.5-kompatiblen Formaten) einen „echten“ 16-Bit Sektor Link, so daß maximal 65536 Sektoren in Double-Density angesprochen werden können!

Nun möchte ich noch kurz die Nutzung von Unterverzeichnissen in meinem Assembler ansprechen. Beim Anwählen der Fileselektbox wird auf das Hauptverzeichnis der zuletzt angesprochenen Diskettenstation umgeschaltet. Unterverzeichnisse erscheinen mit einem „:SUB“ anstelle der Sektorlänge („0008“) und werden, entsprechender Sortiermode eingestellt, auch vor den „normalen“ Dateinamen angezeigt. Wenn der Auswahlbalken auf einem Unterverzeichnis steht, genügt ein <RETURN> um in das Verzeichnis zu wechseln. Wenn die Laufwerksnummer gewechselt wird, gelangt man automatisch wieder in das Hauptverzeichnis. Nach einem Diskettenwechsel muß man allerdings auch hier durch Anwahl der Laufwerksnummer in das Hauptverzeichnis zurückschalten um „Datenchaos“ zu vermeiden.

Das MyDOS ist beim ABBUC PD-Service erhältlich. Eine DEUTSCHE Anleitung ist entweder auf Diskette oder ausgedruckt und gebunden für 5 DM erhältlich. Auf der MyDOS Systemdiskette befinden sich die geARCten DOC- und Sourcefiles im MAC/65-Format!

Torsten Karwoth

Der Unriagh Adventure Maker

Einige werden jetzt entsetzt „nein, nicht schon wieder ein Adventurekurs“ schreien. Und trotzdem solltet Ihr weiterlesen, weil…

Nun, nicht nur weil es sich bei Unriagh um ein etwas anderes Adventure als üblich handelt, sondern weil mittels des Adventuremakers der Aufwand, ein solches Adventure zu „schreiben“, um ein vielfaches geringer ist, als bei einem normalen Adventure.

Gedacht ist der Adventure Maker für Leute die ein paar tolle Bilder haben, die sie gerne irgendwie verwenden wollen, oder für Leute denen entweder die Zeit oder die Kenntnis fehlt mal ein eigenes Adventure herzustellen.

Ganz besonders viel Spaß werden Leute mit einem ausgeprägten Sammeltrieb beim Erstellen von Räumen haben, denn wer gerne Dinge sucht, der versteckt sie auch gern.

Für die, die Unriagh nicht kennen, möchte ich kurz die Besonderheit erklären. Es gibt in diesem Spiel keinen Pharser im eigentlichen Sinne, sondern 11 Tätigkeitsbefehle die mit einem Pfeil mittels Joystick oder Maus an einem Gegenstand ausgeführt werden können. Die Gegenstände sind fast frei wählbar und werden ab Zeile 8000 in Data-Zeilen abgelegt.

Auf diese Art und Weise muß nicht programmiert werden. Das Hauptprogramm MAIN.TUR läßt jedes denkbare Adventure zu. Man benötigt also nur ein paar Bilder, und eine Spielidee.

 

So nun gehts los:

  1. Spiel ausdenken und Laufplan erstellen
  2. Bilder erstellen und im Koalaformat auf Disk abspeichern (ca. 30 Bilder passen auf eine Seite, allerdings nur ca. 15 auf Seite eins). Dabei Raumbilder mit zwei Buchstaben, Gegenerbilder mit zweistelligen Zahlen benennen.
  3. Zum Erstellen der Räume den Adventure Maker laden. Gegenstände nicht zu schwer verstecken, Schlüssel nicht in verschlossenen Gegenständen verstecken. Bei übereinanderliegenden Gegenständen wird nur der erste sichtbar, alle anderen erst nach Zwerschlagen, Drücken, Nehmen.
    Bilder können natürlich mehrmals verwendet werden. Jeder Raum bekommt zwei Dateien mit jeweils einem Sektor. (.DAT und .DT2 während des Spielens)
  4. Ladbare Texte sofort aufschreiben und im Anschluß mittels Texteditor erstellen. Dieser Texteditor sollte auf jeder Seite des Spiels sein. Der Text kann dann jederzeit noch verändert werden, indem man Texte an die Datazeilen anfügt, oder bestehenden abändert. Alle Texte müssen die Gegenstandsnummer vorab haben.

Anschließend das Programm mit RUN starten (es erzeugt die Textdatei T.). Bei jeder Änderung der Datazeilen muß das Programm erneut gestartet werden.

BENÖTIGTE PROGRAMME AUF SEITE 1:

AUTORUN.BAS (Startprogramm mit Vorgeschichte)
DATA.BIN (Displaylist, Player-Raumdaten)
MAIN.TUR (Hauptprogramm)
TEXT.BAS (Texteditor)
T. (Textdatei)

Ich hatte oben geschrieben, daß die Gegenstände frei wählbar sind. Da
s stimmt nicht ganz, da einige Gegenstandsnummern bereits für Funktionen im Programm vergeben sind. Die Texte allerdings können verändert werden.

So können die Schlüssel (31 – 33) auch andere Namen bekommen, nur es sind eben Schlüssel, die mit dem Brecheisen (48) übergangen werden. Es folgt eine Liste mit den Gegenständen, die im Programm abgefragt werden und damit bestimmte Funktionen erfüllen.

Gegenstände und Positionen im Hauptprogramm und deren Funktion beim Benutzen.

NUMMERN AB ZEILE 8000

NR. GEGENSTAND POSITION FUNKTION
0 – 7 WAFFEN
11 – 15 RÜSTUNG
8 ARMBRUST 3330
9 SCHILD 3335
10 GASMASKE 3102, 3103
16 GIFTGAS 3102, 3103
17 ANODENPUL. 3104 TÖTET GEGNER 1 – 3
18 UHR 7550 ZEIGT RESTZEIT VON 3 MINUTEN
19 BRILLE 7581 WICHTIG UM IN RAUM 62 ABZULEGEN
20 FELL ERSCHEINT WENN GEGNER EINE RÜSTUNG > 1 ODER < 5 HAT
21 TOTER GEG. 6461 LIEGT NACH KAMPF IM RAUM
22 RISKPAD 6290 +/- LEBEN- BZW. STÄRKEPUNKTE
23 FACKEL 6325 ERHELLT DEN RAUM
24 BRECHEISEN 6720 ÖFFNET ALLE MIT 30 – 33 VERSCHLOSSENEN TÜREN
25 LEERE FLASCHE 3103; 7869 DIE FLASCHEN IN 60 – 62 WERDEN ES NACH TRINKEN
26 HÄNDLER 6571 SONDERGEGENSTAND
27 SEHEN = GEHN 6577 SONDERGEGENSTAND
28 FALLE 6573 SONDERGEGENSTAND
44 – 47 ZAUBERGGNST. 3101 , 6080 – 6160
70 – 73 ZAUBERWORT 3101 , 6080 – 6160
60 – 62 TRINKBAR 6825 – 6830
63 – 65 TASTER 5715 – 5725
67 ZEITTÜR 6406 EINE TÜR MIT FARBWECHSEL
1 – 69.T HÖRBRE TEXTE
> 69 LADBRE TEXTE 6581

Nun gibt es noch drei Sondergegenstände:

Der Händler:
Er tauscht einen Gegenstand in der linken Hand gegen einen anderen um.

Die Falle:
Es kommen solange Missels bis einer abgewehrt wird.

Sehen = Gehen:
Dieser Gegenstand führt beim Suchen (und nur beim Suchen) ins nächste Bild.

Die Flasche in Zeile 60 gibt + Leben
Die Flasche in Zeile 61 gibt – Leben
Die Flasche in Zeile 62 gibt – Stärke

Wenn Ihr den ladbaren Texten 74 bzw. 80 den Status TRINKEN gebt (keinesfalls NEHMEN), haben dies ebenfalls eine Funktion.

74 (z. B. eine Quelle) gibt + Leben
80 (z. B. ein Tümpel) gibt – Leben

Die Zaubergegenstände ergeben mit den jeweiligen Sprüchen folgendes:
Nr. 44 + 70 ein Schild
Nr. 45 + 71 tötet Gegner
Nr. 46 + 72 + Stärke
Nr. 47 + 73 einen besonderen Schlüssel
Bleiben als folgende frei: 26 – 29, 34 – 43 und 48 – 59 (insgesamt 26).

Nun werdet Ihr sagen: „Da bleibt ja nicht viel über.“, aber Ihr solltet bedenken, daß nur die nehmbaren Gegenstände bei 0 – 73 sein sollten. Da diese, wenn sie im Rucksack sind, aus der Datazeile gelesen werden. Dinge die nur sichtbar, oder trinkbar sind können als ladbare Texte (ab 74) viel komplexer abgelegt werden.
Hörbare Dinge müssen ohnehin ladbare Texte (1 – 69) sein.

6448 Wenn Raum 0 geladen werden soll, wird zusätzlich die Datei DATA2.BIN geladen.
6407 Wenn Raum 63 geladen werden soll, wird Programm END.TUR geladen (SPIELENDE)
7581 Wenn Raum 62 erscheint, muß Gegenstand 19 abgelegt werden, sonst wird der Spieler getötet (die Schlüsselmeldungen stehen in Zeile 6680 – 6770).

Im Hauptprogramm sind keine REM-Zeilen enthalten, um Platz zu sparen.

Beschreibung Adventure Maker

Nach dem Laden Bildname mit 2 Buchstaben eingeben, anschließend die Raum Nr., und die Diskseite auf der sich das Bild befindet. Jetzt wird das Bild geladen und man kann schon vorhandene alte Daten laden. Diese hat man am Anfang wahrscheinlich nocht nicht.

Wenn ein Bild mehrmals verwendet wird, ist dies sehr nützlich.

Jetzt erscheint das Bild und ein kleines Menü:

  • Neue Daten Laden:
    jetzt kann man immer noch alte Daten laden
  • Abbruch:
    Abbrechen wenn man etwas falsch gemacht hat (man braucht nicht neu starten)
  • Weiter:
    Nächsten Gegenstand eingeben
  • Überlagern:
    dem letzten Gegenstand wird ein anderer mit gleichen Positionsdaten überlagert. Der untere ist nun erst sichtbar wenn der obere verschwunden ist, s. o.
  • Fertig:
    Alle Gegenstände sind eingegeben.
  • Test:
    Hier können wir uns alle Daten in Dezimalform ansehen.
  • Löschen:
    Der nebenstehende Zähler wird um den letzten Gegenstand zurück gesetzt.

Wenn wir nun <W> für weiter eingeben, erscheint ein Pfeil und zwei Zahlen, die die Position des Feiles angeben.

Nun die obere linke Ecke des Gegenstandes anklicken, anschließend die untere rechte Ecke. Jetzt ist dieser Gegenstand mit einem nicht sichtbaren Rechteck erfaßt.

Ein weiteres Menü erscheint, in dem bestimmt werden soll, was mit diesem Gegenstand gemacht werden kann. Einen Gegenstand den man nehmen kann, ist natürlich auch mit Sehen zu erreichen (nicht umgekehrt).

Meist erscheinen weitere Fragen, um dem Gegenstand den richtigen Status zuzuschreiben. Das Wort Gegenstand ist eigentlich nicht ganz richtig, da es ja noch die Option Hören gibt. Leider bedecken diese großen Hörflächen, wenn man sie zu spät eingibt, die anderen Gegenstände. Also hörbare Dinge immer zuerst eingeben. Dies sich übrigens im
mer ladbare Texte, die nicht im Hauptprogramm untergebracht werden, sondern extra auf der Disk gespeichert sind.

Waffen und Rüstung haben automatisch den Status NEHMEN. Trinkbare Dinge müssen nicht immer nehmbar sein.

Nach dieser Eingabe wird meist nach einem Schlüssel gefragt. Hiermit kann man einen Gegenstand verschließen. Dieser ist nun erst sichtbar oder nehmbar, wenn man ihn vorher mit dem richtigen Schlüssel geöffnet hat. Z. B. in einer Truhe liegt ein Buch, eine Flasche und ein Messer. Die Truhe soll verschloßen sein. Wir überlagern Truhe, Flasche, Buch, Messer und geben bei dem letzten Gegenstand einen Schlüssel an (alle Gegenstände, mit Ausnahme der Truhe, müssen nehmbar sein).

Anschließend erscheint das Bild wieder. Jetzt können weitere Gegenstände eingegeben werden.

Wenn wir mit allen Gegenständen FERTIG sind, werden wir nach einer Rücktür gefragt, dies ist die schmale Spalte am unteren Bildrand, mit der man zurückgehen kann, wenn wir das wollen.

Dann werden wir noch gefragt, ob ein Monster im Raum ist. Dies können wir zwar immer beneinen, hätten dann aber ein viel zu leichtes Adventure. Man kann ja auch ein paar leichte Gegner herstellen. Wissen sollte man aber, welche Waffe der Spieler zu diesem Zeitpunkt wenn er gegen dieses Monster kämpft, benutzen kann. Danach kann man die rechte und linke Angriffsgrenze bestimmen.

Jetzt sind wir aber wirklich mit dem Raum fertig, nur noch eingeben, ob es die eingestellte Raum Nr. sein soll, und die Daten werden als …DAT gespeichert.

Zu Drücken gibt es noch eine Besonderheit die beachtet werden sollte. Grundsätzlich sollten nur Gegenstände, die größer als 65 sind, gedrückt werden können. Wenn bei der Frage, in welchen Raum dieses führt, eine Zahl eingegeben wird, hat der Gegenstand den Status Drücken = Gehen. Gibt man 0 ein, wird der darunterliegende Gegenstand sichtbar (man muß natürlich vorher auch einen anderen unterlegt haben). Auch der Schlüssel ist etwas anders als bei anderen Gegenständen. Jeder drückbare Gegenstand hat von vorneherein eine 90 als Schlüssel. Dies entspricht der 0 bei anderen Gegenständen. Eigentlich bräuchte ich dies nicht zu erwähnen, da der Editor dies automatisch macht, aber falls sich jemand mit TEST die Daten ansieht, soll er sich nicht wundern.

So, nun gibt es noch zusätzlich 3 verschiedene Tasterarten:

  • Taster 1 (63):
    schaltet das Licht an/aus. Dazu muß das Bild komplett um 3 Graustufen zu dunkel abgespeichert werden (die gleiche Wirkung wie dieser Taster hat eine Fackel (23) in der linken Hand).
  • Taster 2 (64):
    öffnet/verschließt die Rücktür und zählt den codezähler +/-1 (zum Codezähler kommen wir gleich).
  • Taster 3 (65):
    zählt den Codezähler +1.

Dieser Codezähler wird bei DRÜCKEN mit dem Schlüssel verglichen. Man kann auf diese Weise z. B. bei einer Tastatur eine mehrstellige Abfrage machen. Vielleicht ein Beispiel dazu: Wir sehen das Bild eines Straßenbahn-Cockpits. Es soll erst die Tür verschlossen werden und dann auf dem sichtbaren Tastenfeld nacheinander die Kombination 5, 7, 1 gedrückt werden. Sobald dies geschehen, den ebenfalls sichtbaren hebel drücken. Nun soll der nächste Raum erscheinen (Straßenbahn fährt los und kommt irgendwo an).

Um all dies zu erreichen, bekommt der (natürlich auch sichtbare) Türtaster die Gegenstand Nr. 64 und den Schlüsselcode 0. Jetzt im Tastaturfeld jede Taste die Gegenstand Nr. 65, die Tasten mit der Aufschrift 5, 7, 1 bekommen als Schlüssel 1, 2, 3 (in der Reichenfolge, wie sie gedrückt werden sollen). Der erste Taster ist also auch schon mit 1 verschlossen, da ja erst die Tür verschlossen werden soll. Nun den Hebel mit einer Zahl > 65 belegen, eine Raum-Nr. eingeben UND den Schlüsselcode 4 (vorher muß schließlich 571 eingegeben werden).

Ich hoffe, es war nicht zu kompliziert.

Die Programme findet Ihr auf der Magazindiskette. Sollte jemand noch irgendeinen besonderen Gedanken verwirklichen wollen, würde ich mich freuen, wenn Ihr Euch bei mir meldet.

Uwe Hartwig
Tiefestr. 10
3160 Lehrte
05132/55771

C-Kurs (Teil 5)

1. C-Entwicklung und Standard

In jeder Programmiersprache werden Variablen (Namen für Werte, die in bestimmten Speicherstellen abgelegt werden) benutzt, um eine verständliche Übersicht über das jeweilige Programm zu haben. In C gibt es hier eine Sonderform von Variablen, nämlich Zeiger. Der Name sagt eigentlich schon alles, die Variable zeigt auf eine bestimmte Speicherstelle:

int i, *zeiger; Deklaration der Var.
i=5; Wertzuweisung
zeiger=&i; Die Variable zeiger ‚zeigt‘ hier auf den Inhalt der Variablen i.
printf(„%d %d“,i,zeiger); Die Ausgabe besteht hier aus der Variablen i und zeiger. Sie geben beide den selben Wert 5 aus.

Was kann man aber damit erreichen, wenn man Zeiger einsetzt?

In unserem Animations-Programm habe ich sie so verwendet, daß sie als Startadresse für das Ablegen von Daten benutzt werden. Dabei ist eine Besonderheit zu beachten: Der Compiler muß natürlich wissen, wo die Adresse (worauf ja die Zeigervariable verweist) beginnt. Dazu benötigt der Computer sagen wir ‚Anhaltspunkte‘, die er vor dem Datenfeld finden muß. Die Bedeutung interessiert uns hier nicht weiter, aber die Anzahl Bytes die dabei verwendet werden. Es werden jeweils 6 Bytes vorangestellt, die nicht verändert oder überschreiben werden dürfen (das trifft jedenfalls auf den DVC-Compiler zu). Wenn wir also Daten irgendwo mit Hilfe von Zeiger ablegen wollen, müssen wir diese 6 Bytes mit berücksichtigen.

Also: Datenfeldbeginn: hex 0x0600
Zeigervariable: hex 0x5FA
Startadresse für Datenfeld: 0x5FA+6 Bytes := hex 0x0600

Mit ein wenig Übung hat man dann aber die Sache fest im Griff.

Der Vorteil bei der Anwendung von Zeigern ist, daß wir Daten fast überall ablegen und gleichzeitig verändern können. Das nennt man dann eine dynamische Datenstruktur. Das Gegenteil wäre eine statische Struktur, was bedeutet, das die verwendeten Werte während des Programmablaufs nicht verändert werden können. Als Beispiel können wir eine Datenbank nennen, wo ja ständig neue Daten hinzugefügt, alte entfernt oder überschrieben werden. Mit Hilfe der Zeiger kann man also ganz bestimmte Speicherstellen während des Programmablaufs verändern.

2. Compiler (DVC)
Aufbau und Funktion

Beim DVC-Compiler gibt’s noch die <replace> Funktion.

Die funktioniert folgendermaßen:

x-Taste Funktionsaufruf
Es erscheint <replace> Hier gebt Ihr den Wert oder das Wo
rt ein, das Ihr ändern wollt (1 Wort oder Wert!!) dann <Return>
Es erscheint <with>: Hier gebt Ihr den Wert oder das Wort ein, das anstelle des alten Begriffs eingesetzt werden soll dann <Return>
Es erscheint <starting line number>: Hier gebt Ihr die Anfangszeile ein, ab der die Daten ausgetauscht werden sollen

Jetzt erscheint die erste Zeile mit den zu verändernden Daten. Soll jetzt der jeweilige Inhalt ausgetauscht werden, bestätigt das mit ‚Y‘ oder wenn nicht mit ‚N‘.

 

3. C-Programmierung mit DVC

Es handelt sich hier um eine Animation, die per Joystick nach links oder rechts bewegt werden kann. Hierbei verwenden wir ein paar neue Funktionen, die Euch das Programmieren mit C erleichtern sollen. Einmal geht es darum die umständlichen Array (Feld)-Daten zu vermeiden (in BASIC mit DATA). Dazu müßt Ihr einen Assembler verwenden. Ideal wäre in diesem Fall der ATMAS II.

Mit dem ATMAS II erstellt Ihr die jeweiligen Quelltexte, assembliert sie, und kopiert sie auf die DVC-Disk.

Funktions(Befehls)-Liste:

a. int b. char
c. poke () d. graphics ()
e. copen () f. bgets ()
g. close () h. move ()
i. while () j. if ()
k. for () l. peek ()
m. return ()

 

1000 /* Animations-Programm */
1010
1020 main() $(
1030
1040 int ramtop,pmbase,ypos,xpos,i;
1050
1060 int len,len 1,len2,iocb;
1070
1080 char *start,*invstart;
1090
1100 char *data,*invdata,place;
1110
1120 ramtop=peek(106)-16 Seitenanzahl der RAM-PAGES:
(192)-16 Obergrenze des verfügbaren RAM’s.
Eine RAM-PAGE: 256 Bytes.
Die 16 werden wegen der jeweiligen Grafikstufe abgezogen, da ja die Bilder nur als Kopie aus dem Speicher in den Bildschirmspeicher eingeblendet werden. Bei höheren Grafik-Modis muß der abgezogene RAM-Bereich entsprechend größer sein.
1130
1140 pmbase=ramtop*256; Beginn des Player-Missile-Feldes.
1150
1160 func1(i,pmbase); Die Unterfunktion funk1(… mit Parameter wird aufgerufen. Die Werte in Klammern (siehe C-Kurs 4) werden an die Unterfunktion übergeben.
1170
1180 poke(54279,ramtop) Die ersten 8 Bit des Player-Missile-Feldes werden hier abgelegt, damit der XL weiß, wo das Feld beginnt.
1190
1200 graphics(1) Grafikstufe mit Textfenster
1210
1220 poke(559,62) Der DMA (Direct Memory-Access) des Antig wird ‚eingestellt‘.
1230
1240 ypos=1152; xpos=110 Der vertikale (ypos) und der horizontale Wert (xpos) werden ‚eingestellt‘.
1250
1260 start=0x5FA;invstart=0x62A; Die Startadresse der jeweiligen Zeiger werden hier den jeweiligen Variablen zugewiesen. Immer mit der Beachtung, daß 6 Bytes für die Zeiger selbst verwendet werden!
ZEIGERADRESSE + 6 BYTES = STARTADRESSE
start = 0x5FA + 6 Bytes » Datenbeginn
1270
1280 data=0xB004;invdata=0xB064;
1290
1300 place=0xB47A;
1310
1320 len=27; len1=102; len2=24; Die Länge der Datenfelder werden festgelegt. Datenlänge + 6 Bytes
len = 21 Daten + 6 Bytes für Zeiger = 27.
Die Assemblerroutine func2 und func3 102: Die Datenlänge für den Player 0
1330 iocb=1;
1340
1350 copen(„D:DRAWING.OBJ“,’r‘); Die Datei „D:DRAWING.OBJ“ wird geöffnet und mit ‚r‘ ausgelesen. Mit ‚w‘ könnten wir in die Datei schreiben. Zu den Funktionen ‚u‘ (update) und ‚a‘ (append) kommen wir später. Wichtig ist die Großschreibung der Datei (D:XXXXX.XXX)!
1360
1370 bgets(start,len,iocb); Die Daten werden einzeln (jeweils 1 Byte) ausgelesen und ab der Speicherstelle, auf die der Zeiger ’start‘ verweist, wieder abgelegt. Die Länge bestimmt die Anzahl der Bytes und iocb den jeweils benutzten Kanal (Datenleitung).
1380
1390 close(iocb); Der angewählte Kanal wird wieder geschlossen.
1400
1410 copen(„D:INVDRASING.OBJ“,’r‘);
1420
1430 bgets(invstart,len,iocb);
1440
1450 close(iocb);
1460
1470 copen(„D:COWBOY.OBJ“,’r‘);
1480
1490 bgets(data,len1,iocb);
1500
1510 clsoe(iocb);
1520
1530 copen(„D:INVCOW BOY.OBJ“,’r‘);
1540
1550 bgets(invdata,len1,iocb);
1560
1570 close(iocb);
1580
1590 move(data+6,place+6,len2); Die Daten mit der Anzahl len2 (24) werden von der Speicherstelle data + 6 (wegen der 6 Bytes, die von den Zeigern verwendet werden) nach der Speicherstelle place+6 verschoben.
1600
1610 poke(0x0620,10);poke(0x0660,106); Die Speicherstelle 0x0620 wird von der ersten Assemblerroutine verwendet, um jeweils die richtigen Bilddaten an den Bildschirmspeicher zu übermitteln. Dafür muß aber beim Programmstart die Speicherstelle des ersten Player-Wertes schon eingestellt sein. Die Bilddaten fangen bei 0xB00A an, also verändert sich nur das LOW-Byte von der Adresse 0xB0(0A), (0B), (0C),… Nach dem dritten Bild muß aber wieder der Anfangswert gesetzt werden für das erste Bild! Die genaue Erklärung erfolgt in Assembler-Programmierung mit ATMAS II.
Bei der Speicherstelle 0x0660 verhält es sich genauso.
1620
1630 poke(53256,0) Größe von Player 0
1640
1650 poke(704,2*14) Farbe Player 0
1660
1670 poke(53248,xpos) Horizontalpos.
1680
1690 poke(53277,3) Grafik einschalten
1700
1710 while(1) $( Endlosschleife
1720
1730 if(xpos>44 && stick(0)==11) $(
1740
1750 func2();
1760
1770 if(peek(0x603)==82) $( Diese Adresse beinhaltet das LOW-Byte
Bilddatenanfang: 0xB0(0A) bis B0 (69) (96 Bilddaten). Diese werden dann byteweise in den Bildspeicher kopiert. Es handelt sich um 4 Bilder zu je 24 Bytes. Wenn die Animation beginnt, werden immer 24 Daten in den Bildspeicher kopiert für jeweils eine Bewegung. Ist das dritte Bild eingeblendet, muß ja wieder das erste Bild erscheinen (ist klar…). Also 0xB00A + 3 * 24 = 0xB052 hex. 52 = dez. 82
1780
1790 poke(0x0603,10); poke(0x620,10) Der Anfangswert der Bilddaten wird gesetzt:
0xB0(0A) = (Sp.0x603). Der ‚Addierer‘ für die Bilddaten wird auch auf den entsprechenden Anfangswert gesetzt (0x620,10). Siehe Assemblerprogrammierung mit ATMAS II!
1800
1810 $) if-Schleifenende
Wenn der Wert von xpos > 44 und die Joystickstellung 11 beträgt, dann… Rufe Unterfunktion (Assemblerroutine) auf. Wenn der Inhalt der Sp. 0x0603 = 82 ist, dann schreibe die hinter poke folgenden Werte hinein.
1820
1830 for(i=0;i<300;i++); Zeitschleife
Die Bewegung der Animation würde sonst zu schnell verlaufen.
1840
1850 -xpos; Der Inhalt der Variablen wird geändert (nicht bei xpos- !!)
1860
1870 poke(53248,xpos); Die neue Horizontalposition wird eingeschrieben.
1880
1890 $) if-Schleifenende
1900
1910 if(pos<220 && stick(0)==7) $(
1920
1930 func3();
1940
1950 if(peek(0x0633)==178) $(
1960
1970 poke(0x0633,106); poke(0x0660,106); Es handelt sich genauso um dasselbe Prinzip wie bei den oben genannten Speicherstellen (0x603) (0x620)
1980
1990 $) if-Schleifenende
2000
2010 for(i=0;i<300,i++) $(
2020
2030 ++xpos;
2040
2050 poke(53248,xpos);
2060
2070 $) if-Schleifenende
2080
2090 $) while-Schleifenende
2100
2110 $) main-Blockende
2120
2130 func1(i,pmbase) int i,pmbase; $( Die übergebenen Parameter müssen für die Unterfunktion deklariert werden, damit sie innerhalb der Funktion einsetzbar sind.
2140 for(i=pmbase;i<pmbase+2049;i++) $(
2150
2160 poke(i,0);
2170
2180 $) for-Schleifenende
2190
2200 return; Die ‚Rücksprunganweisung‘ ohne Rückgabewerte wird ausgeführt. Das Programm wird in Zelle 1170 fortgesetzt.
2210
2220 $) Funktions-Blockende
2230
2240 func2() asm0x0600; > Startadresse
2250
2260 func3() asm0x0630; > Startadresse

Programmende


 

4. Compiler
(Allgemeiner Aufbau u. Funktion)

Der Stack wird ja eigentlich hauptsächlich eingesetzt, um Zwischenwerte ‚festzuhalten‘. Z. B. während eines Spieles wechselt sich andauernd das Spielfeld. Hier werden neue und alte Daten zwischen den Registern ausgetauscht und verschoben. Hier hilft der Stack der CPU, um alte Daten wieder in die Register zu bekommen. Die alten Daten werden auf den Stack gelegt. Danach können neue Werte in die Register geschrieben und bearbeitet werden. Benötigt die CPU jetzt die ‚alten‘ Werte, holt sie sie sich nach dem LIFO-Prinzip vom Stack. Da sich die Adresse des Stack ständig ändert, benutzt die CPU den Stapelzeiger als ‚Orientierungshilfe‘. Der Parser kann also mit Hilfe des Stacks über die CPU sich die richtigen Werte und Adressen für den Ableitungsbaum ‚heraussuchen‘.

 

 

5. Einführung in die Maschinensprache

Bei der letzten Assemblerroutine haben wir eine Schleife mit dem Verzweigungsbefehl BPL verwendet. Dazu folgender Hinweis:

  1. BPL, wenn Ergebnis pos – Negativ-Flag: 0
  2. BMI, wenn Ergebnis neg – Negativ-Flag: 1

Wenn bei einer Rechenoperation eine positive oder negative Zahl entsteht, wird das zuständige Bit (Flag) gesetzt. Diese Flags werden je nach Befehl nach einer Operation abgefragt. Bei den Befehlen BPL/BMI ist das das N-Flag.

Weitere Verzweigungsbefehle sind BEQ und BNE. Es gilt vom Prinzip her das gleiche wie für die Verzweigungsbefehle BPL/BMI.

  1. BEQ, wenn Ergebnis null – Zero-Flag: 1
  2. BNE, wenn Ergenbis ungleich null – Zero-Flag: 0

Solange eine Schleife das Ergebnis (Zahlenwert; z. B. X-Registerinhalt) Null ergibt, würde bei BEQ dementsprechend verzweigt werden.

Der umgekehrte Fall besteht bei dem Befehl BNE. Zu den gesamten Verzweigungsbefehlen folgende Liste:

Code Sprungbefehl Flag Wert
BCC wenn Carry gelöscht C 0
BCS wenn Carry gelöscht C 1
BEQ wenn Ergebnis Null Z 1
BNE wenn Ergebnis nicht Null Z 0
BPL wenn Ergebnis positiv N 0
BMI wenn Ergebnis negativ N 1
BVC wenn Überlauf gelöscht V 0
BVS wenn Überlauf gesetzt V 1

Nehmen wir uns die beiden ersten Befehle BCC/BCS mal vor. Beide Befehle reagieren auf die Status-Abfrage des Carry (Übertrag)-Flag. Mit 8 Bit können wir ja einen Wert bis zu 255 dezimal erreichen. Bei größeren Zahlen benötigen wir dann also auch mehr Bits. Wenn bei einer Rechenoperation größere Werte als 255 entstehen tritt automatisch ein sogenannter Übertrag ein. Dabei wird das Carry-Flag auf 1 gesetzt. Es zeigt damit an, das ein Übertrag stattgefunden hat. z. B.

  • 130 + 150 = 280 (dez.)
  • 82 + 96 = 118 (hex.)

Das Ergebnis muß ja irgendwo gespeichert werden. Nehmen wir an, es sind die Speicherzellen 4000 und 4001. Das High-Byte wäre in diesem Fall 4000 und das Low-Byte 4001. Der Inhalt des Accu (enthält das Low-Byte) kommt nach 4001.

  • Inhalt: 4001 = 18 (hex.) : 24 (dez.)

Der Inhalt von Speicherzelle 4000 wird durch den Übertrag (also Carry auf 1) um 1 erhöht.

  • Inhalt: 4000 = 01 (hex.) : 1 (dez.)

Der Stellenwert von Sp. 4000 ist aber anders als bei Sp. 4001

4000

Sp. 4001
256 128 64 32 16 8 4 2 1
1 0 0 0 1 1 0 0 0

Die Kombination aus Sp. 4000 und Sp. 4001 liefert das richtige Ergebnis. Das Carry-Flag ist also ein sehr wichtiges Status-Flag zur Anzeige von Überträgen.

Als nächstes haben wir das Zero-Flag. Es zeigt an, ob ein Ergebnis Null oder ungleich Null ergab. Diese Zustände können wir natürlich für unsere Verzweigungsbefehle nutzen. Z. B. bei Zählern, mathematischen Routinen, Games, usw. Wenn eine Zählschleife den Wert Null erreicht hat, würde beim Befehl BEQ wohl was passieren?

Das Negativ-Flag reagiert auf positive (einschließlich Null!) und negative (einschließlich Null!) Ergebnisse. Bei einer Berechnung von negativen Zahlen muß Euer XL schließlich wissen, daß er jetzt mit negativen Zahlen rechnen soll! Das geschieht mit der Statusabfrage des Negativ-Flags.

Das Überlauf-Flag (V) und das Dezimal-Flag können wir erstmal übergehen. Kommen wir jetzt noch mal zu den Registern:

Statusregister

Es enthält die oben genannten Flags. Dann gibt es das Stapelzeiger-Register. Es zeigt die oberste Adresse des Stacks (siehe C-Kurs 4) an, damit die CPU weiß, wo sie sich den zuletzt abgelegten Wert holen soll. z. B.

Adresse vom Stapelkopf Wert
10FF 10
10FE 02
10FD 23

Der Stapelzeiger weist auf die Adresse 10FF. Es ist natürlich ein 16 Bit Register, damit es den gesamten Adressierraum anzeigen kann.

So, das sollte erstmal genügen. Probiert ruhig in Ruhe die Verzweigungsbefehle mit Hilfe von Schleifen aus. Erste Erfolge zeigen sich im allgemeinen sehr schnell. Überlegt Euch dann mal, wie man diese Befehle anderswo sinnvoll einsetzen kann.

 

6. Assembler-Programmierung mit ATMAS II

Die beiden Assemblerroutinen sind jeweils für die Bilddarstellung zuständig. Sobald man den Joystick nach links oder rechts bewegt, wird die entsprechende Routine aufgerufen. Es sind für jede horizontale Bewegung 4 Bilder vorhanden.

1. Routine

Name: DRAWIN
G.OBJ
Beginn: $0600

PM EQU $B00A Konstanter Wert
POS EQU $B480 Konstanter Wert
ORG $0600 Startadresse
LDX #23 Lade X-Reg. mit dez. 23
LOOP1 LDA PM,X Lade Accu mit Wert von Adresse PM plus Inhalt von X-Reg.
STA POS,X Kopiere Inhalt von Accu nach POS plus Inhalt von X-Reg.
INC $0620 Erhöhe den Inh. von Adr. $0620 um 1

Wenn ein Bild auf dem Bildschirm erscheint, muß sich die Adresse PM, von der ab sich ja die Playerdaten befinden, ändern, sonst würde man immer nur dasselbe Bild sehen. Deshalb verwenden wir die Speicherstelle $0620 als Zähler. Jedes Bild besteht aus 24 Daten. Bei jedem Schleifendurchlauf erhöht sich auch die Sp. $0620 um 1.

DEX Der Inhalt vom X-Reg. wird um 1 verringert
BPL LOOP1 Solange das N-Flag auf Null gesetzt ist, springe zu der Adresse Loop1
LDY $0620 Lade Y-Reg. mit dem Wert von Adresse $0620
STY $0603 Kopiere Inhalt von Y-Reg. nach Adresse $0603

Die Adresse $0603 ist das LOW-Byte von der Konstanten PM. Sobald die Schleife beendet wurde, erhält die Adresse $0603 den Wert von der Adresse $0620. Damit zeigt jetzt PM auf die zweiten Bilddaten.

RTS Rücksprung zum Hauptprogramm

Programmende

 

Die zweite Routine ist bis auf 2 Adressen identisch mit der ersten Routine. Die Playerdaten befinden sich direkt hinter den ersten Bilddaten. Die Erklärung zum jeweiligen Befehl könnt ihr selbst eintragen.

2. Routine

Name: INVDRAW.OBJ
Beginn: $0630

PM EQU $B06B Startadr. Playerdat
POS EQU $B480 Vertikal. Bildpos.
ORG $0630 Startadresse
LDX #23 Hier könnt ihr selbst eintragen, was jeweils passiert
LOOP1 LDA PM,X
STA POS,X
INC $0660
DEX
BPL LOOP1
LDY $0660
STY $0633
RTS

Programmende

 

Die Playerdaten wurden diesmal direkt als hex. Werte mit dem ATMAS II erstellt und anschließend als OBJ-Files abgespeichert.

Wenn Ihr den Assembler geladen habt, seht Ihr den Editor für Eure Quelltexte:

Drückt <CTRL-P> Monitoraufruf
Drückt <C> Change-Befehl
Es erscheint from: <0600> <CR>
nochmal <CR>
Es erscheint 0600 : Wert

Jetzt braucht Ihr nur die entsprechenden Werte eingeben, ohne ‚Return‘.

1. Playerdaten: Für Bewegung nach links
Name: COWBOY.OBJ
24 Daten je Bild (hier hexadezimal)

1. Bild
00,0C,0C,1E,00,0C,0C,00,0C,0E,1E,2D,03,0D,0C,1C,1C,14,34,22,22,22,66,00

2. Bild
00,0C,0C,1E,00,0C,0C,00,0C,0E,0E,0D,1A,04,08,0C,0C,1C,18,1C,14,12,32,00

3. Bild
00,0C,0C,1E,00,0C,0C,00,0C,0E,0A,0E,1E,0C,08,0C,1C,1C,08,0C,0C,08,18,00

4. Bild
00,0C,0C,1E,00,0C,0C,00,0C,0C,0C,0A,06,1E,0C,0C,0C,0C,14,14,12,32,06,00

 

2. Playerdaten: Für Bewegung nach rechts
Name: ANTICOWBOY.OBJ
24 Daten je Bild

1. Bild
00,30,30,78,00,30,30,00,30,70,78,B4,C0,B0,30,38,38,28,2C,44,44,44,66,00

2. Bild
00,30,30,78,00,30,30,00,30,70,70,B0,58,20,10,30,30,30,18,38,28,48,4C,00

3. Bild
00,30,30,78,00,30,30,00,30,70,50,70,78,30,10,30,38,38,10,30,30,10,18,00

4. Bild
00,30,30,78,00,30,30,00,30,30,30,50,60,78,30,30,30,30,28,28,48,4C,60,00

Wenn Ihr die Bilddatenanzahl verändert, denkt daran, die Werte in den Routinen entsprechend anzupassen. Jeder Player kann bis zu 256 Bytes an Daten besitzen.

Thomas Krause

Weihnachtsangebote von Power per Post

 

Dieses ABBUC Magazin erschien ursprünglich als Papierbeilage. Scan, OCR, Digitalisierung und Aufbereitung: Andreas Bertelmann