2017-04-19 2 views
2

Ich möchte ein Spiel wie Guitar Hero in Assembly (TASM) erstellen und ich denke, ich muss Seiten verwenden, um den Bildschirm nach oben zu scrollen. Wie drucke ich Rechtecke auf der obigen Seite und scrolle die Seite nach oben?Wie werden Seiten in Assembly (TASM) verwendet?

+0

diese http://www.ctyme.com/intr/rb-0091.htm kann interessant sein für Sie – Tommylee2k

+1

Ich glaube nicht, Paging ist die Art und Weise sehen im Zusammenhang [Was ist der beste Weg ist, um ein Objekt zu bewegen der Bildschirm?] (http://Stackoverflow.com/a/29579522/2521214) Ich teile dort meine alte 2D asm Spielquelle mit Kartenscrollen, Menüs, 3 Spielern (geteilter Bildschirm), Schießen und mehr ... 'rep movsd 'ist dein Freund – Spektre

Antwort

2

Tatsächlich haben verschiedene Videomodi eine unterschiedliche Anzahl von "Seiten", die verfügbar sind, abhängig davon, wie viel Speicher für die Videohardware verfügbar ist. Sie können eine meist vollständige Liste here sehen. Nicht alle Videomodi unterstützen jedoch mehrere Seiten. Zum Beispiel, mode 13h, ein gemeinsamer Grafikmodus auf dem VGA (beliebt, weil es eine vereinfachte Möglichkeit der direkten Manipulation des Videospeichers ermöglicht und somit die Programmierung erleichtert) unterstützt nur eine Seite, was bedeutet, dass das Umblättern auf die normale Weise unmöglich ist. * Sie müssen einen Modus auswählen, der mehrere Seiten unterstützt. Da ich selber nicht viel von einem Grafikmodus bin, würde ich nicht wissen, welche populär sind und welche man empfehlen kann. Vielleicht 0Dh, eine 320 × 200 Auflösung mit 16 Farben und 8 Seiten?

Die Standardmethode zum Umblättern zwischen Seiten ist die Verwendung des BIOS-Dienstes 10h (Videofunktionen), Funktion 05h. Dies wählt die aktive Anzeigeseite aus. Wie Sie here in der Online-Dokumentation sehen, stellen Sie die AH Register der Funktionskennung (05h), AL auf der Anzeigeseite, die Sie auswählen möchten, und dann Interrupt 10h aufrufen:

mov al, 01h ; select display page 1 
mov ah, 05h ; function 05h: select active display page 
int 10h 

Oder für die besten Leistung, ein richtiger Montag Programmierer würde sofort diese beiden Hälften der AX-Register gesetzt, etwa so:

mov ax, 0501h ; AL == display page, AH == function 05h 
int 10h 

Wenn die angeforderte Seite nicht existiert, dann wird der Interrupt-Aufruf keine Wirkung. Sie können dies überprüfen, indem danach die aktuelle Anzeige Seitennummer überprüft, mit function 0Fh, die die aktiven Anzeigeseite im BH Register zurück:

mov ax, 0F00h ; AH == function 0Fh 
int 10h 

Also das ist, wie Sie Seiten verwenden, aber das ist wirklich nichts zu tun hat mit Scrollen . Sie können nicht mehrere Seiten gleichzeitig auf dem Bildschirm anzeigen lassen. Zum Scrollen ist das, was Sie eigentlich wollen, function 06h—scroll window up. Das DX-Register enthält die Koordinaten der oberen linken Ecke des zu scrollenden Rechtecks ​​(DL == Spalte, DH == Zeile), und das CX-Register enthält die Koordinaten der unteren rechten Ecke (CL == Spalte, CH == Reihe). Das AL-Register enthält die Anzahl der zu scrollenden Zeilen, und das BH-Register enthält die screen attributes (Farben), die in der neu freigegebenen Region verwendet werden sollen.

Zum Beispiel, wenn man den rechteckigen Bereich des Bildschirms, der durch (0, 0) × (80, 20) um 10 Zeilen scrollen will, würde man das folgendermaßen:

xor dx, dx  ; DL == 0, DH == 0 
mov cx, 1450h ; CL == 80, CH == 20 
mov ax, 060Ah ; AL == 10, AH == 06h 
mov bh, 0Eh ; yellow foreground, black background 
int 10h 

A Diese Funktion wird häufig verwendet, um den gesamten Bildschirm zu löschen. Wie Sie sich vorstellen können, geschieht dies, indem DX und CX gesetzt werden, um die Koordinaten des gesamten Bildschirms zu definieren, und dann AL auf 0 gesetzt wird, um das gesamte Rechteck auszublenden. Der Bildschirm wird dann gelöscht und mit den in BH angegebenen Farbattributen gefüllt. Beachten Sie, dass der Ursprung des Bildschirms (obere linke Ecke) bei (0, 0) liegt. Das Ausmaß (unten rechts) ist abhängig von der Art, die Sie in.

Es ist eine ergänzende Funktion, 07h, die ein Fenster scrollt nach unten, anstatt nach oben. Ansonsten funktioniert es genau wie Funktion 06h.

Beachten Sie, dass diese Scroll-Bildschirm-Funktionen, wie bereits erwähnt, und wie in der verknüpften Dokumentation erwähnt, nur auf der aktuell aktiven Anzeigeseite funktionieren. Sobald Sie also den Bildschirm gescrollt haben - entweder nach oben oder nach unten -, wurde die nahezu belichtete Region mit den von Ihnen angegebenen Farb-/Videoattributen gefüllt, und Sie müssen dann die neuen Grafiken darin einfügen.

Der einzige Nachteil hierbei ist, dass beim Zeichnen des neuen Inhalts auf dem Bildschirm möglicherweise etwas Flimmern auftritt. Seitenumblätterungen würden dazu beitragen, dies zu verhindern, aber es würde viel mehr Zeit in Anspruch nehmen, es zu implementieren. Sie würden nicht das BIOS helfen, indem Sie automatisch einen Teil des Bildschirms scrollen. Sie müssten zwei Seiten verwalten - eine, die das enthält, was gerade auf dem Bildschirm angezeigt wird, und eine zweite, die so gezeichnet wurde, als wäre sie bereits gescrollt. Sie würden dann direkt von der aktuellen Seite auf die neue Seite umblättern.

* Sie können tatsächlich Seitenumblätterbetrieb im Modus 13h simulieren, obwohl durch mehrere Segmente verwenden, die Vorteile des schnellen Schreibens in Videospeichern nehmen, dass dieser Modus ermöglicht. Grundsätzlich haben Sie ein Segment-Register, das den tatsächlichen Videospeicher adressiert, und dann haben Sie ein oder mehrere zusätzliche Segmentregister, die "scratch" Speicherbereiche adressieren, die Sie behandeln, als ob sie Videospeicher waren. Wenn Sie dann die Seite spiegeln möchten, blittieren Sie einfach alle Daten aus einem Ihrer Arbeitsbereiche in den eigentlichen Videospeicher. Wenn Sie mit modernen Grafikprogrammierungstechniken vertraut sind, ist dies nur eine doppelte Pufferung - Sie zeichnen in einen Offscreen-Puffer und wenn Sie damit fertig sind, kopieren Sie die Daten aus diesem Offscreen-Puffer auf den Bildschirm. Alles Alte ist wieder neu.

+0

Also was ist die am besten geeignete Option für dieses Spiel? – Emil

+0

Bitte überprüfen Sie die von Ihnen verwendete Dokumentation. Es ist das Register "CX", das die Koordinaten der oberen linken Ecke des zu scrollenden Rechtecks ​​enthält, und das Register "DX", das die Koordinaten der unteren rechten Ecke enthält. Sie haben es sowohl im Text als auch im Code-Snippet umgekehrt geschrieben. Ich erinnere mich immer daran von ** D ** X gegen ** D ** OWN –

Verwandte Themen