Text butterweich scrollen(Panning)

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Text butterweich scrollen(Panning)

Beitrag 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
Zuletzt geändert von freecrac am Di 6. Jul 2010, 14:41, insgesamt 3-mal geändert.
elianda
DOS-Übermensch
Beiträge: 1150
Registriert: Mi 31. Jan 2007, 19:04
Wohnort: Halle
Kontaktdaten:

Re: Text butterweich scrollen(Panning)

Beitrag 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.
Diverse Retro-Computer vorhanden.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Text butterweich scrollen(Panning)

Beitrag 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
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Text butterweich scrollen(Panning)

Beitrag 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
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
Felmar Loyd
MemMaker-Benutzer
Beiträge: 78
Registriert: Do 5. Mär 2015, 17:17
Wohnort: Magdeburg

Re: Text butterweich scrollen(Panning)

Beitrag 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
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Text butterweich scrollen(Panning)

Beitrag 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!
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
Antworten