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-21 12:02
SIDWAVE
Account closed

Registered: Apr 2002
Posts: 2238
What Graham said..
2009-10-21 13:01
8bitforever
Account closed

Registered: Oct 2009
Posts: 48
OK, I will try that Graham and Jan.

Could you please give some sample code on howto move around
the colobar in the middle of this array below to an equal big shadow array ?

!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
2009-10-21 13:24
Frantic

Registered: Mar 2003
Posts: 1648
This question makes it clear beyond belief that you should just take 10 minutes to read an introductory text to coding 6510 assembler in general. Are you seriously taking up peoples time by asking how to copy a few bytes of data from one place in memory to another place? Ever heard of LDA/STA? Ever heard of a loop?

Try learning something from this one:
http://codebase64.org/doku.php?id=magazines:chacking2#beginning..
2009-10-21 14:42
Marauder/GSS
Account closed

Registered: Jul 2006
Posts: 224
if you just want to move your rasterbar up 'n down, then you don't even need to copy data around in the table.
Just make your table bigger and adjust/modify the address where you're reading your colors from...
ofcoz don't work when you want to have mulitple "overlappin" color-bars, then lda/sta/loops is your friend, like frantic said...

DejaVu...Didn't I've already mentioned it in my first answer/post?! ^^



2009-10-21 14:59
MagerValp

Registered: Dec 2001
Posts: 1078
8bf: the answer has been posted here at least three times, together with several other helpful comments. If you don't understand the answer, you need to go back and study the basics. And no, you can't google your way to becoming a C64 demo coder. It takes a bit more effort than that. Not a whole lot mind you - 13 year old kids figured out this stuff in the 80s.
2009-10-21 15:17
Mr. SID

Registered: Jan 2003
Posts: 424
And they did it *without* Google! :)
2009-10-21 15:49
Carrion

Registered: Feb 2009
Posts: 317
13 year old did demos? nice.
[offtoopic]
But on last Silesia party there was a guy (about 35) with his 9 years old son. He said he never new what demoscene is but his son wants to code c64. after few talks to us (even me ;) he coded small and simple assembelr program. We need people like that to make our scene last for years.
2009-10-21 22:06
SIDWAVE
Account closed

Registered: Apr 2002
Posts: 2238
Quote: OK, I will try that Graham and Jan.

Could you please give some sample code on howto move around
the colobar in the middle of this array below to an equal big shadow array ?

!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


ldy sinus,x
lda color,y
sta color_buffer,y


you have several color tables,
you sta colors from them, into a buffer (mix the data)
you show this data
2009-10-22 06:56
HCL

Registered: Feb 2003
Posts: 728
Hmm.. First *someone* 9-year old starts to code c64, then *someone* asks for flickerfree moving raster stuff!? Is that just a coincidence or does your head go bling also!?!?!?
2009-10-22 07:18
SIDWAVE
Account closed

Registered: Apr 2002
Posts: 2238
LOL! well, just rip the code from somewhere, and use 1 hour to understand it then. no big prob :D
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
BYB/Hokuto Force
Guests online: 124
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 Swappers
1 Derbyshire Ram  (10)
2 Jerry  (9.8)
3 Violator  (9.7)
4 Acidchild  (9.7)
5 Cash  (9.6)

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