| |
oleoleo2 Account closed
Registered: Oct 2008 Posts: 21 |
Simple interrupt question.
HI Guys.
I am new to programming in assembler/machinecode on the c64. I have a simple question about the registers $DC0D and $DD0D. I can see in a lot of small programming-examples that they're set to the value $#7F (= 01111111), but none with deep explanations. I found this:
DC0D
CIA Interrupt Control Register (Read IRQs/Write Mask)
7 IRQ Flag (1 = IRQ Occurred) / Set-Clear Flag
4 FLAG1 IRQ (Cassette Read / Serial Bus SRQ Input)
3 Serial Port Interrupt
2 Time-of-Day Clock Alarm Interrupt
1 Timer B Interrupt
0 Timer A Interrupt
'Masking' would say that you define what the computer should look at what to not to look at right? The example where I have seen $DC0D is set to $#7F is where the raster-interrupt routine is used. Does the = 1 mean that bit 0-4 is not used and if that is so, then why is the bits 'inverted'? I guess the bit 0-4 is what we not wan't when using raster-interrupt?
|
|
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
$7f is bit7=0, all other bits=1 ... so the "set-clear flag" is 0, meaning "clear". all other bits are 1, so storing $7f to dc0d/dd0d clears all bits in the irq mask, meaning all irqs from that cia are disabled (and thats what you usually want when doing a raster irq) |
| |
oleoleo2 Account closed
Registered: Oct 2008 Posts: 21 |
Thanks for the reply!
Yes bit 7 makes sense, but what I don't understand is: isn't setting all the other bits to 1 mean "interrupt ocurred"? Of cause I can se, that it means that they can't happen again before they're cleared, is that what the purpose is? else why not set all the bits to 0? |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
"storing $7f to dc0d/dd0d clears all bits in the irq mask" |
| |
Graham Account closed
Registered: Dec 2002 Posts: 990 |
Quote:Yes bit 7 makes sense, but what I don't understand is: isn't setting all the other bits to 1 mean "interrupt ocurred"?
No. Be aware that if you read $DC0D you access a different register than when you write $DC0D.
|
| |
oleoleo2 Account closed
Registered: Oct 2008 Posts: 21 |
Graham: That cleared it up a little bit, but I still haven't got an answer to what it actually means to set bit 0-4 to 1, why doesn't $00 clear all irq's too?
Does it mean: "clear the flags on the ones that is set to 1"? because then the bit 0-4 = '1' makes perfectly sense.. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
bit 7 defines what value to write into the rest of the bits. if any of the rest of the bits is set to '1' then value of bit 7 will be written to it.
think of dc0d as an interface. the cia chip will not use directly the value written in here. neither you access the same inner register upon read/write.
$7f -> dc0d will clear all bits.
|
| |
oleoleo2 Account closed
Registered: Oct 2008 Posts: 21 |
Thanks Oswald!
It makes sense now.. |
| |
Graham Account closed
Registered: Dec 2002 Posts: 990 |
If the IRQ mask was designed without set/clear bit, you would have to do something like this to set/clear an IRQ:
LDA $DC0D
ORA #??
STA $DC0D
or
LDA $DC0D
AND #??
STA $DC0D
This has two disadvantages: You need to read the IRQ mask (which is not directly possible on the CIA because reading accesses the flags not the mask) and the setting/clearing is no atomic operation so it's not IRQ save.
|
| |
daison
Registered: May 2005 Posts: 90 |
Nice topic, I was wondering about this stuff myself lately. |
| |
Testa Account closed
Registered: Oct 2004 Posts: 197 |
yeah me too... very interesting.. |
... 4 posts hidden. Click here to view all posts.... |
Previous - 1 | 2 - Next |