Rasterinterrupts... [message #86996] |
Mon, 04 August 2003 04:30 |
David Mueller
Messages: 89 Registered: July 2003
Karma: 0
|
Member |
|
|
Hi...
Sorry to bother you again, but right now I'm trying to program some
Rasterbars just for the good old times sake. My problem is, i can't
really remember how to turn off the flickering (it's a PAL-Machine) that
occurs... I think I can remember something aubout some NOPs to do the
timing (or a short loop), but i just can't get it really nice working.
Are there some tutorials about this stuff on the net (all i found are the
Coders World and Scibax Diskmag which do a bad job explaining thoroughly
the working of rasterbars/interrupts and stuff).
Thanks a lot,
David
|
|
|
|
|
Re: Rasterinterrupts... [message #87017 is a reply to message #86996] |
Mon, 04 August 2003 12:38 |
reza_beha
Messages: 1 Registered: August 2003
Karma: 0
|
Junior Member |
|
|
David Mueller <david.mueller@post.rwth-aachen.de> wrote in message news:<MPG.1994f566ac2ebdca989684@news.rwth-aachen.de>...
> Hi...
>
> Sorry to bother you again, but right now I'm trying to program some
> Rasterbars just for the good old times sake. My problem is, i can't
> really remember how to turn off the flickering (it's a PAL-Machine) that
> occurs... I think I can remember something aubout some NOPs to do the
> timing (or a short loop), but i just can't get it really nice working.
> Are there some tutorials about this stuff on the net (all i found are the
> Coders World and Scibax Diskmag which do a bad job explaining thoroughly
> the working of rasterbars/interrupts and stuff).
>
> Thanks a lot,
>
> David
The idea behind the NOPs is to delay the color change until the raster
beam
has gone off screen where you can't see it. If you see the flicker in
the center of your screen, add a few NOPs to edge it over to the right
until it's gone. If you have a bar with many colors, it makes sense
to use a loop that pulls delay info from a small table with as many
values as there will be rows or colors in your bar.
Making clean raster bars is easy when you have a Super Snapshot
cartridge or some other way to break into your code while it's
running, make some timing changes and jump back out to see what
happened.
|
|
|
Re: Rasterinterrupts... [message #87021 is a reply to message #86996] |
Mon, 04 August 2003 14:14 |
David Mueller
Messages: 89 Registered: July 2003
Karma: 0
|
Member |
|
|
Hi...
On 4 Aug 2003 08:42:21 -0500, ckaiser@floodgap.com said...
>> Sorry to bother you again, but right now I'm trying to program some
>> Rasterbars just for the good old times sake.
>
> Horizontal or vertical?
You can do _vertical_ Rasterbars? I always thought, the c64 was too slow
to do so... But first I'm just interested in getting horizontal ones
without flickering...
David
|
|
|
|
Re: Rasterinterrupts... [message #87050 is a reply to message #87021] |
Mon, 04 August 2003 22:01 |
Cameron Kaiser
Messages: 1622 Registered: December 2011
Karma: 0
|
Senior Member |
|
|
David Mueller <david.mueller@post.rwth-aachen.de> writes:
>>> Sorry to bother you again, but right now I'm trying to program some
>>> Rasterbars just for the good old times sake.
>> Horizontal or vertical?
> You can do _vertical_ Rasterbars? I always thought, the c64 was too slow
> to do so... But first I'm just interested in getting horizontal ones
> without flickering...
Yes, there are several demos that have done this. I'm long on theory but
short on example for it, however.
The most direct way to do flicker-free horizontal bars is to lock onto the
raster and don't let it go -- grab control of the system, wait out the
right number of processor cycles per line, and make the switch at the right
place. However, this will make your program video-standard-specific and of
course you don't have IRQ services unless you call $ea31 every now and then.
The way I've typically done flicker-free bars is by cheating -- I use sprites
set to the background colour to mask the flickering lines, and an ordinary
VIC-II triggered raster IRQ in multiple places, moving the masking sprites
down to each "border" of the bar(s). This works on PAL and NTSC, and makes
nice code, although it requires a bit of set up and obviously ties up
sprites (I use seven with X-expand on to cover the entire screen width,
leaving the eighth free for manipulation).
--
Cameron Kaiser * ckaiser@floodgap.com * posting with a Commodore 128
personal page: http://www.armory.com/%7Espectre/
** Computer Workshops: games, productivity software and more for C64/128! **
** http://www.armory.com/%7Espectre/cwi/ **
|
|
|
|
Re: Rasterinterrupts... [message #87123 is a reply to message #87021] |
Wed, 06 August 2003 12:24 |
MagerValp
Messages: 847 Registered: April 2012
Karma: 0
|
Senior Member |
|
|
>>>> > "DM" == David Mueller <david.mueller@post.rwth-aachen.de> writes:
DM> You can do _vertical_ Rasterbars? I always thought, the c64 was
DM> too slow to do so... But first I'm just interested in getting
DM> horizontal ones without flickering...
Well they aren't technically the same effect as horizontal rasterbars,
but it looks the same. You either use sprites that you mux down the
screen, or render the bars to 40 chars and line double with $d011,
just like you do with kefrens bars.
--
___ . . . . . + . . o
_|___|_ + . + . + . Per Olofsson, arkadspelare
o-o . . . o + MagerValp@cling.gu.se
- + + . http://www.cling.gu.se/~cl3polof/
|
|
|
|
Re: Rasterinterrupts... [message #88476 is a reply to message #86996] |
Sun, 24 August 2003 00:07 |
Anton Treuenfels
Messages: 105 Registered: December 2011
Karma: 0
|
Senior Member |
|
|
IIRC, with a simple split screen (just two hires areas, a fixed one above
and a scrolling one below), I traced most of the flickering to the keyboard.
The normal IRQ routine runs asynchronously with the raster interrupt. Again
if IIRC, what I did was get rid of it entirely and call the heartbeat
routines (keyscan, etc) during the raster interrupt instead (actually every
other interrupt, when the raster was below the visible screen).
More subtle was reading the keyboard input buffer. The normal Kernel routine
actually blocks interrupts (SEI) while removing characters from the buffer,
so it can interfere with the raster interrupt. I think I wrote my own
keybuffer routines to treat the buffer as a FIFO queue (instead of a LIFO
queue) that didn't need to block interrupts to work correctly (the final
routines were then more like the Kernel RS-232 routines, and were probably
modeled on them).
After that the raster split was rock solid. I've never really understood how
to use timing loops or sprites to make the splits look clean, but apparently
a lot of people do.
"David Mueller" <david.mueller@post.rwth-aachen.de> wrote in message
news:MPG.1994f566ac2ebdca989684@news.rwth-aachen.de...
> Hi...
>
> Sorry to bother you again, but right now I'm trying to program some
> Rasterbars just for the good old times sake. My problem is, i can't
> really remember how to turn off the flickering (it's a PAL-Machine) that
> occurs... I think I can remember something aubout some NOPs to do the
> timing (or a short loop), but i just can't get it really nice working.
> Are there some tutorials about this stuff on the net (all i found are the
> Coders World and Scibax Diskmag which do a bad job explaining thoroughly
> the working of rasterbars/interrupts and stuff).
>
> Thanks a lot,
>
> David
|
|
|
Re: Rasterinterrupts... [message #88498 is a reply to message #88476] |
Sun, 24 August 2003 23:07 |
marc
Messages: 48 Registered: May 2013
Karma: 0
|
Member |
|
|
"Anton Treuenfels" <teamtempest@yahoo.com> wrote in message news:<xSW1b.5480$8i2.2542@newsread2.news.atl.earthlink.net>...
> IIRC, with a simple split screen (just two hires areas, a fixed one above
> and a scrolling one below), I traced most of the flickering to the keyboard.
This is the keyboard IRQ interrupting once every frame and has nothing
to do with your interrupt routine's timing, as you have discovered.
From memory, they way I do it is:
Within the setup code do:
lda #$7f ; CIA
sta $dc0d
lda $dc0d
to kill the keyboard interrupt.
At the end of your interrupt routine you may call the keyboard service
routine via the kernal. There are 2 calls required, the first to place
a value in the keybuffer, the sencond to transfer the oldest (LIFO)
character into the Accumulator. I dont have my PRG handy, but IIRC
it's
JSR $FF9F
JSR $FFC3
SEI (IIRC the SEI is required to turn off interrupts that FF9F
reenabled to allow your service routine to complete)
JMP $EA81
> After that the raster split was rock solid. I've never really understood how
> to use timing loops or sprites to make the splits look clean, but apparently
> a lot of people do.
See the code below for some ideas. It's a split-screen vertical
scroller.
You could modify the basic routine to give steady $d021 splits by
padding the service routine out to the far right edge and doing LDA
$d012 then a compare with the expected value. Since the "jitter" is 2
cycles, if the raster value is the next line then a jump "past" a
single cycle is required to shave off that unwanted cycle (beware page
boundaries!).
The text and code below is pasted from one of my earlier posts:
Apart from the space formatting for this post, the code is compilable
with
Pro-Line's PAL Assembler. Also, my coding style is conservative (no
shortcuts) so please don't bother with comments like how to make it
shorter
by plugging absolute values into the registers rather than "LDA reg,
logical op, STA reg" :-)
;PAL Assembler format sourcecode
;split screen verticle scroll
RIV0 = 46
RIV1 = 49+(12*8)
BD = $D020
SCR = 1024
start =*
lda $d011
and #247
sta $d011
jsr RINIT
:
lda #0
MRL beq MRL ; loop to give max 2-char jitter
cli
brk
:
YP ldy #13 ;timing pause
YPL dey
bpl YPL
rts
:
YP1 ldy #7 ;timing pause
YP1L dey
bpl YP1L
rts
:
RINIT sei ; setup raster interrupt
lda #1
sta $d01a
sta $d019
lda $d011
and #$7f
sta $d011
ldx #<RI0 ; new IRQ vector
ldy #>RI0
lda #RIV0
JSR RIVSET0
lda #$7f ; CIA
sta $dc0d
lda $dc0d
cli
rts
:
RIVSET0 stx $0314 ; set IRQ values
sty $0315
sta $d012
rts
:
RIEXIT lda #1 ; exit IRQ
sta $d019
cli
jmp $ea81
:
RESR1 lda #RIV1
sec
sbc $fc
sta $fd
rts
:
RI0 sei
ldx #<RI1
ldy #>RI1
jsr RESR1
lda #RIV1 - 5
jsr RIVSET0
lda $d011
and #248
ora $fc
sta $d011
lda $dc01 ; check keyboard
cmp #$ef ; spacebar?
bne RX0 ; branch if no
lda #$ea ; else clear the NOPs
sta MRL
lda #$ea
sta MRL + 1
:
RX0 jmp RIEXIT
:
RI1 sei
ldx #<RI0
ldy #>RI0
lda #RIV0
jsr RIVSET0
lda $d011
and #248
ora #7
ldx #RIV1 - 3 ; force default Y-FINE
ldy #30 ; to see the glitch change the 30 to a 21
RLL cpx $d012
bne RLL
sty 53272 ;set "blank" charset for the 8-pixel split-band
inx
inx
inx
RL cpx $d012
bne RL
jsr YP
sta $d011
ldx #RIV1 + 5
RL0 cpx $d012
bne RL0
jsr YP1
lda #21
sta $d018 ;normal charset
jsr INCER
jmp RIEXIT
:
JOYER lda $dc00 ; JOY#2, FIRE to scroll
and #16 ; fire?
bne JRET ; branch if no
dec $fc
lda $fc
and #7
sta $fc
cmp #7
bne JRET
jsr SHUP ; hardscroll char data
:
JRET rts
:
TIM .byt 0
:
INCER dec TIM
bpl INCRET
lda #0
sta TIM
jmp JOYER
:
INCRET rts
:
COL ldx #0 ; set charset and put up some screen data to
scroll
CL lda #0
sta $3a00,x
sta $3b00,x
sta $3c00,x
sta $3d00,x
sta $3e00,x
sta $3f00,x
txa
sta $0400,x
dex
bne CL
stx $3fff
rts
:
SHUP inc BD ; hardscroll screen data and show processor load
ldx #39
SHUPL lda SCR,x
pha
lda SCR+40,x
sta SCR,x
lda SCR+80,x
sta SCR+40,x
lda SCR+120,x
sta SCR+80,x
lda SCR+160,x
sta SCR+120,x
lda SCR+200,x
sta SCR+160,x
pla
sta SCR+200,x
dex
bpl SHUPL
dec BD
rts
Marc Walters
|
|
|