| |
Strepto
Registered: Dec 2015 Posts: 11 |
Kefrens bars
I've been thinking about kefrens bars on the c64.
How do you think it is implemented?
Perhaps using repeated char lines and update the chars using cycle exact timing? |
|
| |
Dano
Registered: Jul 2004 Posts: 234 |
Yes exactly that's how it is done usually.
Having no badlines you have all cycles per line available which is enough to paint one bar per line. |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
To be precise, the standard approach is to use linecrunching in char mode.
The last rasterline of a char row is repeated, without badlines.
You then draw over the char patterns right within the raster routine, so make sure you write exclusively before or after the individual chars are displayed.
Bonus points for putting the charset to $0000, so 32 of the 40 char patterns are in zeropage, allowing for wider bars.
Extra bonus points for using sprites at the top and a repeated char row at the bottom (with open Y-border), so you get 216 lines of effect. |
| |
Smasher
Registered: Feb 2003 Posts: 520 |
hey, I'm not a fan of Kefrens bars, but cool to have you back in bizz Strepto! :) |
| |
HCL
Registered: Feb 2003 Posts: 728 |
@Krill: :) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
repeating last row is now not stretching but linecrunch ?! or that is the same timing that results in bitmap move up ? |
| |
Golara Account closed
Registered: Jan 2018 Posts: 212 |
Quote: repeating last row is now not stretching but linecrunch ?! or that is the same timing that results in bitmap move up ?
Linecrunch is what is used for moving the bitmap up, but what really happens is that the last pixel line of a char is displayed only, so you skip the 7 pixel lines, because of that, the next char line is drawn higher than normal, repeat that and you scroll bitmap up. Here the same technique is used but instead of moving bitmap data, the whole screen is just these pixel lines from 7th line of a char and that line is modified to look like kefrens. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
yes I get all that, I was asking why is Krill calling a stretcher linecrunch, probably same routine with different result in different gfxmode. I havent coded linecrunch, but have done kefrens. |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
Quoting OswaldI was asking why is Krill calling a stretcher linecrunch Mostly because the term "stretcher" is rather ambiguous, as it could be repeated badlines, repeated char rows (without badlines), linecrunching, or something i just forgot. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
linecrunch as I understood it, reduces whole char rows to a single rasterline, what is being stretched ? |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
Quoting Oswaldlinecrunch as I understood it, reduces whole char rows to a single rasterline, what is being stretched ? The same rasterline will be repeated, as there is no DMA (badline) to fetch new char data, and RC will remain at 7. Thus, there is stretching. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
linecrunch crunches lines (char rows) down to a single rasterline, and this is used to move the screen upwards, so there should be badlines and not the same single rasterline displayed but in each rasterline a new char row in 1 pixel high glory ? |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
Quoting Oswaldlinecrunch crunches lines (char rows) down to a single rasterline, and this is used to move the screen upwards, so there should be badlines and not the same single rasterline displayed but in each rasterline a new char row in 1 pixel high glory ? If you linecrunch continuously, with a write to $d011 each rasterline, there will be no badlines. Once you stop writing to $d011, the last rasterline of the current char row will be repeated, but after that, there will be normal badline DMA action and new lines as normal, with whatever line counter is left after all the linecrunching. |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Quote: linecrunch crunches lines (char rows) down to a single rasterline, and this is used to move the screen upwards, so there should be badlines and not the same single rasterline displayed but in each rasterline a new char row in 1 pixel high glory ?
A DMA fetch != VC->VCBASE
With line crunch you avoid bad line condition by setting $d011&7 != $d017&7, then at cycle 59 you trigger bad line condition to avoid entering IDLE, then repeat. So basically you trick the VIC-chip into badline condition, but at the same time avoid the actual DMA. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
okay, some old c= hacking described it as really crunching down rows, and as I only ever used it for stretching (without knowing its the linecrunch effect) and not for moving screen, I didnt realize its really stretching. thanks :) |
| |
Golara Account closed
Registered: Jan 2018 Posts: 212 |
Quote: okay, some old c= hacking described it as really crunching down rows, and as I only ever used it for stretching (without knowing its the linecrunch effect) and not for moving screen, I didnt realize its really stretching. thanks :)
Yeah, C64 names are weird, some refer to the visible effect (you can do 'FLD' in software I guess, just copy graphics down) others to the actual technique. Also using word "line" as in charline, "pixel" as actual one raster line... I always found "Different Y char position" so weird. It sounds awkward, but it's exactly what it is.
It's even better when you hear some scener and not just read it, cuz I pronouce all kids of stuff differently, for example FLI as just FLEE and not EF EL AY or DYSP as.. well, DYSP not DEE UAJ ES PEE |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
Quoting Golarafor example FLI as just FLEE and not EF EL AY or DYSP as.. well, DYSP not DEE UAJ ES PEE As long as you don't pronounce "char" like "car"... =) |
| |
Smasher
Registered: Feb 2003 Posts: 520 |
Quote:It's even better when you hear some scener and not just read it, cuz I pronouce all kids of stuff differently, for example FLI as just FLEE and not EF EL AY or DYSP as.. well, DYSP not DEE UAJ ES PEE
hehe lol. not only routine acronyms, my head automagically translates all your handles/groups in a very Italian way. so I'm in "effequattrocigi" while "milleunocriu'" were first in opening the sideborder. and poor "federation against copyright" sounded like "f**k" :)
I remember the good old days chatting with sceners over PSTN... if you called you needed minimum 10 minutes to make me understand who you were. ehm, sorry for that :) |
| |
Street Tuff
Registered: Feb 2002 Posts: 88 |
https://bitbucket.org/streetuff/4krawall-final/src/master/kefre.. |
| |
CyberBrain Administrator
Posts: 392 |
I included the source code in the zip-file for Kefrens Without For, if you want to have some example code to look at.
("igenigen code" means "againagain code" which means "speedcode" :)) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
Quote: https://bitbucket.org/streetuff/4krawall-final/src/master/kefre..
that pha in the kernel is very sexy. |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
Quoting Oswaldthat pha in the kernel is very sexy. Both of them are! =)
In my contribution to Singles Collection Volume 2 *, i used chained rts to go from one bar-drawing snippet to the next. Saves a lot of table-lookup overhead and allows for immediate mask and pattern arguments. There's some trickery going on to have more than 128 return addresses on the stack (as there are 216 rather wide bars).
* You can load and run file "06*" directly, and do use x64sc (not x64) if you must resort to an emulator. |
| |
Dano
Registered: Jul 2004 Posts: 234 |
Quote: Quoting Oswaldthat pha in the kernel is very sexy. Both of them are! =)
In my contribution to Singles Collection Volume 2 *, i used chained rts to go from one bar-drawing snippet to the next. Saves a lot of table-lookup overhead and allows for immediate mask and pattern arguments. There's some trickery going on to have more than 128 return addresses on the stack (as there are 216 rather wide bars).
* You can load and run file "06*" directly, and do use x64sc (not x64) if you must resort to an emulator.
like i told you on BCC this is about as clever, tricky and beautiful as it can get. some hardcore adress brainfuck with that stack-split. :) was fun to analyse how you got this done. HCL and i took a somewhat easier approach though. |