| |
Mihai
Registered: Feb 2002 Posts: 29 |
Irq
Hy
I am trying to understand some code about intrerupts, it's really simple. IRQ is an intrerupt routine called with the address at ($0314 and $0315). Now in IRQ there are those jumps, JMP $ea31 and Jmp $febc. What do they do and what's the difference between them?
I read something in Programming the C64 but i didn't understood very well.
Thanks,
Mihai |
|
| |
Puterman Account closed
Registered: Jan 2002 Posts: 188 |
I think there's an article about interrupts in the first issue of C=Hacking, which might be helpful.
ea31 is the BASIC interrupt handler code, which scans the keyboard and does some other stuff. If you're not using that stuff, you'll save quite a lot of time by jumping to ea81 or febc instead (all those routines do is reload the saved register values and do RTI). |
| |
trident
Registered: May 2002 Posts: 91 |
Instead of jumping to $ea81, I usually jump to $ea7e instead. The only difference is the "lda $dc0d" instruction at $ea7e, which I believe is used to acknowledge the interrupt when it was caused by a CIA timer. I don't think it really matters in the case of raster interrupts, but I think it is a good habit since it can save a lot of trouble if one would be inclined to convert the raster interrupt into a timer interrupt. |
| |
Perff Administrator
Posts: 1676 |
Perhaps a bit off-topic....
I personally don't use the ROM's interrupt vectors (like $0314) but instead I use the one in $fffa, $fffb (for IRQ) and $fffe, $ffff (for NMI).
You of course then need to code the register-save and recover rutines yourself, but you get access to the 8k of RAM under $e000-$ffff instead of the ?useless? ROM that would be there.
This leads me to a question for all coders.
When you code do you always have the ROM (both basic and kernal or perhaps just the one) enabled or disabled?
Personally I ALWAYS disable it. In that way I get 64k (almost) of RAM and I don't have to worry which zp-addy's I use.
Basically you are in total control of the machine - which I like best. :) |
| |
Puterman Account closed
Registered: Jan 2002 Posts: 188 |
Perff, yes, #$35 to $01, but it seems you're getting a bit rusty, as you say you use $fffe for NMI and $fffa for IRQ. :-)
|
| |
MorGorr Account closed
Registered: May 2002 Posts: 47 |
Quote: Perhaps a bit off-topic....
I personally don't use the ROM's interrupt vectors (like $0314) but instead I use the one in $fffa, $fffb (for IRQ) and $fffe, $ffff (for NMI).
You of course then need to code the register-save and recover rutines yourself, but you get access to the 8k of RAM under $e000-$ffff instead of the ?useless? ROM that would be there.
This leads me to a question for all coders.
When you code do you always have the ROM (both basic and kernal or perhaps just the one) enabled or disabled?
Personally I ALWAYS disable it. In that way I get 64k (almost) of RAM and I don't have to worry which zp-addy's I use.
Basically you are in total control of the machine - which I like best. :)
I switch a lot between ROMs, RAM and IO registers, because I like using them all ;-)
I also "switch" between different 0pages or at least different contents for various addresses. Surely not out of convenience and surely not the best way to go, but because I combine compiled basic with a music player and my own asm stuff. Each of these three parts uses 0page addresses, and in the case of the compiled basic, it is hard to find out which addresses are used for what. Buffering certain parts of the 0page was the only way to solve that... |
| |
Perff Administrator
Posts: 1676 |
Quote: Perff, yes, #$35 to $01, but it seems you're getting a bit rusty, as you say you use $fffe for NMI and $fffa for IRQ. :-)
Oups! You got me there!!!
DOH!!!!!!!
;-P
|
| |
cadaver
Registered: Feb 2002 Posts: 1160 |
It seems for utilities/editors I only switch BASIC-rom off, otherwise both (to get fastest interrupt response). Hmm..thinking of it, Ninjatracker could handle more music if it used the area behind Kernal :)
At one point I also experimented with having everything as RAM in main program ($34 in $01), only using $35 when there's something to be done with IO. On entry/exitpoint of an interrupt, $01 is incremented/decremented, and thus interrupts can work with IO regardless of what the main is doing.. But I always forgot to switch the IO on in the main program as necessary, so I found it best to place graphics under IO area and forget this scheme :)
|
| |
Oswald
Registered: Apr 2002 Posts: 5086 |
noone really answered the questions so I give it a try:
if an irq occurs the cpu will jump to the address stored at
fffe/ffff (lo/hi). IF the kernal rom is switched on at first the cpu will jump at a routine which will check wether the interrupt was caused a brk or not, if not then it will do a jmp ($0314) wich will lead to the addy $ea31.
now it is a nice thing if u use 0314-15 for irq vector to jump to this routine after u finished ur stuff, so you can have your cursor on, type stuff, etc (as this routine is responsible for all of this, and some other stuff too)
so $ea31 does cursor flash/move, keyboard scan, update ti ti$ etc. and it returns also from the interrupt
you can find on the magic addresses $ea7e $ea81 $febc the followings:
$ea7e: lda $dc0d
$ea81: pla
tay
pla
tax
pla
rti
$febc: same as from $ea81
to drive the irqs on your own, you have to turn off the kernal (lda #$35 sta $01) then put the addy of your routine into fffe/ffff, and save all registers end restore them at the start/end of your routine
something like this
pha
txa
pha
tya
pha
...
your code
...
pla
tay
pla
tax
pla
rti
or if you wanna be smart and fast:
sta a+1
stx x+1
sty y+1
a lda #$00
x ldx #$00
y ldy #$00
rti
happy coding.. :)
|
| |
Falcon Account closed
Registered: Sep 2003 Posts: 3 |
Hi folks..
Hrm.. this is not a reply but the topic suits my question...
I am trying to do a little something just 4 the pure fun of it, and my question is soooo simple 4 u codewizzards out there... but it has proven to be a bit of a challenge 4 me... :/
The plan is to do a simple intro, colourwash, flashing, rasterbar n a scroll, to do this im using IRQ's, 1 for the colours(flash, wash, etc), one 4 the rasterbars and one 4 the scroller.
Ive got the custom chars, flash n wash working but as soon as I try to implement one more IRQ things fuck up.
Ive read putermans "int. to demoprg." and that one should use 0314,0315 to "point" to the next IRQ code and from there to the first one, but I cant get it to work prop.
Does any1 have some tips how i should go about or even better, have any asm source code that i could use 4 reference...
I know that theres prob. a better way to code the things i want to.. but this is the way i want to do it.. im a newbee at c64-asm and i want to make things work before i look at efficensy(<-spelling?)
Regards Cyberhawk aka Mandroid |
| |
cadaver
Registered: Feb 2002 Posts: 1160 |
How do things fuck up? Anyway, it shouldn't be more complex than this, in this example I assume 3 interrupts chained together, and that raster interrupt is acknowledged (dec $d019 for example) in the beginning of each interrupt's code
At end of interrupt1:
lda #<irq2
sta $0314
lda #>irq2
sta $0315
lda #IRQ2_POSITION
sta $d012
jmp $ea81
End of interrupt2:
lda #<irq3
sta $0314
lda #>irq3
sta $0315
lda #IRQ3_POSITION
sta $d012
jmp $ea81
End of interrupt3:
lda #<irq1
sta $0314
lda #>irq1
sta $0315
lda #IRQ1_POSITION
sta $d012
jmp $ea81
and IRQ1_POSITION < IRQ2_POSITION < IRQ3_POSITION (from top to bottom)
|