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 > Lda $d012 And #$07 ora #18 sta $d011
2020-03-25 20:29
crl

Registered: Mar 2020
Posts: 19
Lda $d012 And #$07 ora #18 sta $d011

The title says it all. I learned this raster timing trick in 1988, but I never understood why and how it works.

I understand that we in step 1 take the current raster line and AND it by %00000111. In step 2, we OR by %00011000. And then, we store that in $d011.

But when I look at the specific bits in d011, I get confused.

In step 1, we shift the screen downwards by x lines, x being equal to $d012 and %00000111.

But why do we then turn bits 4 and 5 on in d011 in step 2?

Bit 5 = high resolution graphics on
Bit 4 = screen area is visible or not

Can someone explain this 32 years old mystery to me?
2020-03-25 20:42
Krill

Registered: Apr 2002
Posts: 2940
The value only becomes effective with the actual sta $d011.

Bits 4 and 5 need to be set (and bit 6 clear in your case), well, because those control the display mode.
You may change them mid-screen, but the result might not be what you want.

And what you want appears to be display on (bit 4) and bitmap mode enabled (bit 5) and ECM off (bit 6).
You can use other combinations for different screen modes, some of them invalid (black pixels).

Actually i'm not quite sure where your confusion lies.
2020-03-25 20:50
crl

Registered: Mar 2020
Posts: 19
Ok, so the part that allows me to do raster splits is part 1, i.e. skipping bad linea?
2020-03-25 20:52
Copyfault

Registered: Dec 2001
Posts: 468
Hmm, looks like setting up a badline condition for the current rasterline. Assuming this "trick" is repeated (in some kind of loop with fixed timing), it should make up FLI = flexible line interpretation.

Short explanation (as addon to Krill's lines;)): a badline is created whenever the lower 3 bits of $D011 match with the lower three bits of $D012 (=current rasline). So your opcodes basically "cut out" the lower bits of $D012, set up some other bits relevant for the gfx mode you want to display (see Krill's post above) and write this to $D011 to "force" the badline condition.

Maybe it was used for smth else, but I strongly guess this was a FLI-routine.
2020-03-25 20:53
crl

Registered: Mar 2020
Posts: 19
I used this when I did raster splits, meaning that it did occur in a loop
2020-03-25 20:54
Krill

Registered: Apr 2002
Posts: 2940
Sort of. You prevent a bad line condition, effectively turning them off.
However, the bad line condition is precisely that the low 3 bits of $d012 (current rasterline) and $d011 (YSCROLL) match.

So for this to be stable (and not depend on the beam's position within the current rasterline), better add 1 or so before the AND.
2020-03-25 21:01
Copyfault

Registered: Dec 2001
Posts: 468
Yes;) Wanted to wait for the reply of crl to add this: depending on the timing this "trick" could also be used to _avoid_ badlines: if you made sure that the STA $D011 happens not before the rasterline in which the LDA $D011 was executed, you'd make sure that the rasterline in which the STA $D011 is executed is not a badline. Putting this in a loop makes the VIC continously avoiding a badline.

As always in c64 coding, it all depends on the timing;)
2020-03-25 21:02
crl

Registered: Mar 2020
Posts: 19
Interesting. Thanks for explaining
2020-03-25 23:19
Mr. SID

Registered: Jan 2003
Posts: 424
And btw, it's bit 3 and bit 4 that are turned on when or-ing with $18. Which are:

Bit 4 = enable screen
Bit 3 = 25 rows

Those are pretty essential, in most cases, so it's a good idea to have them set... :)
2020-03-25 23:32
Krill

Registered: Apr 2002
Posts: 2940
Hah, good catch.

But both bits don't mean much until you get close to the lower border and then vertical blank.

Meaning if you set them only some way down the screen, no problem. :)
2020-03-26 06:21
crl

Registered: Mar 2020
Posts: 19
Mr. Sid, correct. Somewhere in the process, I confused 0-7 with 1-8.

I played a bit my code again, and it seems that bit 3 isn't important to the intended outcome, which in this case is to make some nicely timed rasterbars without badlines.

But what I still don't understand is why I need to keep setting bit 4 (enable screen) every rasterline in order to ensure timing.

Another question I would like to ask is why I get a chessboard pattern on top of my rasterbards when I do this.

I'm sorry if these are stupid questions but I haven't coded for 30 years :-)
2020-03-26 07:53
oziphantom

Registered: Oct 2014
Posts: 488
are you in default font? probably because you are messing with the bad lines and the VIC is getting char FF which is the checkerboard char in the default font. Change the last byte in the bank ($3fff probably for you at the moment) and see if the pattern changes.
2020-03-26 10:33
Rastah Bar
Account closed

Registered: Oct 2012
Posts: 336
crl, have a look at the VIC-article:
VIC Article [english]

Sections 3.5-3.7 and 3.14 are particularly interesting for what you are doing.

It is not that you have to keep setting bit 4, but rather that you don't want to set it to 0.
2020-03-26 11:20
tlr

Registered: Sep 2003
Posts: 1762
In my earliest side border stuff I used things like this:
.C:464b  A0 2F       LDY #$2F
.C:464d  EE 16 D0    INC $D016
.C:4650  CE 16 D0    DEC $D016
.C:4653  AE 11 D0    LDX $D011
.C:4656  E8          INX
.C:4657  8A          TXA
.C:4658  29 07       AND #$07
.C:465a  09 00       ORA #$18
.C:465c  8D 11 D0    STA $D011
.C:465f  EA          NOP
.C:4660  EA          NOP
.C:4661  EA          NOP
.C:4662  EA          NOP
.C:4663  EA          NOP
.C:4664  24 FC       BIT $FC
.C:4666  88          DEY
.C:4667  10 E4       BPL $464D
.C:4669  A9 1B       LDA #$1B
.C:466b  8D 11 D0    STA $D011
Changing the ORA #$18 -> ORA #$00 makes no difference. I guess I just added it because you're "supposed" to set those bits.
2020-03-26 11:22
Krill

Registered: Apr 2002
Posts: 2940
Actually, doing INC $d011 once per rasterline is sufficient to avoid badlines in that scenario (with a proper initial value).
They are "shoved" to the next line continuously.
2020-03-26 11:36
tlr

Registered: Sep 2003
Posts: 1762
Quote: Actually, doing INC $d011 once per rasterline is sufficient to avoid badlines in that scenario (with a proper initial value).
They are "shoved" to the next line continuously.


Yes, or modify it to use the loop counter. I wasn't really looking for optimizations here I guess. I remember being quite content just making it work. :)
2020-03-26 11:47
Krill

Registered: Apr 2002
Posts: 2940
Quoting tlr
Yes, or modify it to use the loop counter. I wasn't really looking for optimizations here I guess. I remember being quite content just making it work. :)
Wasn't quite aiming at your old code but at OP's educational benefit. :)
2020-03-27 10:33
tlr

Registered: Sep 2003
Posts: 1762
Another approach is to just change Y-scroll when absolutely necessary to avoid a bad line. No need to change it every line.
2020-03-27 10:51
Krill

Registered: Apr 2002
Posts: 2940
Quoting tlr
Another approach is to just change Y-scroll when absolutely necessary to avoid a bad line. No need to change it every line.
Yes, or open the Y-border but actually clear DEN ($d011 bit 4). Screen remains on, but without any badlines at all! \=D/
2020-03-27 11:24
tlr

Registered: Sep 2003
Posts: 1762
Quote: Quoting tlr
Another approach is to just change Y-scroll when absolutely necessary to avoid a bad line. No need to change it every line.
Yes, or open the Y-border but actually clear DEN ($d011 bit 4). Screen remains on, but without any badlines at all! \=D/


Good point, forgot about that. Though then you are restricted to idle fetch and sprites only for the full screen.
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
A3/AFL
kbs/Pht/Lxt
chesser/Nigaz
instant
Scooby/G★P/Light
Guests online: 106
Top Demos
1 Next Level  (9.7)
2 13:37  (9.7)
3 Coma Light 13  (9.7)
4 Edge of Disgrace  (9.6)
5 Mojo  (9.6)
6 Uncensored  (9.6)
7 Wonderland XIV  (9.6)
8 Comaland 100%  (9.6)
9 No Bounds  (9.6)
10 Unboxed  (9.6)
Top onefile Demos
1 Layers  (9.6)
2 Party Elk 2  (9.6)
3 Cubic Dream  (9.6)
4 Copper Booze  (9.6)
5 Rainbow Connection  (9.5)
6 It's More Fun to Com..  (9.5)
7 Morph  (9.5)
8 Dawnfall V1.1  (9.5)
9 Onscreen 5k  (9.5)
10 Daah, Those Acid Pil..  (9.5)
Top Groups
1 Booze Design  (9.3)
2 Oxyron  (9.3)
3 Nostalgia  (9.3)
4 Censor Design  (9.3)
5 Triad  (9.2)
Top Coders
1 Axis  (9.9)
2 Graham  (9.8)
3 Crossbow  (9.8)
4 Lft  (9.8)
5 HCL  (9.8)

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