Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
 Welcome to our latest new user maak ! (Registered 2024-04-18) You are not logged in - nap
CSDb User Forums


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

Registered: Jul 2010
Posts: 222
Best practice IRQ recovery

Hi,

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:

sei
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.

Trap
 
... 78 posts hidden. Click here to view all posts....
 
2021-06-13 15:21
ChristopherJam

Registered: Aug 2004
Posts: 1370
Quote: good point with irq's reenabling irqs. I'll keep sei cli and ack cia irqs :)

Don't forget to write to $dd0d before the others then SEI for a second time in case an NMI didn't restore the I bit.
2021-06-13 16:34
TWW

Registered: Jul 2009
Posts: 541
Quoting ChristopherJam
haha, writing to the NMI vector without disabling the pertinent CIA first is just as much asking for it.


Yes, you should disable/ack CIA#2 interrupts first before grounding it / fiddling with the vectors. Here is the full code I use to setup a safe raster IRQ without presuming too much:

    sei
    // Disable/ack all CIA interrupts
    ldx #$7f
    stx $dd0d
    lda $dd0d
    stx $dc0d
    lda $dc0d
    // Bank in all available RAM except IO
    lda #$35
    sta $01

    // Ground NMI
    lda #<NMI_Lock
    sta $fffa
    lda #>NMI_Lock
    sta $fffb       // Set NMI Vector to point to RTI
    ldx #$00
    stx $dd0e	// Stop CIA #2 Timer A
    stx $dd04
    stx $dd05       // Set CIA #2 Timer A to 0 cycles
    inx
    stx $dd0d       // Enable CIA #2 Timer A as NMI source
    lda #$81
    sta $dd0e       // Start Timer A and trigger NMI
    bne *+3
NMI_Lock:
        rti

    // Set IRQ Vector
    lda #<IRQ_Vector.getValue()
    sta $fffe
    lda #>IRQ_Vector.getValue()
    sta $ffff

    // Set Raster Interrupt Compare Value
    lda #Raster_Compare_Value.getValue()
    sta $d012
    lda $d011
    .if (Raster_Compare_Value.getValue()<256) {
        and #%01111111
    } else {
        ora #$80
    }
    sta $d011

    // Ack any pending Raster Compare IRQs (normally not neccessary)
    lda #$01
    sta $d019

    // Enable Raster IRQs
//    lda #$01
    sta $d01a

    // Allow IRQ's
    cli
// async code
async:
    jmp async


I consider this as safe as I can make it without making assumptions on what was.
Another important point is that if you are running async. code after the cli (instead of jmp *) you can get straight to that with no hassle and you are sure the VIC IRQ which was setup fires exactly when you told it and not by accident after the cli if some latent CIA IRQ fired (which it may have if you entered from basic).
2021-06-13 17:53
chatGPZ

Registered: Dec 2001
Posts: 11100
you forgot the second SEI
2021-06-13 18:01
Oswald

Registered: Apr 2002
Posts: 5017
2021-06-13 18:20
TWW

Registered: Jul 2009
Posts: 541
Quoting Groepaz
you forgot the second SEI


If a NMI is executed between the SEI and the DD0D disable code, the Processor Status Register (PSR) gets pushed to the stack. When the inevitable RTI is executed the PSR is pulled from stack, the I-flag is restored without the need to set it a second time.
2021-06-13 18:21
Trap

Registered: Jul 2010
Posts: 222
Wow. This sure sparked a discussion :) I read the thread a few times, but I honestly still don't feel I am any bit closer to knowing how I should deal with my problem?

Thank you all for dishing in - truly wonderful and much appreciated though :)
2021-06-13 18:21
chatGPZ

Registered: Dec 2001
Posts: 11100
But what if the NMI handler manipulates the Stack? Are you assuming it doesnt?
2021-06-13 18:35
Trap

Registered: Jul 2010
Posts: 222
I am not using NMI or reading any keyboard presses. Just a normal IRQ running with kernal off ($01=$35).
2021-06-13 18:56
chatGPZ

Registered: Dec 2001
Posts: 11100
To answer your question we'd still need to know what exactly you are trying to do - there is no universal answer :)
2021-06-13 18:57
ChristopherJam

Registered: Aug 2004
Posts: 1370
Quoting Trap
I am not using NMI or reading any keyboard presses. Just a normal IRQ running with kernal off ($01=$35).


Then you can ignore almost all of the last 50 comments, and just
lda #$7f
sta $dc0d
ldx #0
stx $d01a

no SEI/CLI required. (that said, you do still need to ack the interrupt you're responding to if you do this in an ISR instead of in your main)
Previous - 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 - 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
Advanced
Users Online
Hexhog
CA$H/TRiAD
Scooby/G★P/Light
celticdesign/G★P/M..
csio/monarchy c+4
Weasel/Padua/Hitmen/..
Alakran_64
Dymo/G★P
Higgie/Kraze/Onslaught
Guests online: 108
Top Demos
1 Next Level  (9.8)
2 Mojo  (9.7)
3 Coma Light 13  (9.7)
4 Edge of Disgrace  (9.6)
5 Comaland 100%  (9.6)
6 No Bounds  (9.6)
7 Uncensored  (9.6)
8 Wonderland XIV  (9.6)
9 The Ghost  (9.6)
10 Bromance  (9.6)
Top onefile Demos
1 It's More Fun to Com..  (9.8)
2 Party Elk 2  (9.7)
3 Cubic Dream  (9.6)
4 Copper Booze  (9.5)
5 Rainbow Connection  (9.5)
6 Wafer Demo  (9.5)
7 TRSAC, Gabber & Pebe..  (9.5)
8 Onscreen 5k  (9.5)
9 Dawnfall V1.1  (9.5)
10 Quadrants  (9.5)
Top Groups
1 Oxyron  (9.3)
2 Nostalgia  (9.3)
3 Booze Design  (9.3)
4 Censor Design  (9.3)
5 Crest  (9.3)
Top Organizers
1 Burglar  (9.9)
2 Sixx  (9.8)
3 hedning  (9.7)
4 Irata  (9.7)
5 MWS  (9.6)

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