Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in 
CSDb User Forums

Forums > C64 Coding > Best practice IRQ recovery
2021-06-10 20:30

Registered: Jul 2010
Posts: 208
Best practice IRQ recovery


Here's a little newbie question. Sorry, I'm still learning this shit and it's really complicated :(

I have kernel off ($01=$35) and I am running IRQ's using the normal $fffe/$ffff vectors.
I want to exit from this and call a prepacked piece of code (in this case something packed with TinyCrunch).

I tried restoring the IRQ vectors and jump to the packer. However, it just hangs. I tried some other things but all gave the same result. The only thing that worked was when I did this:

lda #$36
sta $01
jsr $ff81
jmp unpacker

The problem of course is that it resets the VIC which isn't really great for my situation.

So, my question:

What is the correct/proper way to exit from a part and go to the next? preferably not using kernal routines :|

Thank you.

... 78 posts hidden. Click here to view all posts....
2021-06-10 21:56

Registered: Dec 2001
Posts: 9913
the first thing that comes to mind is... don't use SEI. disable the irq sources instead. then set the pointers to their defaults.
2021-06-10 21:58

Registered: Apr 2002
Posts: 1916
Without further information, my bet is on pending interrupts that wreak havoc as soon as the I flag is cleared. =)

Then wrong vectors/memory configuration usually cause crashes, or with the ROM interrupt handler restored, an infinite IRQ-handling loop (as the ROM interrupt handler only acknowledges CIA1 interrupts, but not VIC interrupts).

Bottom line being that properly disabling any interrupt sources (not just executing SEI) is good practice for cleanly exiting a demo part (in a classical spacemo, that is).

Edit: Oh yeah, what Groepaz said. :D
2021-06-10 22:03

Registered: Jul 2010
Posts: 208
Well, I'm just learning stuff right now :)

ok, I will re-visit setting the IRQ vectors back. What would be the perfect sequence for this?

Should I just modify the running IRQ code to go to the default IRQ handler and then wait a few frames for it to catch it?
2021-06-10 22:12

Registered: Apr 2002
Posts: 1916
It's common practice to check for space during an interrupt handler that's executed once a video frame. The I flag is usually still set (because you're in an interrupt) and the interrupt itself was triggered by VIC.

When detecting the keypress, just write 0 to $d01a to disable any VIC interrupts, then write $ff to $d019 to acknowledge any pending VIC interrupts. Resetting any interrupt vectors should not be required. Directly exit to whatever code to unpack and run the next part.
2021-06-10 22:21

Registered: Jul 2010
Posts: 208

set IRQ vector to default handler
wait a frame or two
go to unpacker

Is that what you meant?
2021-06-10 22:32

Registered: Apr 2002
Posts: 1916
Resetting IRQ vectors or waiting shouldn't be required, but should be no harm. It's just unnecessary. :)
2021-06-10 22:39

Registered: Apr 2002
Posts: 4723
my guess is that depacker overwrites your irq code, and on the next irq request cpu tries to jump into that. simply set irq vector to a new piece of irq handler which surely is undisturbed.
2021-06-10 22:48

Registered: Nov 2011
Posts: 417
I guess something overwrite $0314/5 before setting $01 to $36.
Force it back to $EA31 (or $EA81) (and may be better to restore other vectors too) insted of call $FF81.
Clear VIC IRQs enable flags too.
2021-06-10 22:50

Registered: Jul 2009
Posts: 499
In your IRQ setup, disable CIA Interrupts and ack any pending before setting up your VIC IRQ and IRQ pointers.

Assuming no NMI's, the only thing which should be able to trigger the IRQ handler is the VIC.

If your keyboard detection routine is inside an IRQ, the I-Flag should remain set until you ack it. This means that as long as you don't ack it and the unpacker doesn't ack/cli no IRQ should trigger before your next part start (where you presumably SEI and setup next round of IRQ interrupts).
2021-06-11 11:34

Registered: Aug 2004
Posts: 1164
If you disable CIA and VIC interrupts *without* a preceding SEI you don't even need to acknowledge any pending ones - the existing handler will deal with that.

tinycrunch's self extracting mode only wraps the decrunch in SEI/CLI because too many people were having issues with nucrunch's default of just turning off CIA while trying to crunch things that needed the kernal interrupt to still be in place when they started up :-/
Previous - 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 - Next
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
Users Online
Fred/Channel 4
Guests online: 254
Top Demos
1 Edge of Disgrace  (9.6)
2 Coma Light 13  (9.6)
3 Uncensored  (9.6)
4 Comaland 100%  (9.6)
5 Lunatico  (9.6)
6 Unboxed  (9.6)
7 Memento Mori  (9.5)
8 Christmas Megademo  (9.5)
9 Wonderland XII  (9.5)
10 The Shores of Reflec..  (9.5)
Top onefile Demos
1 Copper Booze  (9.8)
2 Daah, Those Acid Pil..  (9.5)
3 Lovecats  (9.5)
4 To Norah  (9.5)
5 Dawnfall V1.1  (9.5)
6 Elite Code Mechanics  (9.4)
7 Square Booze  (9.4)
8 Amber Cow - The Real..  (9.4)
9 Quadrants  (9.4)
10 Coma Job 2/3  (9.4)
Top Groups
1 Booze Design  (9.4)
2 Oxyron  (9.4)
3 Censor Design  (9.4)
4 PriorArt  (9.3)
5 Crest  (9.3)
Top Logo Graphicians
1 Sander  (10)
2 Mermaid  (9.4)
3 Pal  (9.4)
4 Shine  (9.1)
5 Jailbird  (9.0)

Home - Disclaimer
Copyright © No Name 2001-2021
Page generated in: 0.045 sec.