| | 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.... |
| | SIDWAVE Account closed
Registered: Apr 2002 Posts: 2238 |
What Graham said.. |
| | 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 |
| | 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..
|
| | 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?! ^^
|
| | 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. |
| | Mr. SID
Registered: Jan 2003 Posts: 424 |
And they did it *without* Google! :) |
| | 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. |
| | 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 |
| | 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!?!?!? |
| | 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 | |