Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in - nap
CSDb User Forums


Forums > C64 Coding > Howto flickerfree and moving rasterbar ?
2009-10-19 23:18
8bitforever
Account closed

Registered: Oct 2009
Posts: 48
Howto flickerfree and moving rasterbar ?

<Post edited by moderator on 20/10-2009 01:24>

Making a perfect stable, flickerfree and moving rasterbar is harder than I thought.
Why and which changes are needed to the code below to fulfill my dream about the flickerfree rasterbar?
The code is based on http://www.ffd2.com/fridge/vic/stableraster.txt.
Acme code ready to compile:

!to "doubleirqrasterbar1.prg",cbm  

*= $0800
!byte $00,$0c,$08,$0a,$00,$9e,$33,$32,$37,$36,$38,$00,$00,$00,$00	
 
raspos    = $00
maxpos    = $7c

         *= $8000    ;Assemble to $8000       
         
         cld         ;Clear Decimal Mode
         sei         ;Disable IRQ's
         lda #$1f    ;Disable CIA IRQ's
         sta $dc0d
         sta $dd0d
 
;        lda #<nmi   ;Install NMI into
;        ldx #>nmi   ;Hardware NMI and
;        sta $fffa   ;RESET Vectors
;        sta $fffc
;        stx $fffb
;        stx $fffd
 
         lda #<irq1  ;Install RASTER IRQ
         ldx #>irq1  ;into Hardware
         sta $0314   ;Interrupt Vector
         stx $0315
 
;        lda #$35    ;Set MMU to RAM at
;        ldx #$ff    ;$a000-$bfff and
;        sta $01     ;$e000-$ffff
;        txs         ;Clear the STACK
 
         lda #$01    ;Enable RASTER IRQ
         ldx #$1b    ;High bit of RASTER
         ldy #$34    ;compare register
         sta $d01a   ;and RASTER IRQ to
         stx $d011   ;line $34
         sty $d012
                     ;NOTE double IRQ
                     ;cannot be on or
                     ;around a BAD LINE!
                     ;(Fast Line)
 
         lda #$0e    ;Set Background
         ldx #$06    ;and Border colors
         ldy #$00    ;to default and
         sta $d020   ;turn off sprites
         stx $d021
         sty $d015
 
         jsr clrscreen
         jsr clrcolor
;        jsr printtext
 
         asl $d019   ;Ack any previous
         lda $dc0d   ;IRQ's
         lda $dd0d
 
         cli         ;Renable IRQ's
 
         jmp *       ;Endless Loop
 
 
irq1
         sta reseta1 ;Preserve A,X and Y
         stx resetx1 ;Registers
         sty resety1 ;VIA self modifying
                     ;code
                     ;(Faster than the
                     ;STACK is!)
 
         lda #<irq2  ;Set IRQ Vector
         ldx #>irq2  ;to point to the
         ldy #$35    ;next part of the
         sta $0314   ;Stable IRQ
         stx $0315   ;ON NEXT LINE!
         sty $d012
         asl $d019   ;Ack RASTER IRQ
         tsx         ;We want the IRQ
         cli         ;To return to our
         nop         ;endless loop
         nop         ;NOT THE END OF
         nop         ;THIS IRQ!
         nop
         nop         ;Execute nop's
         nop         ;until next RASTER
         nop         ;IRQ Triggers
         nop
         nop         ;2 cycles per
         nop         ;instruction so
         nop         ;we will be within
         nop         ;1 cycle of RASTER
         nop         ;Register change
 
;        nop  ;<--- remove 1 NOP for PAL

irq2
         txs         ;Restore STACK
                     ;Pointer
         ldx #$08    ;Wait exactly 1
         dex         ;lines worth of
         bne *-1     ;cycles for compare
         bit $ea     ;Minus compare
         nop         ;cycles
 
;        nop  ;<--- remove 1 NOP for PAL
 
         lda #$35    ;RASTER change yet?
         cmp $d012
         beq start   ;If no waste 1 more
                     ;cycle
start

         ldx raspos
         cpx #maxpos   
         beq setrastup
         inx
         stx raspos
         cpx #maxpos   
         bne rasterbarctrl

setrastup     
         ldx #$00
         stx raspos        ;Reset raster positon to 
                           ;zero if maximum has been reached.     

rasterbarctrl
         ldx raspos
         ldy rastmov,x    ;Wait for rasterline $3D-$96 at $D012 
wait     cpy $d012 
         bne wait 
        
                              ;rasterbar
         ldx #$00 
copy11   ldy rastime,x       
         dey                    
         bne *-1 
         lda coloursr,x       
         sta $d020 
         sta $d021 
         inx 
         cpx #$10
         bne copy11


         lda #<irq3  ;Set IRQ to point
         ldx #>irq3  ;to subsequent IRQ
         ldy #$b8    ;at line $68
         sta $0314
         stx $0315
         sty $d012
         asl $d019   ;Ack RASTER IRQ
 
         lda #$00    ;Reload A,X,and Y
reseta1  = *-1       ;registers
         ldx #$00
resetx1  = *-1
         ldy #$00
resety1  = *-1
 
;        rti         ;Return from IRQ
         jmp $ea31
irq3
         sta reseta2 ;Preserve A,X,and Y
         stx resetx2 ;Registers
         sty resety2
 
         ldx #$0a    ;Waste some more
         dex         ;time so effect
         bne *-1     ;can be seen
         nop
 
;        lda #$0e    ;More colors
;        ldx #$06
;	 nop:nop 
;        sta $d021   ;Cool! subsequent
;        stx $d021   ;IRQ's are also
                     ;stable :-)
                     ;Unless you are
                     ;running realtime
                     ;code :-)
 
         ldy #$18    ;Waste time so this
         dey         ;IRQ does not try
         bne *-1     ;to reoccur on the
                     ;same line!
 
         lda #<irq1  ;Reset Vectors to
         ldx #>irq1  ;first IRQ again
         ldy #$34    ;at line $34
         sta $0314
         stx $0315
         sty $d012
         asl $d019   ;Ack RASTER IRQ
 
         lda #$00    ;Reload A,X,and Y
reseta2  = *-1       ;registers
         ldx #$00
resetx2  = *-1
         ldy #$00
resety2  = *-1
 
;        rti         ;Return from IRQ
         jmp $ea81 
                     ;Pound RESTORE to
                     ;get back to Turbo
nmi
         asl $d019   ;Ack all IRQ's
         lda $dc0d
         lda $dd0d
         lda #$81    ;reset CIA 1 IRQ
         ldx #$00    ;remove raster IRQ
         ldy #$37    ;reset MMU to roms
         sta $dc0d
         stx $d01a
         sty $01
         ldx #$ff    ;clear the stack
         txs
         cli         ;reenable IRQ's
         jmp $9000   ;back to Turbo
 
clrscreen
         lda #$20    ;Clear the screen
         ldx #$00
clrscr   sta $0400,x
         sta $0500,x
         sta $0600,x
         sta $0700,x
         dex
         bne clrscr
         rts
clrcolor
         lda #$03    ;Clear color memory
         ldx #$00
clrcol   sta $d800,x
         sta $d900,x
         sta $da00,x
         sta $db00,x
         dex
         bne clrcol
         rts
 
printtext
         lda #$16    ;C-set = lower case
         sta $d018
 
         ldx #$00
moretext lda text1,x
 
         bpl lower   ;upper case ?
         eor #$80    ;yes
 
         bne lower+2
 
lower    and #$3f    ;lower case
         sta $0450,x
         inx
         cpx #$78
         bne moretext
exit     rts
 
text1
         !scr "Stable Raster IRQ sourc"
         !scr "e (PAL/NTSC)     "
         !scr "All Code by Fungus 1996"
         !scr "                 "
         !scr "Feel free to use and mo"
         !scr "dify this code :)"
 


;------------------------------------------------------------------------------- -
;raster data
;------------------------------------------------------------------------------- -

rastime      
             !byte $08,$08,$08,$08,$08,$08,$08,$01
             !byte $08,$08,$08,$08,$08,$08,$08,$01

coloursr     
             !byte $0b,$0b,$0c,$0c,$0f,$0f,$0d,$0d
             !byte $0d,$0f,$0f,$0c,$0c,$0b,$0b,$00


rastmov      
             !byte $3D,$3D,$3E,$3E,$3F,$3F,$40,$40,$41,$42,$43,$44,$45,$46,$47,$48
             !byte $49,$4A,$4C,$4E,$50,$52,$54,$56,$58,$5A,$5C,$5E,$60,$62,$64,$66
             !byte $68,$6A,$6C,$6E,$70,$72,$74,$76,$78,$7A,$7C,$7E,$80,$82,$84,$86
             !byte $88,$8A,$8C,$8E,$8F,$90,$91,$92,$93,$94,$94,$95,$95,$96,$96,$95
             !byte $95,$94,$94,$93,$93,$92,$91,$90,$8F,$8E,$8D,$8D,$8B,$89,$87,$85
             !byte $83,$81,$7F,$7D,$7B,$79,$77,$75,$73,$71,$6F,$6D,$6B,$69,$67,$65
             !byte $63,$61,$5F,$5D,$5B,$59,$57,$55,$53,$51,$4F,$4D,$4B,$49,$48,$47
             !byte $46,$45,$44,$43,$42,$41,$40,$40,$3F,$3F,$3E,$3E



 
... 71 posts hidden. Click here to view all posts....
 
2009-10-22 14:46
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: Move the non-zero bytes (colorbar) in the middle of the array back and forward and back forever within the array one byte at a time. And always zero in the array around the moved colorbar.

!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $0b, $0b, $0c, $0c, $0f, $0f, $0d, $0d
!byte $0d, $0f, $0f, $0c, $0c, $0b, $0b, $00
!byte $0b, $0b, $0c, $0c, $0f, $0f, $0d, $0d
!byte $0d, $0f, $0f, $0c, $0c, $0b, $0b, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00

Can someone show the code for a routine like this ?
You are experts, arent you, easy then ... :-)



It's like the Matrix... There is no spoon...

input:
.repeat 2
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $0b, $0b, $0c, $0c, $0f, $0f, $0d, $0d
!byte $0d, $0f, $0f, $0c, $0c, $0b, $0b, $00
!byte $0b, $0b, $0c, $0c, $0f, $0f, $0d, $0d
!byte $0d, $0f, $0f, $0c, $0c, $0b, $0b, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
.endrep

output:
.res 256,0

ldy ypos
ldx #0
:
lda input,y
iny
sta output,x
inx
bne :-
2009-10-22 14:55
Pantaloon

Registered: Aug 2003
Posts: 124
spoiler alert!! jackasser is revealing top secret stuff of the demoscene. BAN HIM!
2009-10-22 15:00
8bitforever
Account closed

Registered: Oct 2009
Posts: 48
Thanks Jackasser, Im trying to open up the matrix of the holy C64 coding. Hope to be able to show my finished flickerfree routine here soon. But I need more of your important code to finish. Please give some more code Jackasser. For the sake of fast progress. Its 2009.
The Matrix is closing in.
2009-10-22 15:02
Marauder/GSS
Account closed

Registered: Jul 2006
Posts: 224
hehe... "Agent Smith, where are you?? we have here a..." :D

but I guess the next question is to convert it to ACME and how to use it/where are the "missing things/secrets"... ^^

*edit: well, a bit to late but not that wrong with my assumption *g*


2009-10-22 15:41
SIDWAVE
Account closed

Registered: Apr 2002
Posts: 2238
8bitforever:

if you do:

lda color,x
inx
lda color,x

what is x now ?

then your table has 0,0,0,0,0,0,0,0,color,0,0,0,0,0,0

so when you change x, it loads from different places.

as i showed, you can use a sinus curve for the x value, or you can just increase/decrease it.

before you do more, now take a piece of paper and make some pseudocode that is tested and works, then try to make 6510 AFTERWARDS.
2009-10-22 15:53
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: Thanks Jackasser, Im trying to open up the matrix of the holy C64 coding. Hope to be able to show my finished flickerfree routine here soon. But I need more of your important code to finish. Please give some more code Jackasser. For the sake of fast progress. Its 2009.
The Matrix is closing in.


I don't want another rasterbars part. If you do, then you do it. If you have a learning problem then tough luck, you need to practice more. Actually practice is key to C64 coding... but since I actually think you're ignorant I suggest you buzz off and stalk some other forum.
2009-10-22 16:07
8bitforever
Account closed

Registered: Oct 2009
Posts: 48
I'm not ignorant. I want to publish a flicker free rasterbar routine for other beginers like me.
There is no ascii published one out there.
I'm trying to learn. Can you please explain about your ypos-pointer. How and when do you update it.
I'm going to try out your code piece later tonight.
2009-10-22 16:32
WVL

Registered: Mar 2002
Posts: 902
OMG! it's 2009! that means that it's already more than 25 years ago people made moving rasterbars! There's already so much information on the internet that you'll have to find out for yourself.
2009-10-22 16:38
Marauder/GSS
Account closed

Registered: Jul 2006
Posts: 224
Y-Pos must be increased/decreased once per irq, so logical... ^^

oh come on... when g00gle can't find a source-code to a flickerfree rasterbar, then it's impossible to do... didn't you know?? (c;

2009-10-22 17:10
8bitforever
Account closed

Registered: Oct 2009
Posts: 48
I have one experimental flickerfree moving raster bar running now !
Thanks Jackasser and Jan !
I will try to combine it with the fungus stable raster code soon. Then I will publish the first flicker free moving rasterbar on the Internet.
The code will be ready to compile in ACME.

All of you who thinks this code is out there please provide
a link. Make sure it´s flickerfree first.
Previous - 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 - Next
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
Jazzcat/Onslaught
sln.pixelrat
Murphy/Exceed
Urban Space Cowboy
Guests online: 133
Top Demos
1 Next Level  (9.7)
2 13:37  (9.7)
3 Mojo  (9.7)
4 Coma Light 13  (9.6)
5 Edge of Disgrace  (9.6)
6 What Is The Matrix 2  (9.6)
7 The Demo Coder  (9.6)
8 Uncensored  (9.6)
9 Comaland 100%  (9.6)
10 Wonderland XIV  (9.6)
Top onefile Demos
1 No Listen  (9.6)
2 Layers  (9.6)
3 Cubic Dream  (9.6)
4 Party Elk 2  (9.6)
5 Copper Booze  (9.6)
6 X-Mas Demo 2024  (9.5)
7 Dawnfall V1.1  (9.5)
8 Rainbow Connection  (9.5)
9 Onscreen 5k  (9.5)
10 Morph  (9.5)
Top Groups
1 Performers  (9.3)
2 Booze Design  (9.3)
3 Oxyron  (9.3)
4 Censor Design  (9.3)
5 Triad  (9.3)
Top Webmasters
1 Slaygon  (9.6)
2 Perff  (9.6)
3 Sabbi  (9.5)
4 Morpheus  (9.4)
5 CreaMD  (9.1)

Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.057 sec.