beispiel für ein rasterinterupt in cc65

Es gibt 26 Antworten in diesem Thema, welches 4.370 mal aufgerufen wurde. Der letzte Beitrag (28. Dezember 2008 um 20:10) ist von ogd.

  • uh, vorsicht. die interrupt routine in C zu schreiben ist keine gute idee... damit bringst du zb den software stack durcheinander und es knallt recht schnell :)

  • uh, vorsicht. die interrupt routine in C zu schreiben ist keine gute idee... damit bringst du zb den software stack durcheinander und es knallt recht schnell :)


    wie meinst du das genau? in der interrupt-routine wird ja nix "gestackt" laut assembler-listing:

  • ja, du hast natürlich recht, in diesem fall geht es ... man sollte aber genau wissen was man tut. wenn jetzt jemand auf die idee kommt zb eine c-funktion aus dem interrupt handler heraus aufzurufen dann sieht der fall schon ganz anders aus =)

  • der der schonmal sowas auf andren platformen gemacht hat (wo das durchaus nicht unüblich ist), so ein beispiel sieht und dann davon ausgeht das das geht :)

  • eigentlich auf fast allen :) auch mit cc65 geht das prinzipiell, wenn man den interupthandler entsprechend aufbohrt (die von der runtime benutzten zeropage adressen retten und den pointer auf den softwarestack versetzen) - macht aber nicht viel sinn weil das dann so langsam wird das sich das mit dem interrupt schon garnicht mehr lohnt :) ich glaube der BRK handler vom "eingauten" debugger bzw monitor macht das.

  • Bitte melde dich an, um diesen Link zu sehen. CINV (*(uint16_t *) 0x0314)
    Bitte melde dich an, um diesen Link zu sehen. MEM (*(uint8_t *) 0x3fff)
    void newirq(void);

    unit8_t und uint16_t wird bei mir nicht erkannt, muss unsigned char und unsigned int einsetzen.
    Dieses wird auch nicht compiliert : void newirq(void);

    Was für ein ersatz gibt es dafür?


    mfg

  • unit8_t und uint16_t wird bei mir nicht erkannt, muss unsigned char und unsigned int einsetzen.
    Dieses wird auch nicht compiliert : void newirq(void);


    ich habe es mit cc65 v2.12.0 erstellt. es erscheint zwar eine warnung, aber es klappt ...

    welche version von cc65 benutzt du denn?

    hier noch mal der source code:

  • Ich benutze V 2.12.9 vom November 2008.

    CINV = newirq wird bei mir nicht erkannt.
    Fehlermeldung: Incompatible types

    Bei dem anderen Werten hatte ich "stdint.h" nicht eingebunden.


    mfg

    2 Mal editiert, zuletzt von schnucke (25. Dezember 2008 um 18:02)

  • Ich benutze V 2.12.9 vom November 2008.

    CINV = newirq wird bei mir nicht erkannt.
    Fehlermeldung: Incompatible types


    schöne bescherung. mit der snapshot-version gehts tatsächlich nicht. wenn du aber

    Code
    CINV = newirq;


    durch

    Code
    CINV = (uint8_t *) newirq;


    ersetzt, klappts es ...

    weiss denn einer, wie ich die warnung "Converting pointer to integer without a cast" wegkriege?

  • Zitat

    weiss denn einer, wie ich die warnung "Converting pointer to integer without a cast" wegkriege?

    das sagt dir die warning doch schon ziemlich exakt - du musst explizit einen typecast machen... also zb

    char *p;

    p=0xc000; // hier gibts besagte warnung
    p=(char*)0xc000; // und hier nicht


  • das sagt dir die warning doch schon ziemlich exakt - du musst explizit einen typecast machen...


    danke, hatte falsch "gecastet". so verschwindet auch die warnung:

    Code
    CINV = (uint8_t) newirq;
  • wenn du jetzt noch uint16_t draus machst funktioniert es auch =D

  • wenn du jetzt noch uint16_t draus machst funktioniert es auch =D


    grrrr, heute ist irgendwie der wurm drin. aber cc65 hatte es trotzdem geschluckt:

    Code
    ; CINV = (uint8_t) newirq;
    ;
    	lda     #<(_newirq)
    	sta     $0314
    	lda     #>(_newirq)
    	sta     $0314+1
  • das ist ... interessant. es sollte aber eigentlich nicht funktionieren :) könnte ein compiler bug sein

    edit: grad mal kurz gecheckt, 2.12.9 macht aus

    richtigerweise folgendes:

    Code
    ldx     #$12
            lda     #$34
            sta     $0314
            stx     $0314+1
            ldx     #$00
            sta     $0314
            stx     $0314+1
            rts

    Einmal editiert, zuletzt von sauhund (25. Dezember 2008 um 22:46)

  • Yep, ich bin auch der Meinung, dass dort laut Quelltext eine 0 nach 0315 geschrieben werden sollte.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • habe probehalber mal ohne optimierung übersetzt. ähnlicher effekt

    Code
    ;
    ; CINV = (uint8_t) newirq;
    ;
    	lda     #<(_newirq)
    	ldx     #>(_newirq)
    	sta     $0314
    	stx     $0314+1


    hier nochmal der ganz quellcode: