|
|
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 |

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.
This post has been edited 1 times, last edit by "enthusi" (May 30th 2006, 2:00pm)
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.
Quoted
Original von trifox
hm, ich sehe leider nur einen grauen bildschirm ...![]()

![:]](wcf/images/smilies/pleased.gif)
This post has been edited 1 times, last edit by "Roland" (May 30th 2006, 7:58pm)
This post has been edited 1 times, last edit by "tecM0" (May 31st 2006, 3:06pm)


This post has been edited 1 times, last edit by "hoogo" (Jun 1st 2006, 11:13am)
Forum Software: Burning Board® 3.1.7, developed by WoltLab® GmbH