Seite 1 von 1

Text butterweich scrollen(Panning)

Verfasst: Di 15. Jun 2010, 10:07
von freecrac
Ich habe einen Textbetrachter geschrieben der eine Text-Datei(kleiner als 64 kib) in den Speicher läd und danach am Text-Bildschirm(mit 80 Spalten x 50 Zeilen, 8x8 Zeichesatzt-Charackter) ausgibt.
Mit den Cursortasten(hoch + runter) kann man bis zum Ende, bzw. wieder nach oben zum Anfang scrollen. Das Scrollen soll dabei butterweich sein, so das man auch beim Scrollen den Text noch lesen kann.
Wenn man die Cursor-down-Taste drückt wird der Text nach oben geschoben, das passiert butterweich. Nur wenn ich die Cursor-up-Taste drücke und der Text dabei nach unten geschoben wird ruckelt es leider.
Wie kann man es besser hinbekommen?

Die verwendete Portadresse für das Panning:
http://www.osdever.net/FreeVGA/vga/crtcreg.htm#08

Hier der betreffende Codeschnipsel für das Hochscrollen:

Code: Alles auswählen

SCRDO:    xor      di, di            ; Bildschirm nach oben scrollen
          lds      si, DWORD PTR[DSEG]
          xor      ah, ah            ; ah mal 2 bei 16 Pixel Zeichenhöhe
          mov      cx, 7A8h
;-----------------------------------
PANNING:  mov      al, 8             ; Pixel-Panning (Verschiebung)
          mov      dx, Crtc
          out      dx, ax            ; Smooth-Scrolling
;----------------------------
          add      ah, 2
          call STRAHL
          cmp      ah, 8
          jnz PANNING
;----------------------------
          mov      ax, 8             ; Pixel-Panning normal
          mov      dx, Crtc
          out      dx, ax
;----------------------------
          rep movsd                  ; Richtung: je nach Direction-Flag
;------------------------------------
          mov      di, 1EA0h
          jmp  short ZCLS            ; unterste Zeile löschen
Hier der betreffende Codeschnipsel für das Runterscrollen:
(--hier ruckelt es--)

Code: Alles auswählen

SCRUP:    mov      di, 1F3Ch         ; Bildschirm nach unten scrollen
          lds      si, DWORD PTR[USEG]
          mov      cx, 7A8h
          std
          mov      ah, 6             ; ah mal 2 bei 16 Pixel Zeichenhöhe
          mov      dx, Rast_Port
          call RASTER1
          mov      al, 8             ; Pixel-Panning (Verschiebung)
          mov      dx, Crtc
          out      dx, ax            ; Smooth-Scrolling
          rep movsd                  ; Richtung: je nach Direction-Flag
          sub      ah, 2
;------------------------------------
PANNINU:  mov      al, 8             ; Pixel-Panning (Verschiebung)
          mov      dx, Crtc
          out      dx, ax            ; Smooth-Scrolling
;----------------------------
          call STRAHL
          sub      ah, 2
          jns PANNINU
Den Textbetrachter + gesamten Quellcode kann man hier herunterladen(Zip-Archiv = 10072 Bytes):
http://www.alice-dsl.net/freecracmaps/Tool/TEXT-OUT.ZIP

Als Beispiel kann man mit diesem Textbetrachter seine Quelldatei(oder eine beliebige andere Textdatei die kleiner al 64 KiB ist) zur Anzeige bringen. Die betreffende Textdatei wird als Parameter angehängt:
TEXT-OUT.EXE TEXT-OUT.ASM

Dirk

Re: Text butterweich scrollen(Panning)

Verfasst: Di 15. Jun 2010, 21:18
von elianda
Ich hab gerade wenig Zeit, aber setzt du das Register im VRetrace?
Das Vertikal schieben macht der Controller ja nur pro Bild, also sollte man das nicht zwischendrin machen.

Ansonsten schaue mal in die SWAG oder so, diese Softscroll Viewer / Editoren bzw. Notemaker gabs damals viele.

Mit Textmode habe ich damals nur einen zweifach DYCP gemacht. Also nichts finales, ohne ORen der Scroller. Ich glaub der Code ist beim Hintergrundbild dann steckengeblieben, weil man das dann gegenläufig im Charset haette softscrollen müssen, damit es gegenüber dem DYCP wieder still steht.
Ok ich schweife ab, das hat nicht mehr viel mit scrollen in Y zu tun.

Nächste Woche habe ich mehr Zeit, erinner mich mal dran, dann suche ich einen raus, da kann man dann mal in den Code schauen.

Re: Text butterweich scrollen(Panning)

Verfasst: Di 15. Jun 2010, 22:34
von freecrac
elianda hat geschrieben:Ich hab gerade wenig Zeit, aber setzt du das Register im VRetrace?
Das Vertikal schieben macht der Controller ja nur pro Bild, also sollte man das nicht zwischendrin machen.
Das macht die folgende Routine. Zum Hochscrollen wird "STRAHL" angesprungen und zum Runterscrollen "RASTER1":

Code: Alles auswählen

STRAHL:   mov      dx, Rast_Port     ; auf Beginn der nächsten -RETRACE-  (Port 3DA)
RASTER0:  in       al, dx            ; Periode warten
          test     al, 8
          jnz RASTER0
RASTER1:  in       al, dx
          test     al, 8
          jz  RASTER1
          ret
Alternativ habe ich zum Runterscrollen es auch mit dieser Routine probiert, aber auch nicht erfolgreicher:

Code: Alles auswählen

STRAHLUP: mov      dx, Rast_Port     ; auf Beginn der nächsten -DISPLAY-
RASTER2:  in       al, dx            ; Periode warten
          test     al, 8
          jz  RASTER2
RASTER3:  in       al, dx
          test     al, 8
          jnz RASTER3
          ret
.............................................(Bei Linux muss man dafür mittels ioperm den Port 3DA erst mal freigeben, was mir bei einen Status-Port den man eh nur lesen kann schon etwas sonderbar vorkommt.)
Ansonsten schaue mal in die SWAG oder so, diese Softscroll Viewer / Editoren bzw. Notemaker gabs damals viele.
Ich habe mal gegoogelt und für den C64 Softscroller gefunden, Die Portadressen kamen mir noch etwas bekannt vor. Das ist aber schone eine Ewigkeit her das ich dort vergleichbare Dinge programmiert habe.
Dann fand ich auch Beispiele für Javascript, damit habe ich es auch schon hinbekommen. Beispiele für den PC mit Port 3D4 habe ich leider noch nicht gefunden.

Wie ich in Klammern in der ersten Zeile meines Beitrages schon angegeben habe sollen 50 Zeilen Text gescrollt werden, nicht nur 25. Ich weiss nicht so recht ob das einen Unterschied ausmacht.
Mit Textmode habe ich damals nur einen zweifach DYCP gemacht. Also nichts finales, ohne ORen der Scroller. Ich glaub der Code ist beim Hintergrundbild dann steckengeblieben, weil man das dann gegenläufig im Charset haette softscrollen müssen, damit es gegenüber dem DYCP wieder still steht.
Ok ich schweife ab, das hat nicht mehr viel mit scrollen in Y zu tun.

Nächste Woche habe ich mehr Zeit, erinner mich mal dran, dann suche ich einen raus, da kann man dann mal in den Code schauen.
Das ist prima. Ich hoffe der Code ist verständlich genug dokumentiert, ggf. kann ich die Details bestimmt auch noch etwas genauer erklären.
Es eilt aber auch nicht, den Textbetrachter habe ich schon vor Jahren geschrieben. Nun bin ich mal wieder darüber gestolpert das dort noch etwas unbefriediegend ungelöst geblieben war.

Dirk

Re: Text butterweich scrollen(Panning)

Verfasst: Di 27. Okt 2015, 10:41
von drzeissler
hier wird von VGA gesprochen, das geht mit EGA sicher auch.
Geht es auch mit CGA,MDA und TDY?

Ich meine mich daran zu erinnern, dass ich am EuroPC mal igrgend einen Test
laufen lassen habe, wo auch Softscrolling in Hardware unter CGA genutzt wurde.

Doc

Re: Text butterweich scrollen(Panning)

Verfasst: Di 27. Okt 2015, 20:45
von Felmar Loyd
Hi,

dein problem könnte daran liegen, das du beim runterscrollen das Pixel-Panning-Register 4 mal änderst, aber nur drei mal auf den Retrace wartest.

Code: Alles auswählen

SCRUP:    mov      di, 1F3Ch       
          lds      si, DWORD PTR[USEG]
          mov      cx, 7A8h
          std
          mov      ah, 6             
          mov      dx, Rast_Port
          call RASTER1
          mov      al, 8             
          mov      dx, Crtc
          out      dx, ax     ;Pixel Paning Änderung 1
          rep movsd         ; hier könnte noch ein CALL STRAHL rein
          sub      ah, 2
;------------------------------------
PANNINU:  mov      al, 8             
          mov      dx, Crtc
          out      dx, ax             ; Pixel Paning Änderung 2
;----------------------------
          call STRAHL                ; Retrace 1
          sub      ah, 2
          jns PANNINU              ; Sprung -> Schleife wird noch 2 mal durchlaufen
Ich habe mal deine Kommentare in diesem Quelltextauszug durch meine Anmerkungen ersetzt.
Ich konnte es leider nicht testen, da ich nicht weiß, mit welchem Assembler du arbeitest. MASM gab mir beim Compilieren ein paar Fehler aus, also vermute ich mal, das du einen anderen Assembler nutzt. Aber vieleicht hilft dir
das ja denoch weiter.

Gruß
Felmar Loyd

Re: Text butterweich scrollen(Panning)

Verfasst: Di 20. Sep 2016, 09:00
von drzeissler
Da gibt es doch "smooth", was aber mindestens EGA voraussetzt. Was für Hercules an einem XT wäre allerdings mehr als toll!