1,876

(46 odpowiedzi, napisanych Programowanie - 8 bit)

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.

1,877

(46 odpowiedzi, napisanych Programowanie - 8 bit)

@Fox @xxl: Dzięki.

1,878

(46 odpowiedzi, napisanych Programowanie - 8 bit)

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?

1,879

(46 odpowiedzi, napisanych Programowanie - 8 bit)

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.

1,880

(46 odpowiedzi, napisanych Programowanie - 8 bit)

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?

1,881

(46 odpowiedzi, napisanych Programowanie - 8 bit)

Ustawiony.

1,882

(46 odpowiedzi, napisanych Programowanie - 8 bit)

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.

1,883

(46 odpowiedzi, napisanych Programowanie - 8 bit)

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.

1,884

(46 odpowiedzi, napisanych Programowanie - 8 bit)

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.

1,885

(46 odpowiedzi, napisanych Programowanie - 8 bit)

@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.

1,886

(46 odpowiedzi, napisanych Programowanie - 8 bit)

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

1,887

(14 odpowiedzi, napisanych Fabryka - 8bit)

Dzięki Seban.

1,888

(14 odpowiedzi, napisanych Fabryka - 8bit)

No i jest już Altirra pozbawiona buga.

1,889

(14 odpowiedzi, napisanych Fabryka - 8bit)

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 :)

1,890

(14 odpowiedzi, napisanych Fabryka - 8bit)

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ą.

1,891

(14 odpowiedzi, napisanych Fabryka - 8bit)

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.

1,892

(259 odpowiedzi, napisanych Fabryka - 8bit)

Zalinkuję tylko, bo to (chyba) nie miejsce na ewentualne dysputy.

1,893

(14 odpowiedzi, napisanych Fabryka - 8bit)

Część i czołgiem Towarzystwu!
Miałem swego czasu napad podczas oglądania TOMEK-8 cartridge tech-demo aby sprawdzić, na ile wydajnie dałoby się coś podobnego zrobić z wykorzystaniem znanego i lubianego VBXE.
Cóż, jak pomyślałem tak też niedawno uczyniłem i oto: http://mono.atari.pl/vbxe/t8vbxe.zip

W mojej implementacji program ładuje grafiki z dysku, po czym przepisuje je do VRAM i zleca VBXE wygenerowanie grafik przesuniętych o 1,2,3..7 pikseli. CPU zajmuje się tylko aktualizacją pozycji obiektów, określeniem na podstawie pozycji x i y którą grafikę (będącą w jego VRAM) ma pokazać i gdzie, oraz wygenerowaniem blit-listy dla VBXE. VBXE podczas każdej ramki TV wykonuje tę listę i maluje obiekty w swoim VRAM na zorganizowanym tam ekranie wirtualnym o rozmiarze 208+256 x 60+208+60 pikseli (to jakieś 58 * 328 = 19024 bajty), po czym na końcu kopiuje kawałek tegoż ekranu na fizyczny ekran widziany przez ANTICa. Dzięki temu CPU nie musi obcinać obiektów do rozmiaru ekranu i marnować niepotrzebnie cykli. Kompletny obraz malowany jest przez ANTICa co oczywiście spowalnia CPU.
Oczywiście gdyby wszystko zostało przerzucone na barki VBXE (wyświetlanie grafiki na overlay'u), to nie trzeba byłoby generować przesunięć (akurat to niczego by nie zmieniło i obiekty zajęłyby w VRAM taki sam obszar), CPU miałby więcej czasu na swoje obliczenia i wszyscy żyli by długo i szczęśliwie. Nie o to jednak mi chodziło, a chciałem właśnie sprawdzić możliwości współpracy VBXE (blittera) z ANTIC'em przy malowaniu zwykłej grafiki Atari.
Parafrazując Nosty'ego mogę powiedzieć, iż na ekranie dzieje się:
- 12 obiektów o rozmiarach 40x27 pikseli,
- 12 obiektów o rozmiarach 56x54 piksele,
- 12 obiektów o rozmiarach 72x57 pikseli,
- 12 obiektów o rozmiarach 88x43 pikseli
+ okazjonalnie gwiazda śmierci (2 obiekty), teksty (1 obiekt) no i tło (1 obiekt).
Liczę kształt, jak i maskę jako osobne obiekty.
W celach poglądowych wprowadzone zostały też wskaźniki obrazujące zajętość:
- blittera VBXE (pasek po lewej stronie ekranu),
- CPU (paski po prawej stronie ekranu - 1 pasek to jedna ramka TV, 2 paski to dwie itd.).
W początkowej fazie z przycinaniem obiektów do ekranu, liczeniem pozycji z częścią ułamkową (ale blitowaniem obiektów od razu na ekran ANTICa) wszystko zajmowało CPU ponad 4 ramki :/ Obecnie obsługa tych 52 obiektów mieści się w ramce (arytmetyka na liczbach całkowitych, koordynaty obiektów na liczbach naturalnych co eliminuje arytmetykę U2, tablicowane dzielenie przez 8, oraz adresy początków linii dla ekranów wirtualnego i rzeczywistego).

Nie wiem, jak Nosty urządził sobie swój kod i jakie rzeczy robi mu processor na TOMKU, a czym dokładnie zajmuje się CPU, ale widać że wąskim gardłem przetwarzania jest CPU w Atari :/ Niestety. (No i oczywiście umiejętności koderskie człowieka) Tak więc "Imperial March" trzeba sobie puścić z empetróchy (a taką fajną muzykę Pinokia miałem na podorędziu w TMC... :/).

Jak to uruchomić? Otóż wymagania są określone dość klarownie:
- Sparta DOS X w wersji 4.4x (ja używałem 4.46),
- VBXE z rdzeniem FX 1.2x (mam 1.24a),
- Atari XL/XE z minimum 64KB RAM,
- jakiś nośnik dyskietkowy (przykro mi, ale przez moje lenistwo z magnetem to to nie podziała).

Jeśli ktoś chciałby się przyjrzeć kodowi, to udostępnię go każdemu chętnemu (obecnie trzeba zamailować), a w późniejszym terminie wygeneruję jakiegoś zipa i instrukcję jak i czym to kompilować.

Pozostaje mi, jako autorowi życzyć Wam wszystkim smacznego i zachęcić do szczerej krytyki (wyrazy wdzięczności, zachwytu, bluzgi, faki w demach, etc. mile widziane) ze szczególnym uwzględnieniem Nosty'ego gdyż bardzo podoba mi się jego projekt i moralnie wspieram go z całych sił.

Edit: Zapomniałem napisać jak to uruchamiać:

1. Załadować sterownik VBXEFXS.SYS, który tworzy w pamięci RAM cienie dla rejestrów VBXE (będzie o tym osobny wątek w terminie późniejszym).
UWAGA!
Sterownik ten gryzie się z S_VBXE.SYS więc zaleca się niewspółistnienie.

2. Załadować T8VBXE.COM.

Edit 2: Spieszę jeszcze nadmienić, iż jedyny emulator supportujący VBXE - Altirra 2.50 test 22 ma buga (blit w trybie 4 AND) i obiekty nie będą pokazywane poprawnie.

Ładne. Cenkju.

1,895

(25 odpowiedzi, napisanych Bałagan)

Przyjacielu. Skoro Twój Ukochany Komputer nie żyje, umarł i nic nikt na niego nie robi (co najwyraźniej spędza Ci sen z powiek), a na dedykowanym forum nie da się wytrzymać, to może po prostu czas znaleźć sobie nowe zajęcie i zająć się czymś pożytecznym lub przynajmniej pasjonującym, zamiast opowiadać co to kto i czym nie powinien się zająć w swoim wolnym czasie? Atari jak widać "30 lat po czasie" ma się całkiem nieźle.

1,896

(8 odpowiedzi, napisanych Programowanie - 8 bit)

Czy w trybie AND (4) zachodzi optymalizacja z source"=$FF?

Edit: Głupie pytanie. Uprasza się admina o usunięcie cichcem :P

1,897

(8 odpowiedzi, napisanych Programowanie - 8 bit)

Dzięki ajcek. Późno już było, lecz dziś jest nowy lepszy dzień w związku z czym poszukałem forum i oto: http://www.atari.org.pl/forum/viewtopic.php?id=10265

1,898

(8 odpowiedzi, napisanych Programowanie - 8 bit)

Szkoda.
Zadanie: dokonać rotacji w lewo bloku "len" danych zaczynającego się we "from"; wynik umieścić w "to"

0: to+len=0                                      ;clear bit shifted into end of buffer (1 if bit should be set)

1: mode=0, and=$00, xor=$7f, src=xxx, dst=to     ;fill buf with $7f
2: mode=1, and=$80, xor=$00, src=from, dst=to    ;copy $80 to buf when source value has highest bit set
3: mode=2, and=$00, xor=$81, src=xxx, dst=to     ;buffer contains shifted out bits shifted into lowest bits
4: mode=2, and=$ff, xor=$00, src=from, dst=to+1  ;add
5: mode=2, and=$ff, xor=$00, src=from, dst=to+1  ;add

Wynik operacji znajduje się w "to"+1.
"from" nie jest modyfikowany.
"to" powinien mieć rozmiar o 1 bajt większy niż "from".

Jeśli dobrze liczę VBXE będzie realizować rol pojedynczego bajtu w 7/8 cykli (czy można by prosić o diagramy dla operacji blittera tak, żeby można było sobie precyzyjnie policzyć czasochłonność blitów).

Edit: styl

1,899

(1,653 odpowiedzi, napisanych Bałagan)

Ech te gry z Ultimate są po prostu śliczne!

1,900

(1,653 odpowiedzi, napisanych Bałagan)

Pięknie gra.