Pokey Interrupts

Moderator: Rockford

Antworten
Benutzeravatar
LarsImNetz
Beiträge: 170
Registriert: 24.08.2021 18:27
Has thanked: 126 times
Been thanked: 88 times
Kontaktdaten:

Pokey Interrupts

Beitrag von LarsImNetz »

Hi,

ich spiele gerade ein wenig mit den Pokey-Interrupts des Atari rum.
Ich habe gedacht, statt die Musikroutinen nur im VBI alle 1/50s aufzurufen, warum nicht die Pokey Interrupts nehmen und z.B. alle 1/100s die Musikroutinen aufrufen.

Grund:
Änderungen in der Musik kämen schneller, das klingt nochmal viel besser. Beispiel, ein schönes Plopp in Turbo-Basic:

Code: Alles auswählen

  FOR I=15 TO 0 STEP -1
    SOUND 0,35,10,I
  NEXT I
Wenn man das versucht mit Änderungen nur alle 1/50s aber ähnlich flott, klingt es furchtbar. Da es nicht 16 Änderungen sind sondern vielleicht 2 oder 3.

Hat das schon mal jemand verwendet/ausprobiert?

Hier mal der Initialisierungscode, um einen Pokey Interrupt (den 2.) zu starten.

Code: Alles auswählen

 lda #<pokey_interrupt_2
 sta VTIMR2
 lda #>pokey_interrupt_2
 sta VTIMR2+1

 lda 16
 ora #2                 ; erlaube pokey timer2
 sta 16

 lda #$10               ; 16 Bit Auflösung für Kanal 1&2
 sta AUDCTL

 lda #<634              ; Auf PAL 63334 / Anzahl Interrupts
 sta AUDF1
 lda #>634
 sta AUDF2

  lda #1                ; Interrupt starten
  sta STIMER

  lda #128+2            ; Pokey Interrupt 2 erlauben
  sta IRQEN
  rts
Der eigentliche Interrupt selbst:
Er zählt einen Counter hoch und macht den Hintergrund schwarz oder grau. Das wandert ein wenig, weil die Interrupts nicht absolut synchron zum Screen kommen. Das OS speichert uns den Akku auf den Stack, bei RTI muss man den Akku per PLA nur wieder herstellen.

Code: Alles auswählen

counter=203

pokey_interrupt_2
  inc counter
  lda counter
  and #1
  beq white

  lda #0             ; schwarzer Hintergrund
  sta COLBK
  sta 712
  
  pla                 ; Pokey Interrupt verlassen, das ist so richtig!
  rti

white
  lda #$06          ; grauer Hintergrund
  sta COLBK
  sta 712

  pla
  rti
Die Interrupts kommen auf PAL alle 1/100s also 2 pro VBI, allerdings kann man jetzt keine Musik mehr spielen, weil die Interrupts an den Pokey Registern hängen. Sobald man AUDF1 und oder AUFD2 ändert, um eine andere Frequenz zu spielen, ändert sich das Laufzeitverhalten der Interrupts.

Weiß jemand mehr?

Benutzeravatar
Kveldulfur
Beiträge: 674
Registriert: 17.08.2021 02:32
Has thanked: 257 times
Been thanked: 183 times
Kontaktdaten:

Re: Pokey Interrupts

Beitrag von Kveldulfur »

Hallo!

Ich kann Dir bei den Pokey-Interrupts leider nicht weiterhelfen.

Aber eine Möglichkeit ist es, wenn Du die Musik nicht im VBI, sondern im DLI mehrfach aufrufst.
Beispielsweise einmal zum Beginn und einmal am Ende des Bildschirmaufbaus.
Theoretisch kann man sicherlich ausrechnen, an welchen Stellen die beiden DLIs ausgeführt werden müssen, um exakt immer den gleichen Zeitabstand zu haben, aber fürs Experimentieren müsste es auch ohne Berechnung gehen.

Grüße
Janko
Meine Projekte findest Du hier...

Erhard
Beiträge: 621
Registriert: 04.11.2021 15:52
Has thanked: 55 times
Been thanked: 131 times
Kontaktdaten:

Pokey Interrupts

Beitrag von Erhard »

Hi,

vermutlich muß man da auch auf die Priorität bei den Unterbrechungsanforderungen achten.

Während des VBI können andere Unterbrechungsanforderungen unterdrückt oder wiederrum unterbrochen werden.

CU, Erhard

Benutzeravatar
pps
Beiträge: 573
Registriert: 18.06.2021 23:05
Has thanked: 126 times
Been thanked: 229 times
Kontaktdaten:

Re: Pokey Interrupts

Beitrag von pps »

Man kann auch außerhalb der Interrupts im eigentlichen Programmloop die Musik abspielen. Dann kann man theoretisch jedes gewollte Abspieltempo haben. Mittels VCOUNT kann man dann sogar gut mit dem Bildschirm synchronisieren. Leider ist man dann natürlich im Programmcode etwas eingeschränkt, da man ja immer Zeit für die Musikwiedergabe abgeben muss. Wenn ich mich recht entsinne wird dies beim RMT Player von Vinscool genutzt (VUPlayer Sources auf github).
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast