Przejdź do treści forum
atari.area forum
Twoje polskie źródło informacji o Atari
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
Aktywne tematy Tematy bez odpowiedzi
Aktualności ze świata Atari
Gopher2600 v0.54.0 Najnowsza wersja emulatora Atari 2600 przynosi tryb headless oraz poprawki błędów.
Gearlynx 1.2.4 Ukazała się aktualizacja Gearlynx, emulatora konsoli Atari Lynx, z poprawionym debuggerem.
FujiNetChat: Nowy klient IRC dla Atari Pierwsza publiczna wersja alfa FujiNetChat, nowoczesnego klienta IRC wykorzystującego interfejs FujiNet.
Gearlynx 1.2.2 Gearlynx doczekał się aktualizacji. Wprowadzono podgląd SCB, wyszukiwanie w pamięci oraz poprawki.
Wyniki FujiCup 2025 Poznaliśmy najlepsze gry na 8-bitowe Atari wydane w 2025 roku według jury oraz publiczności.
Opcje wyszukiwania (Strona 77 z 122)
Pin napisał/a:mazi napisał/a:Ciekawe jak dostajesz sie do plikow (by je odegrac) w powiedzmy w czwartej setce. Bo nie wierze, ze znasz nazwy oraz formaty wszystkich plikow na pamiec.
2. Mam 400 plików posortowanych w katalogu alfabetycznie, jestem pod command processor i teraz szukamy jakiegoś pliku zaczynającego się na literę "z":
dir z*.*
Dn:>z_nazwa.ext
Muza gra.
Mazi ;) - znasz szybszą metodę?
DOSKEY.SYS
Z[TAB][RETURN]
Sugerujesz, że jest to byt pozbawiony świadomości swego istnienia?
Dla wygody i przyjemności?
Nie zna życia, kto nie pisał w Sparta DOS X.
I jak tu wyjść psem na spacer...?
Piękny kawałek kodu ("Dowód jest elegancki kiedy da się go zapisać na marginesie" haha). Szacun!
Edit: Zastanawiam się czy NEWIOP nie spowoduje, że w pewnych warunkach procedura nie będzie reentrant, ale jeśli przepiszemy IRQMAIN to można go nie używać, albo zapewnić żeby była tam zawsze zawartość .A sprzed wywołania.
Podoba mi się JSR+NOP zamiast odkładania dokładnego powrotu na stos - zgrabne.
Tak, ale niestety patch spowoduje też spory wzrost opóźnień (dla DLI ok 20 cykli, dla VBLK ok 35, dla IRQ ok 25). W przypadku DLI chyba lepiej nie wprowadzać takich delayów? 7 cykli przy samym NMI patch w sumie może byłoby i akceptowalne...
Zrobiłem małą przymiarkę dla wektoryzowania przez NMIVEC i IRQVEC:
nmi:
pha ;3
lda #>brkopcode ;2
pha ;3
lda #<brkopcode ;2
pha ;3
php ;3
asl NMIST
scc
jmp (VDSLST)
pha
txa
pha
tya
pha
cld
jmp (VVBLKI)
irq:
pha ;3
lda #>brkopcode ;2
pha ;3
lda #<brkopcode ;2
pha ;3
php ;3
asl NMIST
scc
jmp (VDSLST)
cld
smi
jmp (VIMIRQ)
pha
txa
pha
tya
pha
jmp (VVBLKI)
brkopcode:
txa
pha
tsx
lda $103,x
and #$10
beq ?ret
pla
tax
jmp (VBREAK)
?ret:
pla
tax
pla
rti
oraz dla VDLST, VVBLKI i VIMIRQ:
vdslst:
sta NMIRES ;4
pha ;3
lda #>brkopcode ;2
pha ;3
lda #<brkopcode ;2
pha ;3
php ;3
... ;-------20 cykli
vvblki:
pla ;4
tay ;2
pla ;4
tax ;2
lda #>brkopcode ;2
pha ;3
lda #<brkopcode ;2
pha ;3
php ;3
txa ;2
pha ;3
tya ;2
pha ;3
... ;-------35 cykli
vimirq:
bit NMIST ;4
spl ;23
jmp (VDSLST) ;5 -----11 cykli
svc ;23
jmp (VVBLKI) ;5 -----14 cykli
pha ;3
lda #>brkopcode ;2
pha ;3
lda #<brkopcode ;2
pha ;3
php ;3
... ;-------26 cykli
Na razie teoretyzuję, bo nie uruchamiałem tego. W tym przypadku IRQ w obydwu przypadkach uruchomi 2x obsługę BRK kiedy nie wejdzie mu w drogę ani NMI, ani IRQ.
Edit: 2x wywołanie BRK akurat da się obejść realizując zamiast PHP po prostu LDA #%00100100+PHA.
Przy takim zdefiniowaniu priorytetów używanie BRK mija się z celem, bo opóźnienia obsługi BRK w pesymistycznym przypadku będą rzędu 250 cykli (przejdzie cała detekcja IRQ zanim zostanie wywołana obsługa BRK). Lepiej użyć JSR/JMP i tablicy skoków. Pewnie dlatego OSowcy zrezygnowali z patchowania i zostawili PLA/RTI (co chyba najsensowniej w takim stanie rzeczy zrobić).
Pytanie dlaczego w ogóle zostawili wektor (i to dopiero w serii XL/XE) skoro wiedzieli, że to nie działa? Może planowali użyć CPU, który wszystko realizuje poprawnie? ;]
Wychodzi na to, że faktycznie sens używania BRK to tylko laboratoryjny debug.
W atariki stoi: "Wystąpienie przerwania podczas wykonywania rozkazu BRK spowoduje, że zostanie on zignorowany". Tylko co to znaczy? Czy to, że błąd leży w procedurze obsługi IRQ, czy że jest to własność processora?
NMI jest wymuszane zboczem, więc nie ma szans wejść w to samo NMI po raz drugi. Jeśli chcielibyśmy obsługiwać BRK też i na NMI, to trzeba by odłożyć na stos powrót do obsługi BRK i kontynuować NMI.
Można jeszcze skorzystać z patentów xxla na programowe wywołanie IRQ i spokojnie wyjść z NMI.
Edit: "ASL..." załatwia sprawę, ale nie CAŁKOWICIE, bo jak sam się zgodziłeś potrzebne jest jeszzcze STA NMIRES na DLI :/ albo zmiana ROMu z główną procedurą obsługi NMI (tak, żeby użytkownik nie musiał już robić nic z NMIRES w swoim kodzie).
Edit 2: "Wejść w to samo NMI po raz drugi" - chodzi o podtrzymanie wymuszenia na linii NMI. IRQ jest wymuszane poziomem, więc przerwanie może być odroczone - wystarczy tylko nie obsługiwać go w IRQST (lub innych). W NMI to nie wystarczy, bo po powrocie przez RTI wymuszenia już nie ma.
A co jest w F.I na stosie? Bo może warto by zrobić tak:
- jeśli I=1 to IRQ na pewno nie przerwie IRQ, więc jedynymi opcjami są NMI i BRK.
- jeśli B=0 to było BRK więc można od razu wykonać nie uruchamiając detekcji źródeł IRQ.
Widzę jeszcze jeden problem.
Załóżmy, że wykonujemy BRK i CPU wszedł w obsługę przerwania, sprawdza kolejne źródła i w tym momencie przychodzi jakieś IRQ. Zapala się flaga w IRQEN/PxCTL/PDVREG czy gdzie tam i nagle CPU zamiast zrealizować BRK zboczy nam w któreś IRQ. Obsłuży przyjęcie i nie zwracając na stan B na stosie wyjdzie z przerwania. W tym momencie jest po ptakach, bo drugi raz w przerwanie nie wejdziemy (analogicznie jest z NMI, ale to tylko dygresja) :/ Może w OS po prostu źle zrobiono detekcję i BRK powinno mieć najwyższy priorytet?
ASL ładne, ale to i tak nie załatwia całkowicie sprawy - trzeba by poprawić w ROMie procedurę NMI, bo tam nie mamy już takiego fajnego wektora VIMNMI (z NMIVEC możemy wszystko). Inaczej problem będzie z pierwszym IRQ wykonywanym po NMI.
CLD w NMI robione jest tylko dla VBLK.
CLD sobie trzeba dodać przed obsługą IRQ, bo SIO liczy np. sumę kontrolną.
Z moich testów wynika, że nie ma jak wykryć wykonania BRK kiedy wraz z nim wystąpiło jakiekolwiek przerwanie sprzętowe (nie może być jak IRQ odroczone). Chciałbym się bardzo pomylić w tej kwestii, bo podoba mi się wołanie funkcji systemowych za pomocą BRK #fn.
Jump if MInus: bmi albo jeśli za daleko to spl + jmp; analogicznie Jump if V Clear.
Edit: No i BRK wykona się przy zapalonym I.
A nie wynika to z tego, że przerwanie jest przyjmowane po zakończeniu bieżącego cyklu rozkazowego więc mając np LDA NMIST i NMI, które wystąpi po prefetchu a przed 4 cyklem rozkazu w A dostaniemy info o NMI?
Ha! (za https://atariwiki.org/wiki/Wiki.jsp?pag … %20Listing ):
;
; NMI HANDLER
;
; DETERMINE CAUSE AND JUMP THRU VECTOR
;
PNMI: BIT NMIST
BPL PNMI1 ;SEE IF DISPLAY LIST
JMP (VDSLST)
PNMI1: PHA
LDA NMIST
AND #$20 ;SEE IF RESET
BEQ *+5
JMP WARMSV ;DO THRU WARM START JUMP
TXA ;SAVE REGISTERS
PHA
TYA
PHA
STA NMIRES ;RESET INTERRUPT STATUS
JMP (VVBLKI) ;JUMP THRU VECTOR
W XL/XE oczywiście dodano CLD i usunięto test NMIST.5.
jmi/jvc - nie wiedziałem, że tak można :) Ale wygląda ładnie.
@xxl: Niestety reset NMI jest konieczny przy paczowaniu IRQ.
Dlaczego?
Założenie projektantów OSa było (domyślam się) takie: DLI jest krytyczne czasowo, więc nie robimy tu niczego zbędnego - widać to po tym, że nie robią nawet PHA a przechodzą do DLI najszybciej jak się da. Ponieważ w XL/XE (nie wiem, jak to wygląda w 400/800) przerwania NMI są tylko 2, to nawet jak wystąpi DLI i status w NMIST po jego obsłudze zostanie w rejestrze, to nic się nie stanie, bo następnym przerwaniem NMI będzie i tak tylko kolejne DLI. Aż do momentu wystąpienia VBLK, bo najwyraźniej przy jego wystąpieniu NMIST.7 jest kasowany i dlatego systemowa procedura VBLK ma szansę się wykonać.
Jeśli natomiast po (albo równocześnie z) DLI wystąpi IRQ to bez skasowania NMIST obsługa przerwania IRQ zawsze przejdzie do obsługi DLI i nigdy nie wykona właściwego IRQ.
Dlaczego uważam, że powinien to robić user implementujący DLI? Ponieważ mamy jeden wektor VDLST, który używa NMI i IRQ a obsługa przerwania powinna być IMHO spójna. STx nie zmieniają znaczników więc można to robić tuż przed RTI po zakończeniu krytycznych czasowo rzeczy. Byłaby to więc dobra praktyka pozwalająca działać programowi zarówno w standardowym, jak i spaczowanym środowisku.
Edit: I tak takie DLI opóźnione jest o 7 cykli (CLD+JMP ind), chyba że podpinamy się pod wektor IRQVEC zamiast VIMIRQ, ale wtedy trzeba by zrobić jeszcze CLD przed SVS.
@0xf: Racja - poprawione.
Czy paczowanie NMI na IRQ polega na:
1. Rozgałęzieniu
irqmain:
bit NMIST
spl
jmp (VDLST)
svs
jmp (VIMIRQ)
pha
txa
pha
tya
pha
sta NMIRES
jmp (VVBLKI)
2. Dodaniu na końcu kodu przerwania DLI resetowania stanu NMIST (zapis do NMIRES).
Czy są jeszcze jakieś inne szykany?
Edit: wyrzucone pha
No i jest już Altirra pozbawiona buga.
Aaaaa. To tak - blitter w końcowej fazie robi copy z ekranu wirtualnego to rzeczywistego i jest wyścig z ANITCem. To prawda - załatwi to odpalenie tegoż blita np na VBLKD, ale wtedy nie zobaczę tak ładnie lewego wskaźnika :)
Edit: To też oczywiście da się obejść. Policzyć czas trwania blita w liniach ekranowych i potem namalować wskaźnik w dowolnym miejscu ekranu, ale jak mówiłem - to "demo" ma na celu tylko zobrazowanie możliwości. Nie jest to pełnoprawne ładne demo w prawdziwym tego słowa znaczeniu :)
Jeśli masz na myśli mrugnięcie od czasu do czasu, to jest to spowodowane procedurą, która wykonuje tzw scenariusz - włącza/wyłącza obiekty do wyświetlania dla procedury przetwarzającej. Nie dopracowywałem tego, bo interesowało mnie jedynie sprawdzenie na ile można sobie pozwolić CPU a na ile blitter w jednej ramce.
Blitter odpalany jest w linii VCOUNT=$10.
Edit: Procedura scenariusza obrazowana jest na brązowo na końcu prawego paska. Zazwyczaj to jedna linia ekranu więc jej prawie nie widać, ale czasem szarpnie i wtedy na moment widać spory blok. To jest moment rozsynchronizowujący z ramką.
Dzięki :) Bo nie umiem dema :) To jest tylko mała (i pierwsza) wprawka dla VBXE napisana w celach porównawczych i z ciekawości. Rewelacyjna maszyna!
Grafika dla latających obiektów jest zwielokrotniona w VRAM po klatce dla odpowiedniej fazy. Prekalk robi VBXE po załadowaniu z dysku klatki bazowej tak, że potem VBXE tylko przerzuca dane na ekran wirtualny w odpowiednim trybie.
Edit: Najbardziej w całej zabawie podoba mi się to, że Atari ma 62K do dyspozycji na program, bo cała grafika znajduje się w VRAM.
Znalezione posty [ 1,901 do 1,925 z 3,030 ]
Forum oparte o: PunBB
Currently installed 7 official extensions. Copyright © 2003–2009 PunBB.
Wygenerowano w 0.102 sekund, wykonano 21 zapytań