Laufschrift hor. mit DL-Manipulation

Moderator: Rockford

Antworten
Benutzeravatar
Dr. Irata
Beiträge: 1379
Registriert: 24.08.2021 14:40
Has thanked: 207 times
Been thanked: 512 times
Kontaktdaten:

Laufschrift hor. mit DL-Manipulation

Beitrag von Dr. Irata »

Hallo,
ich wollte hier noch einmal ein paar Überlegungen reinstellen betreffend Laufschrift / bzw. Feinscrolling horizontal.
Der Profiprogrammierer kennt das sicherlich zur genüge und wir hatten hier im Forum auch schon auf sehr gut Seiten im Internet hingewiesen, wo man alles sehr gut nachlesen kann.
Hier an dieser Stelle kommt jetzt aber ein kleines Programm - wie üblich in Assembler unter MADS - wo ich eine einfache Laufschrift mit "unendlichem Text" in die obere Zeile des Bildschirmes anzeigen lassen werde. Die Schrift läuft feingescrollt von rechts nach links durch, der Grobscroll soll durch Displaylistmanipulation stattfinden. Das ist etwas komplizierter und aufwendiger, macht aber natürlich Sinn, wenn man das erweitert auf das Scrollen des gesamten Bildschirmes. Wenn es tatsächlich wie im Beispiel nur eine Zeile sein soll, dann kann man natürlich den Grobscroll auch durch umkopieren einfach durchführen, das belastet die CPU nicht nennenswert.

Zunächst nehmen wir ANTIC 2 und bauen die Displaylist entsprechend auf. Der Bildschirm startet nicht bei 40000 sondern bei 40040. Ich brauche eine Leerzeile von 40000 bis 40040.
Zeile 2 startet dann ab 40166 damit ich genügend Platz habe ... das erkläre ich später.
Das grobe Prinzip: Ich hole die Buchstaben vom Text und printe sie 2x auf den Bildschirm, einmal in den "sichtbaren" Bereich und einmal in einen unsichtbaren Bereich. Die Displaylist manipuliere ich nun bei jedem Grobscroll um 1 und schiebe somit den angezeigten Bereich über den Speicher.. nach 80 Verschiebungen wird die Displayliste wieder auf den Anfangswert geschrieben und alles startet von vorne.

Anbei der Code:

Code: Alles auswählen

		org $2000
			
			
hscrolx		.by 00

laufschrx1 = 240

	

dlist		
			.by 112,112,112
			.by 66+16
dl1			.by 104,156		;40040
			.by 66+16
dl2			.by 230,156		;40166
:22			.by 2+16
			.by 65
			.wo dlist		
		
start
		
			mwa #dlist 560	
		
			mwa #copy1 laufschrx1
			ldx #0
		
@		
			mva hscrolx $d404
			jsr wartes
			jsr wartes
			jsr laufschrift
			dec hscrolx
			jmp @-
		
		
			run start
	
			.proc laufschrift

			#if .byte hscrolx=#0
			inc dl1
@
			; ------ ab hier jeweils einen Buchstaben holen -------
			ldy #0
			lda (laufschrx1),y
			cmp #3		; # Text Ende
			bne @+
			mwa #copy1 laufschrx1
			jmp @-
@
			sta 40085,x
			sta 40005,x
			inx
			cpx #80
			bcc @+
			ldx #0
			mva #104 dl1
@
			clc
			lda laufschrx1
			adc #1
			sta laufschrx1
			lda laufschrx1+1
			adc #0
			sta laufschrx1+1
			mva #4 hscrolx
			#end
		
			rts
			.endp
			.proc wartes
			lda 20
wa   
			cmp 20
        		beq wa 
        	
        		rts
     			.endp 
		
	
;===============================================================
; Laufschrift Daten
copy1	
		.byte "Heute ist ein wirklich schoener Tag, die Sonne scheint und es wird endlich waermer. Der Fruehling kommt und bald ist Sommer, wo wir wieder mit T-Shirt rausgehen koennen....          " 
		.byte "hier kann jetzt noch ganz viel Text stehen. Die Grenze des Textes ist praktisch nicht limitiert und kann weit ueber die 255 Byte-Grenze hinausgehen.             "
		.byte "Die Textlimitation ergibt sich natuerlich aus dem Speicher ......  ;-)    #"
;===============================================================

;===============================================================
Jeder darf hier frei optimieren - bzw. gibt es einfachere Lösungen?
LG Peter

Benutzeravatar
mega-hz
Beiträge: 1857
Registriert: 03.11.2021 11:23
Has thanked: 582 times
Been thanked: 643 times

Re: Laufschrift hor. mit DL-Manipulation

Beitrag von mega-hz »

nur als Hinweis, die Speicherzellen sind in Dezimal angegeben, nicht Hexa-Dezimal!
(ich dachte erst, du programmierst auf dem ST :-) )

Super Anleitung! Solche Code-Schnipsel sind immer sehr hilfreich!
keine PN's mehr! Bitte per email kontaktieren! atari1450xld©mega-hz.de

Benutzeravatar
DjayBee
Beiträge: 1225
Registriert: 17.08.2021 04:02
Has thanked: 939 times
Been thanked: 490 times
Kontaktdaten:

Re: Laufschrift hor. mit DL-Manipulation

Beitrag von DjayBee »

Warum kopierst du die Daten jedes Mal?
Allokier einfach eine Bildschirmzeile zusätzlich direkt hinter deinem String und kopiere die ersten 40 (plus 3) Zeichen dorthin.
Dann kannst du die DL einfach innerhalb deines Strings laufen lassen.

Code: Alles auswählen

		org $2000
			
			
hscrolx		.by 04			; =0 waere eine sofortige Inkrementierung von dl1 beim Programmstart


dlist		
			.by 112,112,112
			.by 66+16
dl1			.wo dupli1-3		;dupli1-3 weil die ersten 3 Zeichen uebersprungen werden
			.by 66+16
dl2			.by 230,156		;40166
:22			.by 2+16
			.by 65
			.wo dlist		
		
start
; Die ersten 40+x Bytes hinten an den Text anhängen für den "Wrap-Around" 
			ldx #39+3		; 40 Zeichen pro Zeile plus 3 Zeichen Überhang
@			lda copy1,X
			sta dupli1,X
			dex
			bpl @-
		
			mwa #dlist 560	
		
@		
			mva hscrolx $d404
			jsr wartes
			jsr wartes
			jsr laufschrift
			dec hscrolx
			jmp @-
		
		
			run start
	
			.proc laufschrift

			#if .byte hscrolx=#0
			inc dl1
			bne @+
			inc dl1+1
@
			mva #4 hscrolx

			lda dl1			; Ende des Scrollbuffers erreicht?
			cmp #<dupli1
			bne endproc
			lda dl1+1
			cmp #>dupli1
			bne endproc

			mwa #copy1 dl1		;> => DL wieder auf Anfang setzen
			#end

endproc		
			rts
			.endp

			.proc wartes
			lda 20
wa   
			cmp 20
        		beq wa 
        	
        		rts
     			.endp 
		
	
;===============================================================
; Laufschrift Daten
; Darf NICHT über eine 4KB-Grenze laufen
copy1	
		.byte "Heute ist ein wirklich schoener Tag, die Sonne scheint und es wird endlich waermer. Der Fruehling kommt und bald ist Sommer, wo wir wieder mit T-Shirt rausgehen koennen....          " 
		.byte "hier kann jetzt noch ganz viel Text stehen. Die Grenze des Textes ist praktisch nicht limitiert und kann weit ueber die 255 Byte-Grenze hinausgehen.             "
		.byte "Die Textlimitation ergibt sich natuerlich aus dem Speicher ......  ;-)    "
; Platz fuer den Textanfang, der am Ende nochmal stehen muss, wegen des "Wrap-Arounds".
dupli1		.ds 40+3

;===============================================================

;===============================================================
Die 3 Zeichen zusätzlich brauchst du wegen des Überhangs beim Softscroll.
Interessant ist auch, dass die ersten 3 Zeichen nicht angezeigt werden. Beim Programmstart steht also nicht "Heute ist..." auf dem Bildschirm, sondern "te ist...". Deshalb initialisiere ich die DL beim Start auf 3 Bytes vor dem Ende - und damit kurz vor dem Warp-Around.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast