126

cudne kwiatki ;)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

127 Ostatnio edytowany przez w1k (2026-09-30 06:25:22)

;--------------------------------------------------------------
; snd_irq -- Timer-1 handler: ONE 4-bit sample for every live voice, then the
;   timer is switched off if that emptied the mixer. The OS enters it with CLD +
;   JMP (VIMIRQ) and does NOT save anything, hence the pha/pla.
;   2026-09-29 (drac030): X AND Y are pushed at full width -- the body's
;   sep #$30 clears both high bytes of the code it interrupted.
;--------------------------------------------------------------
.proc snd_irq
        rep #$10                     ; X/Y 16-bit first, pushed at that width
        phx
        phy
        sep #$30                     ; 8-bit A/X/Y for the body
        pha
    .ifdef ANTONIA2
        phb                          ; DBR = $01 inside the card's divide (math.asm
        phk                          ;   udiv24): bank 0 for the absolute operands,
        plb                          ;   or POKEY is never acked (K = 0 here)
    .endif
        lda IRQST_R
        and #$01
        beq ?mine                    ; bit0 = 0 -> Timer-1, ours
        lda PORTB                    ; foreign IRQ. snd_old_irq points INTO THE
        lsr                          ;   OS ROM, and the frame loop runs with it
        bcs ?chain                   ;   banked OUT (rom_out + urom_init), so the
        lda POKMSK_R                 ;   old chain jumped into whatever RAM lies
        sta IRQEN_R                  ;   under $E000-$FFFF and, never acking, came
        jmp ?out                     ;   straight back -- the freeze the 2026-08-07
                                     ;   trace caught parked here.
?chain
    .ifdef ANTONIA2
        plb
    .endif
        pla                          ; A (one byte), then Y and X at the width
        rep #$10                     ;   they were pushed; the OS chain gets
        ply                          ;   8-bit X/Y
        plx
        sep #$10
        jmp (snd_old_irq)
?mine
        stz IRQEN_R                  ; ack Timer-1: drop bit 0, then restore it.
        lda POKMSK_R                 ;   POKMSK is $01 here -- this IS its timer,
        sta IRQEN_R                  ;   and snd_init/snd_disarm are the only
                                     ;   writers (it holds $00 or $01, never
                                     ;   more) -- so `and #$FE` of it is 0

        ldx #SND_VTOP
?voice  lda sv_act,x                 ; 0 = idle, 1 = playing
        beq ?next
        ; --- WHICH NIBBLE: bit 7 of the voice's fraction. sv_frc counts the ...
        lda sv_cur,x
        bit sv_frc,x                 ; N = bit 7 (A untouched): the LOW nibble
        bmi ?nib                     ;   is current
        lsr                          ; (NOT `?out` -- that is the handler's own
        lsr                          ;  exit label further down, and reusing it
        lsr                          ;  silently pointed the empty-mixer sweep's
        lsr                          ;  `beq ?out` back INTO this loop)
?nib    and #$0F
        ora #$10
        bit sv_side,x                ; snd_out INLINE on the sample path
        bmi ?so_r                    ;   (2026-09-15: the jsr/rts went, ~3,960
                                      ;   times a second while anything plays).
        sta.l AUDC1_R,x              ; 2026-09-22 (rapidus-bus-timing): long,x has no
        bvs ?so_d                    ;   dummy read of POKEY before the store -- abs,x
?so_r   sta.l AUDC1_R+$10,x          ;   paid a second chip cycle for it
?so_d                                ; output ASAP -- less jitter. STEREO
                                     ;   (2026-08-31): the voice's side routes ...
        lda sv_frc,x
        clc
        adc sv_stp,x
        sta sv_frc,x
        bcc ?next                    ; still inside this byte
        inc sv_rl,x                  ; count UP toward $0000 = sample finished
        bne ?adv
        inc sv_rh,x
        bne ?adv
        inc sv_fin                   ; a voice just went quiet -- the ONLY way
                                     ;   the mixer can empty, so the sweep below
                                     ;   is owed exactly here (see ?any)
        lda #0                       ; done: this voice only. The timer belongs
        sta sv_act,x                 ;   to ALL of them, so only the sweep after
        jsr snd_out                  ;   the loop may switch it off. snd_out's
        beq ?next                    ; (always: BIT with A=0 leaves Z=1, and
                                     ;   both stores keep it -- the contract
                                     ;   this beq was already leaning on)
?adv    inc sv_al,x                  ; advance this voice's read address
        bne ?fetch
        inc sv_ah,x                  ;   (a sound never crosses a bank end, so
                                     ;    sv_ab is never touched -- wadsound.py)
        ; --- fetch the next byte.
?fetch  jsr snd_fetch
?next   dex
        dex
        bpl ?voice

        ; --- did that empty the mixer?
        lda sv_fin
        beq ?out
        stz sv_fin
        ldx #SND_VTOP
        lda #0
?any    ora sv_act,x
        dex
        dex
        bpl ?any
        cmp #0
        bne ?out
                                      ; 2026-09-22 idiom: snd_disarm inlined (-12; its
        stz POKMSK_R                 ;   live body is these two stz -- see the proc)
        stz IRQEN_R
?out
    .ifdef ANTONIA2
        plb
    .endif
        pla                          ; A ...
        rep #$10                     ; ... then Y and X at the FULL width the
        ply                          ;     entry pushed them
        plx
        rti                          ; (RTI's pulled P puts the real widths back)
.endp

https://turiecfoto.sk/atari/doom-test/d ... -2026c.zip

128 Ostatnio edytowany przez drac030 (2026-09-30 12:39:04)

DBR = $01 inside the card's divide (math.asm
;   udiv24): bank 0 for the absolute operands,
;   or POKEY is never acked (K = 0 here)

Aha, hehe, no tak, chodzi o zmienne tymczasowe

?q_hi    .word 0
?q_lo    .word 0

z modułu udiv24_v2.asm. Ale one chyba pochodzą z czasów, kiedy ten kod był w pierwszym segmencie 64k (banku 0), trzeba te dwie zmienne tam przenieść teraz. To pozwoli na pozbycie się rozkazów phb, phk, plb z miejsca wywołania udiv24 i z procedury obsługi IRQ.

KMK
? HEX$(6670358)

129 Ostatnio edytowany przez w1k (2026-09-30 13:32:41)

szybka poprawka, naprawiono również efekt rakiety, który nie wyświetlał się prawidłowo na filarach.

https://turiecfoto.sk/atari/doom-test/d ... 9-2026.zip

130 Ostatnio edytowany przez drac030 (2026-09-30 14:29:04)

FPS:

a) wersja regularna: 7.69-8.00
b) wersja na Antonię II: 8.33-8.69

Ta druga mogłaby w ramach początkowych testów sprzętu sprawdzać też, czy istnieje ten sprzętowy kalkulator do mnożenia i dzielenia, z którego zamierza korzystać.

Edit: są kwiatki na ścianach


https://www.atari.org.pl/forum/misc.php?action=pun_attachment&item=13858

Post's attachments

doom_kwiatki_b.jpg 85.78 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.
KMK
? HEX$(6670358)

131

https://turiecfoto.sk/atari/doom-test/d ... -2026a.zip

ok, naprawiono... "lost-soul" nie działało, również naprawiono

132 Ostatnio edytowany przez drac030 (2026-09-30 20:54:56)

Ta wersja, póki co, na oko działa bez zarzutu. Dobra robota!

KMK
? HEX$(6670358)

133 Ostatnio edytowany przez Pin (2026-09-30 23:26:29)

zrzucam wersję dla Rapidusa teraz, ciekawe ;)

...raz tylko przywiesiłem się w drzwiach - otworzyłem drzwi i tam zostałem celowo. Po tym jak się zamknęły to mogłem się obracać, ale nie mogłem nigdzie iść. Dopiero ponowne otwarcie drzwi uwolniło "gracza"

Kontakt: pin@usdk.pl

134 Ostatnio edytowany przez drac030 (2026-09-30 23:38:37)

Pin napisał/a:

raz tylko przywiesiłem się w drzwiach

Mnie się udało dwa razy wpaść do wnętrza lewej ściany schodów w pierwszej komnacie ("lewej", patrząc w stronę pięterka). Też tylko się można wtedy obracać, ale w przeciwieństwie do drzwi nie da się tam niczego otworzyć, zatem taka wpadka to jest koniec danej przygody.

KMK
? HEX$(6670358)

135

aaaa, spróbuję tam wpaść.. ;)

Kontakt: pin@usdk.pl

136

zacinanie się schodów było problemem z powodu nieprawidłowego obliczenia środka podłogi.
naprawiłem 5 rzeczy przy drzwiach, teraz drzwi zostawiają plamę krwi po martwym wrogu, można je otwierać/zamykać nawet w ruchu i nie można już w nich utknąć itd itd. :D

https://turiecfoto.sk/atari/doom-test/d ... 0-2026.zip

137 Ostatnio edytowany przez drac030 (2026-10-01 10:52:39)

Zauważyłem jeszcze jeden mały błąd: czasami wzięcie karafki denaturatu ("health bonus"), pierwszej lub drugiej na poziomie E1M1 tak jakby nie generuje sygnału dźwiękowego. To wystąpiło mi raz w wersji dzisiejszej i raz w którejś poprzedniej.

Dzisiejsza wersja: byłem w stanie wziąć znalezioną dubeltówkę (shotgun), mimo że już jedną miałem. W poprzednich wersjach drugiej broni tego samego typu nie chciał brać.

Zastanawia mnie też, jak ten program oblicza czasy przejścia etapów, które wyświetla na końcu, skoro jedyny licznik czasu, jaki tu widzę, to jeden bajt RTCLOK3. To się przepełnia po 5 sekundach, a zważywszy że renderowanie klatki zajmuje od kilku do kilkunastu ramek, nie widzę dużych szans, żeby pomiar czasu był dokładny.

I faktycznie, zwiedzałem sobie poziom E1M2 (ten z wielkim labiryntem), byłem wszędzie, a na końcu wyświetliło, że czas przejścia był 2 minuty z groszami....

KMK
? HEX$(6670358)

138 Ostatnio edytowany przez w1k (2026-10-01 10:59:44)

"Zauważyłem jeszcze jeden mały błąd: czasami wzięcie karafki denaturatu ("health bonus"), pierwszej lub drugiej na poziomie E1M1 tak jakby nie generuje sygnału dźwiękowego. To wystąpiło mi raz w wersji dzisiejszej i raz w którejś poprzedniej.

Dzisiejsza wersja: byłem w stanie wziąć znalezioną dubeltówkę (shotgun), mimo że już jedną miałem. W poprzednich wersjach drugiej broni tego samego typu nie chciał brać."


to na antonii ii?

139 Ostatnio edytowany przez drac030 (2026-10-01 11:54:21)

Obie rzeczy na Rapidusie. Dubeltówka jest powtarzalna, pierwszą biorę na E1M1, drugą na E1M2.

Brak dźwięku poprzednio wystąpił też na Antonii.

EDIT ad dubeltówka: doczytałem, że tak ma być, tzn. druga i każda kolejna broń tego samego typu powinna być potraktowana jako paczka amunicji. Więc, o ile tak jest, to jest poprawka w stosunku do tego, co było poprzednio.

KMK
? HEX$(6670358)

140

błędy i błędy.. :D szybka poprawka

https://turiecfoto.sk/atari/doom-test/d ... -2026a.zip

141

i tak:)

PunBB bbcode test

142

BTW, czy da się załadować ATR ze spartan dosa? mam side3

143 Ostatnio edytowany przez Pin (2026-10-01 18:34:25)

wprost spod Sparta DOS X nie.

Jedyna opcja to w przypadku IDE Plus - uruchomienie poprzez IPLD.COM, choć ten loader przekazuje po prostu plik do uruchomienia poprzez BIOS IDE Plus.

... no i pod IDE Plus można też takiego ATR podmontować jako urządzenie Dx:

EDIT:

ATR można odpalić ze SIDE3, ale potrzebujesz do tego U1MB i tam masz coś, co nazywa się "PBI BIOS". Jak to poprawnie skonfigurujesz, to możesz z loadera SIDE odpalać pliki ATR - jeśli oczywiscie odczyt sektora odbywa się przez procedury OS. Gierki, które portujesz będą się ładować, bo tak właśnie czytają / zapisują dane

Kontakt: pin@usdk.pl

144

już jest :) DOOM A8 Pico Cart

https://forums.atariage.com/topic/39324 ... pico-cart/

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

145

@w1k: w sumie na Antonii II szybkość ładowania plików spod SpartaDOS X sięga 400 KB/s. Natomiast np. boot ATR-a na IDE+ to tylko ok. 30 KB/s. Gdyby Doom umiał się ładować pod DOS-em, to i na IDE+ byłoby pewnie szybciej, i na SIDE3 byłoby łatwiej.

Oczywiście, niczego nie sugeruję :)

KMK
? HEX$(6670358)

146

Szkoda, chociaż nagrywanie przez SIO2SD jest teraz całkiem szybkie, wgrywanie z SDX byłoby świetne. Mam dwa Atari 1-u1mb, stereo, VBXE... 2-antoniaII, VBXE). Ale i tak super... PICO Doom jest ciekawy, prawdopodobnie wykorzystuje zalety sprzętu PICO.

147 Ostatnio edytowany przez drac030 (2026-10-01 22:51:27)

Jeszcze o udiv24_v2.asm, zmienne zostały przeniesione:

udiv24_v2.asm napisał/a:

?q_hi    = UDQ_VARS
?q_lo    = UDQ_VARS+2

pod adres $0EF9:

memory_map.inc napisał/a:

UDQ_VARS    = $0EF9

Ale lepiej by było je przenieść na stronę zerową, ponieważ obie są używane w pętli, pozwoliłoby to urwać z najgorszego przypadku tego dzielenia jeszcze do kilkunastu cykli.

Na stronie zerowej cały blok od $80 do $FF jest zajęty, ale podczas rozgrywki jako zmiennych tymczasowych spokojnie można użyć 32 bajtów od $20 do $3F (ZIOCB i zmienne wewnętrzne SIO), a także 16 bajtów od $70 do $7F (głównie zmienne sterownika S: używane przez DRAWTO oraz wektor definicji klawiatury pod $79-7A, którego chyba Doom nie potrzebuje specjalnie).

KMK
? HEX$(6670358)

148 Ostatnio edytowany przez Jacques (2026-10-02 06:29:18)

w1k napisał/a:

PICO Doom jest ciekawy, prawdopodobnie wykorzystuje zalety sprzętu PICO.

Rozwiązanie analogiczne do Dooma na SideCarta do ST, Atari robi tylko za przystawkę/wyświetlacz, jak REU z C64 ;-)
To jednak Doom działający i liczony na CPU siedzącym w Atari i zintegrowanym z architekturą komputera o wiele bardziej mnie kręci niż Doom na przystawce ;-)

149

https://turiecfoto.sk/atari/doom-test/d ... 0-2026.zip


ok, poprawiono, jeszcze kilka oszczędności cykli, fps 10,00-10,52

150 Ostatnio edytowany przez tebe (2026-10-02 10:09:28)

https://www.youtube.com/watch?v=2NEOh1MXvog

to co w grach na C64 jest najlepsze, to ekran tytułowy ;)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C