Hallo Besucher, der Thread wurde 826 mal aufgerufen und enthält 5 Antworten

letzter Beitrag von gh23 am

Text und Grafik und Text auf einem Screen

  • Hallo Leute! :winke:
    Ich Code Grade an was Rum, wobei ich eure Hilfe brauche!


    Ich hänge mal einfach die zwei Progies an, damit Ihr wisst was ich meine:


    1. ep.prg Dies wird das eigentliche prg und im schwarzen Bereich sollte dann
    2. koa.prg die Grafik von diesem prg angezeigt werden


    Soweit so gut :prof:


    Ich habe schon einiges probiert und auch die Grafik in dem schwarzen Bereich eingeschlatet, aber es will wenn ich die Daten einfach lade nicht klappen! :roll:
    Habe das momentan mit nem Font gelöst (ep.prg) aber es sollte dann doch mal die Grafik (koa.prg) werden


    Ich kann euch auch gerne den Source posten!
    Alle progies sind mit run zu starten

  • hi...


    naja....


    1. ich finde diese art von irq programmierung immer noch gruselig :) (diese abfrage und branches von $d019 und $d012).
    2. wo ist dein problem?


    du schaltest doch schon in den "richtigen" zeilen die border und hintergrundfarbe um.
    wenn du ein split von charset und bitmap graphik haben willst, musst du diese eben auch noch umschalten.
    also noch $d011 und gegebenenfals noch $d018 und $d016 (und $dd00... je nachdem wo die graphiken liegen).

  • yo...
    dazu sollte man natürlich erstmal wissen, in welchem zustand der c64 nach einem reset/einschalten ist, und wie man was, warum verändern will/muss.


    der irq.
    nach einem reset/einschalten wird ja auch ständig ein irq ausgelöst. und zwar vom cia (einem timer). immer nach einer bestimmten zeitspanne (die vom kernal nach einem reset gesetzt wird), wird ein irq ausgelöst, der so dinge wie die tastaturabfrage oder cursorblinken auslöst. das passiert wie schon erwähnt immer nach einer bestimmten verstrichenen zeitspannen, und nicht wie man es für demoeffekte meist braucht, in einer bestimmten rasterzeile.
    das kann man auch ganz gut beobachten, indem man einfach den irq vector ($0314/0315) auf eine eigene routine umbiegt und dort z.b. die borderfarbe erhöht, und anschliessend zu der eigentlichen standard-irqroutine ($ea31) weiterspringt. man sieht, dass die borderfarbe sich immer in einer anderen zeile verändert.


    will man nun einen demoeffekt coden, will man meist, dass der irq in einer ganz bestimmten zeile vom VIC (und nicht vom CIA) ausgelöst wird.
    dazu muss man die zeile in $d012 und $d011 bestimmen (insgesammt gibt es bei PAL C64er 312 zeilen. braucht daher 9 bits. also 8 bits in $d012 und das 9. ist das höchstwertigste in $d011. meist wird das bit in $d011 mit lda$d012; and#$7f; sta $d012 gelöscht. achtung. wenn man das 9. bit setzt, und in $d012 einen wert über #$37 setzt, hat man eine ungültige rasterzeile, die nie erreicht wird -> also auch keine VIC irq ausgelöst wird).
    zusätzlich muss man noch das niedrigste bit in $d01a setzten, damit der VIC den irq auslöst: also z.b. mit lda #$01; sta $d01a)


    Damit uns der CIA Irq nicht mehr in die Quere kommt, schalten wir den einfach ab (mit lda#$01; sta $dc0d). somit brauchen wir zu beginn der irq routine auch nicht mehr abfragen, ob der IRQ auch wirklich vom VIC ausgelöst wurde (denn das tust du im moment mit deinem BMI $08e1; lda $dc0d; cli; jmp $ea31).


    Den IRQ Vector ($0314/0315) biegst du auf deine Routine um, die in der definierten Rasterzeile deinen Code ausführen soll.
    Willst du Raster-Irqs zu verschiedenen Rasterzeilen ausführen, setzt du einfach im 1.IRQ die gewünschte Rasterzeile (in $d012) des 2. IRQ UND die IRQ Vectoren der 2. Routine. Und in der 2. Irq Routine setzt du dann wieder die Zeile und Vector des 1. Irq (kann natürlich auf (fast) beliebig viele Irqs erweitert werden)



    Beispiel: Du willst in Rasterzeile $#50 die Borderfarbe auf Schwarz setzen, und in Zeile $#90 die Farbe wieder auf Grau.


    Der Irq Init sieht etwa so aus:


    sei
    lda#$01
    sta $d01a ; VIC Irq ein
    sta $dc0d ; CIA Irq aus (nicht verwirren lassen, das #$01 den VIC irq einschaltet und den CIA aus.... das ist halt so)
    lda #$50 ; Initial den Rasterirq auf Zeile $50
    sta $d012
    lda #$1b
    sta $d011
    lda #$lowbyteIrq1
    sta $0314
    lda #$highbyteIrq2
    sta $0315
    cli; (ja, vor dem cli kann man noch ein lda $dc0d und inc$d019 machen, damit alle irq flags sauber gelöscht sind. Fällt fürs erste aber nicht auf)
    rts


    Irq1:
    lda #$00
    sta $d020 ; Borderfabe umsetzen
    lda #$90
    sta $d012 ; Zeile für Irq2 setzen
    lda #$lowbyteIrq2
    sta $0314
    lda #$highbyteIrq2
    sta $0315
    inc $d019 ; VIC Irqflag löschen, sonst wird nach verlassen der Irqroutine der nächste Irq sofort wirder aufgerufen, auch wenn die gewünschte Rasterzeile noch garnicht erreicht wurde
    jmp $ea81; Beenden des Irqs OHNE Tastaturabfrage - Das reicht einmal pro Frame und wird am Ende von Irq2 gemacht.



    Irq2:
    lda #$0b
    sta $d020 ; Borderfabe wieder umsetzen
    lda #$50
    sta $d012 ; Zeile wieder für Irq1 setzen
    lda #$lowbyteIrq1
    sta $0314
    lda #$highbyteIrq1
    sta $0315
    inc $d019 ; VIC Irqflag löschen
    jmp $ea31; Beenden des Irqs mit Tastaturabfrage (wenn man das denn braucht)