You are not logged in.

hannenz

Unregistered

1

Monday, May 29th 2006, 2:59pm

code snippet: FLD

hab mich mal näher mit FLD beschäftigt. Nichts neues, aber vielleicht doch ganz interessant für all'y'all anfängers:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
;--------------------------------------------------------------------------------------------------
;2006 hannenz@freenet.de

;FLD: flexible line distance

;damit ist gemeint, dass der VIC nur in den sognannten BAD LINES beginnt eine neue Bildschirmzeile zu zeichnen.
;Durch Manipulation des VIC-Registers $d011 kann man nun das Auftreten einer solchen BAD LINE unterdrücken bzw. eine 
;bestimmte Zeit lang unterbinden. Das nennt man den FLD Effekt. Damit lassen sich ganz hübsche und C64-typische Effekte
;erzielen, z.B. diesen hier.
;dabei wird in jede Bildschirmzeile eine gewisse Zeit lang "rausgezögert" und zwar anhand eines Wertes aus einer
;Sinustabelle. Rotiert man nun diese Sinustabelle einmal pro Frame (oder weniger oder wie auch immer) entsteht dieser
;fliessende Effekt.

;um die BAD LINE zu unterdrücken muss man nur dafür sorgen, dass die Bits 0-2 aus $d012 (aktuelle Rasterzeile) und $d011 
;nicht übereinstimmen. Wir machen dies, indem wir die aktuelle Rasterzeile merken und auf die nächste warten. 
;Dann schreiben wir die unteren Bits aus der alten Rasterzeile nach $d011; da diese ja schon vorbei ist, kommt es zu 
;keinem Match zwischen den Bits 0-2 aus $d011 und $d012. Dies wiederholen wir solange wie der Delay-Wert im .X-Register
;angibt. 
;wichtig ist, am Ende bzw. Beginn des nächsten Frames $d011 wieder mit seinem Default-Wert ($1b) zu initialisieren.


;der source ist im CA65 format, die @-labels sind einfach cheap-labels, kann man durch ganz normale 
;labels ersetzen, eben entspr. umbenennen.
;--------------------------------------------------------------------------------------------------
line1		= $34 + 0 * 8	;first line of FLD Effect! der erste Faktor gibt an, bei welcher 
				;Bildschrimzeile der FLD-Effekt beginnt (default hier 0)
;--------------------------------------------------------------------------------------------------
	;BASIC-Stub

	.word *+2		;lade adress
	.byte 0			;null byte bei $0800
	.word link,2006		;link zur nächsten zeile, zeilennummer
	.byte $9e,"2061",0	;sys token ($9e) und ASCII "2061", null als zeilenende markierung
link:	.word 0			;null zeiger --> ende basic code
;--------------------------------------------------------------------------------------------------
;initialisierung

	jsr $e544		;bildschirm löschen
				;ANM.: wenn man den bildschirm nicht löscht und z.B. die Einschaltmeldung des C64
				;belässt, sieht man gut, wie die Darstellung der Textzeilen unterdrückt wird!

	sei			;irq sperren
	lda #$7f		;cia irq aus
	sta $dc0d
	sta $dd0d

	lda #1			;raster interrupt an
	sta $d01a

	lda #<fld		;irq vector auf unsere fld-routine biegen
	ldx #>fld
	ldy #line1		;bei line1 (start-raster line)
	sta $fffe
	stx $ffff
	sty $d012

	lda #$1b		;$d011 initialisieren (hi bit-raster line: 0)
	sta $d011

	asl $d019		;jegliche vorherigen irq's quittieren
	lda $dc0d
	lda $dd0d

	lda #$35		;kernal und basic rom ausblenden
	sta 1

	lda #11			;hintergrundfarbe grau
	sta $d020
	sta $d021

	cli			;irq's freigeben
	jmp *			;endlos schleife
				;wir haben kernal rom und basic aus, wir brauchen im hauptprogramm keine registerinhalte,
				;da ja nur eine endlosschleife durchgeführt wird, deshalb können wir auch im irq auf die
				;sicherung der register (pha/txa/pha/tya/pha...) verzichten, wir benutzen sogar
				;das .Y-Register "irq-übergreifend" als zähler!
				;aber achtung: deshalb kein "echter code" im hauptprogramm möglich!!
				;man könnte sicherlich auch über $314/$315 springen und die register retten, aber wozu..?!;)
;--------------------------------------------------------------------------------------------------
;die iegentliche fld routine

fld:
	lda $d012		;aktuelle rasterzeile merken
	pha			

	ldx sinus,y		;delay-wert aus sinus tabelle holen
	beq fld_skip1		;ist es null, dann überspringe den fld

fld_loop:
	lda $d012		;alte rasterzeile
	cmp $d012		;noch in der selben zeile...?!
	beq *-3			;dann warte weiter
	and #7			;bits 0-3 isolieren
	ora #$10		;text modus
	sta $d011		;nach $d011 (bad line wird unterdrückt!)
	dex			;verzögerung schon null?
	bne fld_loop		;nein, dann nochmal bad line unterdrücken

fld_skip1:
	pla			;raster zeile bei der der irq ausgelöst wurde wieder holen
	clc
	adc #8			;+8, nächste zeile
	adc sinus,y		;und plus den delay wert der angewandt wurde...
	cmp #240		;schon am unteren bildschirmrand...?! hier kann man den Effekt auch früher
				;beenden, einfach einen niedrigeren Wert einsetzen...
	bcc fld_skip2		;nein, dann einfach weiter

	ldx #<irq0		;ja, dann irq3 routine bei raster $02 einrichten
	stx $fffe
	ldx #>irq0
	stx $ffff
	lda #$02

fld_skip2:	
	sta $d012		;neue rasterzeile setzen!
	asl $d019		;raster irq quittieren
	iny			;.Y ist zähler in die sinus tabelle, erhöhen für nächsten aufruf! beachte dass .Y nicht
				;benutzt wurde im fld!
	rti			;irq beenden
;--------------------------------------------------------------------------------------------------
;diese routine wird im oberen unsichtbaren bereich ausgeführt und macht 1x/frame einen init und rotiert
;die sinus tabelle!

irq0:
	dec delay		;hier kann etwas gebremst werden um nur jeden x-ten frame zu rotieren...
	lda delay		
	and #1			;einfach diesen AND #-wert ändern (1,3,7,15...)
	bne skip		;oder die delay-schleife löschen für 1x/frame oder eigene delay schleife...

	ldy sinus		;1. Sinus Wert  merken
	ldx #0	
			;alle anderen eine position nach vorn
loop:
	lda sinus+1,x
	sta sinus,x
	inx
	cpx #$1f		;schon die ganze tabelle rotiert...?! 
	bne loop
	tya			;ersten eintrag aus .Y holen
	sta sinus,x		;und ans ende der tabelle schreiben
skip:
	lda #$1b
	sta $d011		;$d011 muss hier wieder initialisiert werden!!!

	lda #<fld		;fld-routine wieder einrichten bei line1 
	ldx #>fld
	ldy #line1
	sta $fffe
	stx $ffff
	sty $d012
	asl $d019		;raster irq quittieren
	ldy #0			;.Y als Zeiger in Sinustabelle initialisieren
	rti

;--------------------------------------------------------------------------------------------------
delay:		.byte 0		
sinus:		.byte $00,$00,$01,$01,$02,$02,$03,$04,$05,$05,$06,$07,$07,$08,$08,$08
		.byte $08,$08,$08,$08,$07,$07,$06,$05,$04,$04,$03,$02,$02,$01,$00,$00
hannenz has attached the following files:
  • fld_effect.prg (224 Byte - 53 times downloaded - latest: Dec 22nd 2012, 12:43pm)
  • fld_effect.txt (6.1 kB - 44 times downloaded - latest: Nov 11th 2011, 3:05pm)

trifox

Unregistered

2

Monday, May 29th 2006, 6:32pm

RE: code snippet: FLD

hm, ich sehe leider nur einen grauen bildschirm ... ;(

hannenz

Unregistered

3

Monday, May 29th 2006, 10:13pm

hmm... ich nicht, ich sehe das...:
http://people.freenet.de/hannenz/pics/fld.png
im vice und auf meinem c64...
verscuhs mal nach einem reset neu zu starten (sys 2061)... aber eigentlich sollte das einfach funktionieren...

4

Tuesday, May 30th 2006, 1:59pm

Schoenes Beispiel :)
Laueft hier auch (vice bei der Arbeit), aber wieso (achtung, jetzt jammer ich wieder :) wurstelt alle Welt so brutal an $01 rum? Staendig springt die Datasette an und ich hab auch sonst sachen am Cassport haengen. Ich glaube das ist eine Crossdev-Unart vor allem irgendwie.
Das Beispiel gefaellt aber :)
Gruss,
enthusi

This post has been edited 1 times, last edit by "enthusi" (May 30th 2006, 2:00pm)


sauhund

ist falsch abgebogen

  • "sauhund" is male

Posts: 20,323

Date of registration: Jul 16th 2005

Location: zuhause

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

5

Tuesday, May 30th 2006, 2:41pm

Quoted

Laueft hier auch (vice bei der Arbeit), aber wieso (achtung, jetzt jammer ich wieder wurstelt alle Welt so brutal an $01 rum? Staendig springt die Datasette an und ich hab auch sonst sachen am Cassport haengen. Ich glaube das ist eine Crossdev-Unart vor allem irgendwie.


äh ja ne. das macht seit je her jeder. die datasette hat man schon vor 20 jahren so schnell entsorgt wie irgend möglich - und irgendwelche komischen basteleien sind halt doch so unüblich das man sie in der regel ignoriert :)
http://www.hitmen-console.org http://magicdisk.untergrund.net
Die Furcht vor der freimütigen Antwort kann auch robuste Charaktere befallen.

Roland

Master

Posts: 2,452

Date of registration: Sep 27th 2005

Location: Vergangenheit

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

6

Tuesday, May 30th 2006, 7:56pm

RE: code snippet: FLD

Quoted

Original von trifox
hm, ich sehe leider nur einen grauen bildschirm ... ;(



yo, schon klar warum :D

bei dir steht #$00 in $3FFF ....

schreib da mal was rein (z.b. #$FF)....

dann siehst du auch was :]

ODER starte das programm auf $0810 (sys 2064).
dann wird den birschrim zu beginn nicht gelöscht und du kannst
den text der auf dem bildschrim ist fld-en sehen...

This post has been edited 1 times, last edit by "Roland" (May 30th 2006, 7:58pm)


trifox

Unregistered

7

Tuesday, May 30th 2006, 11:10pm

jau, wenn ich mit sys 2064 starte, dann bewegen sich die textzeilen sinusfoermig, cool! 8)

hannenz

Unregistered

8

Wednesday, May 31st 2006, 2:34pm

ja, man sollte noch ein

Source code

1
2
lda #$ff
sta $3fff

am anfang einfügen... ich glaube der echte c64 hat im einschaltzustand immer(??) ein $ff bei $3fff aber bei vice eben je nach RAM-Init-Einstellung nicht...
aber sicher ist sicher...

tecM0

Unregistered

9

Wednesday, May 31st 2006, 3:05pm

das ding heisst "ghostbyte" .... damit lässt sich z.b. ein "neuntes sprite" im border
faken. z.b. bei "p a n o r a m I c" ... in einer neueren demo waren es sogar 10...!?

http://noname.c64.org/csdb/release/?id=3310

T.

This post has been edited 1 times, last edit by "tecM0" (May 31st 2006, 3:06pm)


hannenz

Unregistered

10

Wednesday, May 31st 2006, 11:06pm

wenn ich deas richtig sehe holt der VIC im "Idle"-Zustand das Bitmuster aus $3fff, diesem ghostbyte. man kann das gut sehen, wenn man mal z.B. $aa oder so was reinschreibt bei obigem fld-bsp.
geht aber wohl nur schwarz oder...?!
wenn man jetzt in jeder rasterzeile $3fff ändert kann man da wohl schon ganz interessante sachen mit machen, wie man damit ein sprite faked werd ich mir gleich mal ansehen :)

sauhund

ist falsch abgebogen

  • "sauhund" is male

Posts: 20,323

Date of registration: Jul 16th 2005

Location: zuhause

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

11

Wednesday, May 31st 2006, 11:37pm

ja das geht nur in schwarz :)

zum "sprites" faken wird in der regel eine combination aus rastersplits mit dem ghostbyte und $d016 benutzt.
http://www.hitmen-console.org http://magicdisk.untergrund.net
Die Furcht vor der freimütigen Antwort kann auch robuste Charaktere befallen.

Roland

Master

Posts: 2,452

Date of registration: Sep 27th 2005

Location: Vergangenheit

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

12

Thursday, June 1st 2006, 7:24am

oder ghostbyte und $d021 :D

hoogo

Eimergesicht mit Wurst

  • "hoogo" is male

Posts: 1,347

Date of registration: Jan 22nd 2005

Location: Mülheim/Ruhr

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

13

Thursday, June 1st 2006, 9:07am

Du kannst den Multicolor-Modus anschalten, dann wirds doppelt schwarz ;)
Was gibt eigentlich der berühmte VIC-Text zu dem Ghostbyte her? Daß im MC-Modus keine weiteren Farben hinzukommen kommt mir sehr komisch vor. Warum Schwarz statt hellgrau? Warum die normale Hintergrundfarbe? Fragen über Fragen....
Vollmond war gestern!

hoogo

Eimergesicht mit Wurst

  • "hoogo" is male

Posts: 1,347

Date of registration: Jan 22nd 2005

Location: Mülheim/Ruhr

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

15

Thursday, June 1st 2006, 10:58am

Hm, erklärt leider nicht die komischen Punkte. Wenn der sich im Idle-Modus immer Screen/Farbram =$00 zieht und Grafik aus $3fff und ansonsten ganz normal arbeiten würde, was wäre denn dann der "normale" Modus
-Hires-Bitmap fällt aus, dann wäre da keine Hintergrundfarbe zu sehen, sondern alles Schwarz auf Schwarz
-Zeichensatz passt zwar in Hires, aber nicht in Multicolor. Bei Farbram $00 müsste das Ghostbyte dennoch Hires bleiben, ausserdem müssten die anderen Multicolorfarben auftauchen.
Im Hiresmodus Zeichensatz und im MC-Modus Bitmap würde zwar passen, aber was ist das denn für ein komischer Bug???

Edit:
Ich seh grad, daß der im Charset-MC-Modus ja auch Hires macht... dann passt's ja doch alles.
Vollmond war gestern!

This post has been edited 1 times, last edit by "hoogo" (Jun 1st 2006, 11:13am)


trifox

Unregistered

16

Monday, August 14th 2006, 5:27pm

ich habe mal eine frage zu diesem effekt, die schwarzen bereiche zwischen den zeilen, wie kommen die zustande ? durch verhindern das der vic neue daten fuer die zeile einliest???

und ich frage mich wie dieser effekt wohl im grafikmodus ausschaut, ist es nicht so, das der vic im grafikmodus fuer jede zeile irgend etwas auslesen muss aus dem grafikspeicher? und kann ich damit nicht mein bild stretchen?

hoogo

Eimergesicht mit Wurst

  • "hoogo" is male

Posts: 1,347

Date of registration: Jan 22nd 2005

Location: Mülheim/Ruhr

  • Send private message

member since 90 month member since 90 month member since 90 month member since 90 month member since 90 month

17

Monday, August 14th 2006, 8:40pm

Da gibt's zweierlei Zugriffe. Fürs Auslesen von Charram und Farbe muß der Prozessor angehalten werden, das ist die Badline, und das passiert am Anfang eines Chars. Danach steht das in einem internen Puffer, der die nächsten 8 Rasterzeilen abgearbeitet wird.
Der andere Zugriff ist dann der Bitmap/Charrom-Zugriff, der läuft unsichtbar ab und sorgt für die eigentliche Grafik.
Diesen Counter für die 8 Zeilen kann man etwas beeinflussen. Bei FLI und co resettet man den, beim FLD lässt man den einfach ab- und dann ins Leere laufen. Und wenn der ins Leere gelaufen ist dann kommt statt Grafik nur noch das Byte aus $3FFF und die Bildschirmpuffer geben nur noch Nullbytes her.
Genauer und richtiger findest Du das in Hannenz link oben.
Vollmond war gestern!