401

@Krótki: Tak właśnie robiłem, prócz tego debug krok po kroku. Kilka razy, bo nie dowierzałem swoim oczom. Ale muszę to jeszcze raz zweryfikować, bo to był długi wieczór(tm) a pacz zrobiłem w późnych godzinach nocnych.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

402 Ostatnio edytowany przez mono (2019-04-25 23:47:49)

@Krótki: Robię tak:
Ustawiam breakpointa w 1416:

    1416: A9 C0             LDA #$C0
    1418: 8D 0E D4          STA NMIEN
    141B: 20 7D 15          JSR $157D
    141E: A9 04             LDA #$04
    1420: 85 D3             STA $D3
    1422: A9 22             LDA #$22
    1424: 8D 2F 02          STA SDMCTL
    1427: A9 96             LDA #$96
    1429: 85 D5             STA $D5
    142B: 20 7D 15          JSR $157D

Przed wykonaniem tego jesteśmy zawsze w linii 287 (już po wykonaniu VBLK) i mamy:

Altirra> .antic
DMACTL = 00  : none 2-line
CHACTL = 02  : invert
DLIST  = 401b
HSCROL = 00
VSCROL = 00
PMBASE = 00
CHBASE = e0
NMIEN  = 40  : vbi
NMIST  = 1f  :
PENH/V = 00 ff

w SDMCTL i DLPTRS mamy:

022F: 00 57 11

a w 401b czyli w miejscu gdzie była dlista dla winietki podczas ładowania (Loading: Rockman, (c) Mirage itd.) mamy:

401B: 00 E8 00 DB 00 CF 00 C3 00 B8 00 AC 00 A2 00 9A
402B: 00 90 00 88 00 7F 00 78 00 70 00 6A 00 64 00 5E
403B: 00 57 00 52 00 32 00 0A 00 80 A0 20 40 00 01 35

W 1157 czyli tam gdzie ma być nowa dlista dla ekranu Rockmana wg cieni (ale w DLPTR jeszcze jej nie ma) jest:

1157: 70 70 80 10 42 EC 34 02 82 02 02 44 E6 35 04 04
1167: 04 04 04 04 04 04 04 80 50 11 82 11 80 42 A5 1F 
1177: 60 52 51 21 10 52 51 21 41 57 11

Więc teraz krok po kroku wykonuję kod:

(30210:287,106) A=18 X=09 Y=18 S=F5 P=31 (     C)  1416: A9 C0             LDA #$C0
(30210:287,108) A=C0 X=09 Y=18 S=F5 P=B1 (N    C)  1418: 8D 0E D4          STA NMIEN    [$D40E]
(30210:287,112) A=C0 X=09 Y=18 S=F5 P=B1 (N    C)  141B: 20 7D 15          JSR $157D    [$157D] = $A5
(30210:288,  4) A=C0 X=09 Y=18 S=F3 P=B1 (N    C)  157D: A5 14     L157D   LDA RTCLOK+2 [$14] = $D7
(30210:288,  7) A=D7 X=09 Y=18 S=F3 P=B1 (N    C)  157F: C5 14     L157F   CMP RTCLOK+2 [$14] = $D7
(30210:288, 10) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  1581: F0 FC             BEQ $157F
(30210:288, 13) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  157F: C5 14     L157F   CMP RTCLOK+2 [$14] = $D7
(30210:288, 16) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  1581: F0 FC             BEQ $157F
...

aż do rozpoczęcia nowego ekranu:

(30211:  8,  1) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  157F: C5 14     L157F   CMP RTCLOK+2 [$14] = $D7
Altirra> .antic
DMACTL = 00  : none 2-line
CHACTL = 02  : invert
DLIST  = 401b
HSCROL = 00
VSCROL = 00
PMBASE = 00
CHBASE = e0
NMIEN  = c0  : dli vbi
NMIST  = 1f  :
PENH/V = 00 ff

i lecimy dalej... aż do:

(30211: 22,109) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  1581: F0 FC             BEQ $157F
(30211: 22,112) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  157F: C5 14     L157F   CMP RTCLOK+2 [$14] = $D7
(30211: 23,  1) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  1581: F0 FC             BEQ $157F
(30211: 23,  4) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  157F: C5 14     L157F   CMP RTCLOK+2 [$14] = $D7
(30211: 23,  7) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  1581: F0 FC             BEQ $157F
(30211: 23, 10) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  157F: C5 14     L157F   CMP RTCLOK+2 [$14] = $D7
(30211: 23, 13) A=D7 X=09 Y=18 S=F3 P=33 (    ZC)  1581: F0 FC             BEQ $157F
(30211: 23, 20) A=D7 X=09 Y=18 S=F0 P=37 (   IZC)  C018: 2C 0F D4  LC018   BIT NMIST    [$D40F] = $9F
(30211: 23, 24) A=D7 X=09 Y=18 S=F0 P=B5 (N  I C)  C01B: 10 03             BPL $C020
(30211: 23, 27) A=D7 X=09 Y=18 S=F0 P=B5 (N  I C)  C01D: 6C 00 02          JMP (VDSLST) [$180B] = $85
(30211: 23, 34) A=D7 X=09 Y=18 S=F0 P=B5 (N  I C)  180B: 85 D0             STA $D0      [$D0]
(30211: 23, 38) A=D7 X=09 Y=18 S=F0 P=B5 (N  I C)  180D: 86 D1             STX $D1      [$D1]
(30211: 23, 42) A=D7 X=09 Y=18 S=F0 P=B5 (N  I C)  180F: 84 D2             STY $D2      [$D2]
(30211: 23, 46) A=D7 X=09 Y=18 S=F0 P=B5 (N  I C)  1811: A9 23             LDA #$23
(30211: 23, 48) A=23 X=09 Y=18 S=F0 P=35 (   I C)  1813: 8D 00 D4          STA DMACTL   [$D400]

No i jakim cudem wskakuje tu DLI? Dopiero ono ustawia DMACTL na $23.

Stan ANTIC-a:

DMACTL = 23  : wide 2-line dlist
CHACTL = 02  : invert
DLIST  = 401b
HSCROL = 00
VSCROL = 00
PMBASE = 00
CHBASE = e0
NMIEN  = c0  : dli vbi
NMIST  = 9f  : dli
PENH/V = 00 ff

Oczywiście zaufałem Altirrze, że poprawnie emuluje zachowanie ANTIC-a, ale bazując na tym zaufaniu zrobiłem patcha:

03c0: 41 c0 03
d402: c0 03

który ustawia pustą dlistę jeszcze przed uruchomieniem programu dekompresującego i wszystko działa, bo żadne przerwanie DLI nie jest wtedy uruchamiane.

I o co tutaj chodzi?

Edit: Dla porządku jeszcze dlista winiety:

401B: 70 70 70 70 70 70 70 70 42 2C 40 00 00 02 41 1B
402B: 40

Rozumiem, że ANTIC ma w buforze śmieci, ale dlaczego w takim razie DLI pojawia się w 23 linii skanningowej a nie w 8? Najpierw mamy pustą linię a potem linię 8 ze skrolami i DLI - VSCRL jest 0, więc nawet jeśli ANTIC ma drugi rozkaz zbuforowany to DLI powinno się pojawić w linii 16.

Edit 2: Hmmm $E8 to %11101000 czyli VSCROLL+ LMS + DLI.

Edit 3: Właściwie to zakładając, że Altirra kłamie co do stanu ANTIC-a, można założyć że w buforze jest linia trybu 5 albo 7 z ustawionym DLI - to by tłumaczyło przerwanie w linii 23. Dzięki @Krótki!

Edit 4: I rzeczywiście:

Altirra> .dlhistory
Ycoord DLIP PFAD H V DMACTL MODE
--------------------------------
    8: 401b f03c 0 0   00   c5
   24: 401b f03c 0 0   00   c5
   40: 401b f03c 0 0   00   c5
   56: 401b f03c 0 0   00   c5
   72: 401b f03c 0 0   00   c5
   88: 401b f03c 0 0   00   c5
  104: 401b f03c 0 0   00   c5
  120: 401b f03c 0 0   00   c5
  136: 401b f03c 0 0   00   c5
  152: 401b f03c 0 0   00   c5
  168: 401b f03c 0 0   00   c5
  184: 401b f03c 0 0   00   c5
  200: 401b f03c 0 0   00   c5
  216: 401b f03c 0 0   00   c5
  232: 401b f03c 0 0   00   c5

Niezłe - w ten sposób mając wyłączone DMA i zgaszony ekran można generować przerwania DLI co 16 linii skanningowych. A używając trybu graficznego i VSCROL co 1..16 linii.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

403 Ostatnio edytowany przez Krótki (2019-04-26 08:27:44)

Zrób breakpointa wcześniej, na zapisie do DMACTL, który wyłącza DMA - punkt 4. z mojego posta. Wówczas wywołaj .dlhistory, i zobaczysz jak wyglądała historia displaylisty tuż przed wyłączeniem DMA. Istotnie DMA jest wyłączane w trakcie wykonywania rozkazu C5.

Wersja od Strykera, z tego co widzę, jest pod względem kodu identyczna, tzn. też zawiera ten błąd polegający na włączeniu na chwilę DMA dla DL (punkty 2-4 z mojego posta). Jedyna różnica jest w procedurze ładującej, która jest zsynchronizowana z ekranem w inny sposób. W efekcie skok to procedury dekompresji (tj. pod adres $2600) jest wykonywany w innej linii ekranu niż w wersji Duddiego. W konsekwencji wszystkie pozostałe zdarzenia również następują w innych liniach ekranu. W efekcie w momencie wyłączenia DMA (punkt 4) w buforze ANTIC-a znajduje się inny bajt, który ma wyłączoną flagę DLI. Dzięki temu gra przypadkiem uruchamia się poprawnie.

mono napisał/a:

Oczywiście zaufałem Altirrze, że poprawnie emuluje zachowanie ANTIC-a, ale bazując na tym zaufaniu zrobiłem patcha:

03c0: 41 c0 03
d402: c0 03

który ustawia pustą dlistę jeszcze przed uruchomieniem programu dekompresującego i wszystko działa, bo żadne przerwanie DLI nie jest wtedy uruchamiane.

Prostsza poprawka wymaga zmiany jednego bajtu pod adresem $899, żeby naprawić faktyczny błąd:

0898: A9 22             LDA #$22 -> LDA #$00
089A: 8D 2F 02          STA SDMCTL
089D: 8D 00 D4          STA DMACTL

Dzięki temu nie ma niepotrzebnego włączania DMA i problem z głowy.

Ciekawostka: loader w wersji Duddiego zawiera ciąg tekstowy "CDC2,(C) L.K.APM '93" (jest on ładowany pod adres $46c). LK APM to autorzy "Władcy" i obu części "Najemnika".

A8CAS - narzędzie do 100% archiwizacji kaset Atari

404

Dziewiąta dziesiątka za kilka dni będzie dostępna. Nakład jest symboliczny, więc zapraszam chętnych do składania zamówień już teraz. Do setki wydanych tytułów już niedaleko!

Post's attachments

9thset1.png 1.18 mb, liczba pobrań: 1 (od 2019-11-06) 

9thset2.png 690.17 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.
Arguing with an engineer is a lot like wrestling in the mud with a pig, after a couple of hours you realize the pig likes it...

405

A któreś z tych tytułów i poprzednich są, lub będą może na kartridżach?

Atari 65XE + LDW SUPER 2000 + SIO2SD + SIO2PC + Stereo + TTP + Ultimate Cart + Multicart XE

406

Nie ma. I szanse na to są nikłe. Po prostu brak zainteresowania, a produkcja wersji kartridżowej jest droższa.

Arguing with an engineer is a lot like wrestling in the mud with a pig, after a couple of hours you realize the pig likes it...

407

Rozumiem. Szkoda.
Dziękuję za info :)

Atari 65XE + LDW SUPER 2000 + SIO2SD + SIO2PC + Stereo + TTP + Ultimate Cart + Multicart XE

408

No i prawie jest gotowa 10-ta dziesiątka. Tak, to już 100 tytułów będzie wydanych! Jeśli ktoś ma ochotę zamówić, zapraszam, liczba zestawów będzie niewiele większa niż liczba zebranych zamówień.

Post's attachments

10thset1.png 1.13 mb, liczba pobrań: 1 (od 2020-02-13) 

10thset2.png 725.7 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.
Arguing with an engineer is a lot like wrestling in the mud with a pig, after a couple of hours you realize the pig likes it...

409

10-ta dziesiątka i zarazem sto wydanych tytułów gotowe!

Post's attachments

10thset_1.jpg 1.12 mb, liczba pobrań: 1 (od 2020-03-20) 

10thset_2.jpg 705.61 kb, nikt jeszcze nie pobierał tego pliku. 

10thset_3.jpg 775.19 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.
Arguing with an engineer is a lot like wrestling in the mud with a pig, after a couple of hours you realize the pig likes it...

410 Ostatnio edytowany przez Rosa (2020-05-04 16:31:31)

Czesc, czy jest jakis cennik ( moze go przeoczylem ) i jak jest metoda zamawiania?

@ nie bylo pytania, znalazlem.

411

@Rosa - pisz na zamowienia(małpa)retronics.eu - przy większych zestawach są rabaty.

Arguing with an engineer is a lot like wrestling in the mud with a pig, after a couple of hours you realize the pig likes it...

412

Kolejna, już czwarta seria dyskietek dla Atari. Tym razem pięć nowych tytułów, ale i pięć wznowionych, które były wydane kilka lat temu w reedycji bigboxowej. Nakład dawno się wyczerpał, a co chwilę ktoś o nie pyta, więc są. Cena nowych 90 zł/tytuł, tych wznowionych - 80 zł/tytuł. Produkcja praktycznie tylko na zamówienie, może kilka zestawów więcej będzie. Za dużo zostaje mi potem towaru. A i dyskietek coraz mniej. Także jak ktoś jeszcze reflektuje, zapraszam - mail: zamowienia(małpa)retronics.eu (nie piszcie na priv, rzadko zaglądam!)

Post's attachments

4th set disks1.png 624.34 kb, nikt jeszcze nie pobierał tego pliku. 

4th set disks1b.png 573.03 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.
Arguing with an engineer is a lot like wrestling in the mud with a pig, after a couple of hours you realize the pig likes it...

413

A czy udałoby się wydać grę The Goonies na cartridge'u, w nowej odsłonie i w ładnym Retronicsowym wydaniu?

Atari 65XE + LDW SUPER 2000 + SIO2SD + SIO2PC + Stereo + TTP + Ultimate Cart + Multicart XE

414

Ja się zapytam i zrobię offtop (nie dotyczy Atari) bo nigdy chyba nie otrzymałem odpowiedzi - na FB też bez odzewu.
Powstanie tak Sołtys na PC czy nie? Bo tak oprócz swojej starej używki miałbym też nówkę i byłoby super.