1

Witam,

co to znaczy ze procedura rozpoznania przerwania IRQ w OS moze nie rozpoznac zrodla przerwania zgloszonego przez atari?

dokladnie chodzi o to w jakich przypadkach OS skoczy pod adres:

$C0C9  lda $28C
$C0CC  pha
$C0CD  pla
$C0CE  rti

http://atari.pl/hsc/ad.php?i=1.

2 Ostatnio edytowany przez Krótki (2011-06-07 08:46:55)

W źródłach do OS rev. B przy tym RTI jest komentarz
;UNIDENTIFIED INTERRUPT, JUST RETURN
Wygląda na to, że po prostu chuchali na zimne.

A8CAS - narzędzie do 100% archiwizacji kaset Atari

3 Ostatnio edytowany przez xxl (2011-06-07 10:47:29)

ale to znaczy ze atari moze wygenerowac niezidentyfikowane przez os przerwanie irq ?


---
wyglada na to ze tak. co mogloby byc zrodlem takiego przerwania?

http://atari.pl/hsc/ad.php?i=1.

4

PBI ?

https://www.youtube.com/watch?v=jofNR_WkoCE

5

przerwanie pbi obslugiwane jest tu:

$C047  lda $D1FF
$C04A  and $0249
$C04D  beq $$C052
$C04F  jmp ($020A)
$C052  ...

ale sluszna uwaga, czyli jesli urzadzenie pbi moze zglosic przerwanie irq ale sterownik tego urzadzenia podczas inicjalizacji nie zglosi do systemu ze urzadzenie ma taka mozliwosc to os atari zawsze wyladuje tu: $C0C9 ? jakis czas sie to wykonuje, czyli przyspawamy 2 kabelki z pokretlem zmianiajaca czestotliwosc generowania takich niezidentyfikowanych przerwan i mamy mozliwosc recznego sterowania szybkosci dzialania programow ???

no powiedzmy ze tak... ale podobna procke nierozpoznanego przerwania maja wszystkie atari, nie wiem, czy atari np. 400 lub atari5200 tez ma pbi?

http://atari.pl/hsc/ad.php?i=1.

6 Ostatnio edytowany przez Krótki (2011-06-07 11:27:39)

No ale w 400/800 możesz np. podpiąć swoje urządzenie zewnętrzne bezpośrednio do nóżki IRQ procesora. Autorzy po prostu wiedzieli co to znaczy future-proofing i zabezpieczyli prockę przed najdzikszymi rozszerzeniami jakie użytkownikom mogą przyjść do głowy.

A8CAS - narzędzie do 100% archiwizacji kaset Atari

7

zalozmy ze tak bylo. czy nie rozsadniej by bylo zastosowac dokladnie ten sam schemat jak w calej procedurze obslugi przerwania niemaskowalnego i skoczyc przez wektor (powiedzmy wektor przerwania niezidentyfikowanego) do procki opuszczajacej przerwanie? to by mialo sens, bo z OSa mozligysmy takie 'dziwne' urzadzenie obslugiwac. nie jest to zadne zabezpieczenie bo uzywajac OS nic z tym nie mozemy zrobic, ani oprogramowac ani nawet wykryc takiej sytuacji (bez odlaczania OS).

czy oprocz zle zdefiniowanego urzadzenia PBI cos moze wygenerowac takie niezidentyfikowane przerwanie?

http://atari.pl/hsc/ad.php?i=1.

8

Przecież możemy obsługiwać nowe przerwania IRQ za pomocą wpięcia się w wektor VIMIRQ ($216). Niestety ma to tę wadę, że zmieniają się priorytety obsługi przerwań i żeby się wpiąć gdzieś w środek, trzeba napisać swoją własną procedurę.

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

9

xxl napisał/a:

zy nie rozsadniej by bylo zastosowac dokladnie ten sam schemat jak w calej procedurze obslugi przerwania niemaskowalnego i skoczyc przez wektor (powiedzmy wektor przerwania niezidentyfikowanego) do procki opuszczajacej przerwanie?

Byłoby rozsądniej (tak jest np. w ST). W ogóle to nie wiem, dlaczego jest tam to PHA/PLA/RTI, chyba wystarczyłoby RTI zamiast tego. Ale może chodzi o pozostawienie 3 bajtów miejsca na JMP () przez wektor użytkownika (który jak sobie doda urządzenie generujące "niezidentyfikowane" przerwanie, to może sobie i OS spaczuje). Albo po prostu o pozostawienie miejsca na przyszłe rozszerzenie o taki wektor.

KMK
? HEX$(6670358)

10

@mono, to ze mozna obslugiwac standardowa sytuacje przerwania przez wektor VIMIRQ to jest jasne, mowimy o niestandardowej sytuacji gdy atari skacze do $C0C9

drac030 napisał/a:

W ogóle to nie wiem, dlaczego jest tam to PHA/PLA/RTI, chyba wystarczyłoby RTI zamiast tego. Ale może chodzi o pozostawienie 3 bajtów miejsca na JMP () przez wektor użytkownika (który jak sobie doda urządzenie generujące "niezidentyfikowane" przerwanie, to może sobie i OS spaczuje). Albo po prostu o pozostawienie miejsca na przyszłe rozszerzenie o taki wektor.

samo rti nie wystarczy bo OS podczas sprawdzania czy nie ma ustawionego bitu $10 stanu procesora wczesniej zrzuca ze stosu rejestr A wlasnie do $028C. czyli musi byc:

lda $028C
PHA

czyli 4 bajty a nie 3
bo zaraz po nich jest procka wyjscie z przerwania dla calej reszty

PLA
RTI

z tym patchowaniem osa to tez srednio, to tak jakby sie przyznac ze programisci OSa nie wiedzieli co pisza :/

moze jest inne potencjalne zrodlo takiego przerwania? ktore z premedytacja musi byc ignorowane?

http://atari.pl/hsc/ad.php?i=1.

11

xxl napisał/a:

samo rti nie wystarczy bo OS podczas sprawdzania czy nie ma ustawionego bitu $10 stanu procesora wczesniej zrzuca ze stosu rejestr A wlasnie do $028C. czyli musi byc:

lda $028C
PHA

czyli 4 bajty a nie 3
bo zaraz po nich jest procka wyjscie z przerwania dla calej reszty

PLA
RTI

No ja właśnie o tym mówię, że nie wiem, po co jest PHA/PLA/RTI, a nie, po co jest LDA. Zamiast PHA można byłoby dać RTI i chyba wyszłoby na to samo (tylko zaoszczędziłoby się 7 cykli).

moze jest inne potencjalne zrodlo takiego przerwania? ktore z premedytacja musi byc ignorowane?

Zważywszy, jak już zauważył Fox, że linia IRQ jest wyprowadzona na PBI/ECI, tym źródłem może być cokolwiek, co sobie skonstruujesz i tam podepniesz (choćby to były dwa druty z przełącznikiem).

KMK
? HEX$(6670358)

12

i nie mozemy tego wykryc ani obsluzyc bez wylaczania OS, a wplyw to ma dzialanie komputera.

http://atari.pl/hsc/ad.php?i=1.

13

jeszcze to:

$C0A2  bit $D302
$C0A5  bpl $C0AD
$C0A7  lda $D300
$C0AA  jmp ($0202)
$C0AD

i niby wszystko jasne i wlasciwie zgodne z tym co jest w literaturze i atariki, ale pierwszy port PIA ma dwie linie do portu SIO, ta procka wyzej bada przerwanie na jednej z nich. w dokumentacji PIA jest, ze druga linia tez moze byc zaprogramowana jako wejscie przerwania i zglasza to bitem 6 czyli w powyzszej procedurze brakuje rozkazu:

BVC

no i wlasnie to jest niezgodne z literatura bo np na atariki mozna przeczytac ze sa to kombinacje nieuzywana (w takim razie po co jest inicjowana tak, ze zostaje programowo wylaczona).
czy po wlaczeniu atari zacznie przyjmowac przerwania dwoma niezaleznymi liniami na porcie A? caly czas mowie o porcie A a nie porcie B!!!

jesli to prawda, to procka rozpoznania przerwania IRQ w atari ma co najmniej dwa bledy.

a moze sie myle i faktycznie na atari to jest jakos sprzetowo zablokowane. moze to ktos zweryfikowac przynajmniej teoretycznie?

http://atari.pl/hsc/ad.php?i=1.

14

xxl napisał/a:

jakis czas sie to wykonuje, czyli przyspawamy 2 kabelki z pokretlem zmianiajaca czestotliwosc generowania takich niezidentyfikowanych przerwan i mamy mozliwosc recznego sterowania szybkosci dzialania programow ???

Fajny pomysl. Kiedys w Bajtku byl dzialajacy na tej zasadzie spowalniacz zx spectrum.

Moze na poczatek przycisk "pauza" ?

https://www.youtube.com/watch?v=jofNR_WkoCE

15

tylko, z czego pamiętam ZX Spectrum jest komputerem na tyle prostym w budowie, że "spowalniacz" nie jest trudnym do zaprojektowania "urządzeniem" ;)-

Kontakt: pin@usdk.pl

16

@Fox: przystawka dla cheaterow w grach ;-)

debugowalem i oto wyniki:

oprocz bledu z nieprzechwyceniem przerwan z BPI jest kolejny. mozna generowac niezidentyfikowane (przez OS atari) przerwania poprzez PIA, blad w systemowej procedurze rozpoznania znajduje sie tu:

$C0AD  bit $D303
$C0B0  bpl $C0B8
$C0B5  jmp ($0204)
$C0B8

brakuje sprawdzenia bitu 6 $D303 chociazby rozkazem bvc/bvs

cytat z atariki: Rejestr kontroli portu B. Znaczenie bitów:
bit 7: status przerwania IRQ portu B (1 - wystąpiło)
bit 6: nieużywany (zawsze 0)
bit 5: nieużywany (zawsze 1)
bit 4: nieużywany (zawsze 1)
bit 3: sterowanie linią COMMAND gniazda SIO (0 - aktywna)
bit 2: bit wyboru funkcji rejestru PORTB: 0 - rejestr kierunku przepływu danych, 1 - rejestr przesyłania danych.
bit 1: nieużywany (zawsze 0)
bit 0: zezwolenie na przerwanie IRQ portu B (1 - dozwolone)

nieprawda, nieuzywany chyba przez system operacyjny bo normalnie mozna programowac PIA. powinno byc:

bit 7: status przerwania IRQB1 portu B (1 - wystąpiło)
bit 6: status przerwania IRQB2 portu B (1 - wystąpiło)
bit 5: funkcje1
bit 4: funkcje1
bit 3: funkcje1
bit 2: bit wyboru funkcji rejestru PORTB: 0 - rejestr kierunku przepływu danych, 1 - rejestr przesyłania danych.
bit 1: funkcje2
bit 0: funkcje2

w zaleznosci od funkcji1
bit 3: moze byc linią COMMAND gniazda SIO lub wejsciem przerwan

funkcje2: wybieraja zachowanie linii INTERRUPT

nie ma informacji ze linia "COMMAND" MOZE BYC WEJSCIEM PRZERWAN i zglasza to bitem 6 w rejestrze PBCTL PIA?

to samo dotyczy PACTL. mozna zaprogramowac linie MOTOR CTL tak, ze bedzie WEJSCIEM przerwan - tylko tu jest problem taki, ze atari ma sprzetowa blokade w postaci tranzysotra, wiec jesli chcemy odbierac ta linia przerwania nalezy wpiac sie przed tranzystor ;-) tu sobie mozna wymyslec rozszerzenie ktore z tego korzysta bo z gniezda SIO nie mozna wywolac tego przerwania.

czy ktos ze sprzetowcow moze to potwierdzic lub zaprzeczyc?

http://atari.pl/hsc/ad.php?i=1.

17

Tia, sformułowania w literaturze sugerują, że te bity nie są wykorzystywane przez PIA. Jeśli jest inaczej, trzeba to rzecz jasna poprawić.

Natomiast nie wiem, czy brak obsługi tego w OS-ie to jest taki znowu "błąd". Ostatecznie wszystkie "nieobsługiwane" przerwania można obsłużyć przez vimirq (jak już parę postów temu zauważył mono). Ten wektor właśnie po to m.in. jest.

Jeśli Motor Control można użyć jako wejścia przerwań tylko po wypruciu z Atari tranzystora, to oznacza, że to przerwanie jest, jak sam wyżej napisałeś, sprzętowo zablokowane i OS nie ma potrzeby go obsługiwać. Jeśli ktoś zmodyfikuje Atari, to i pod vimirq się spokojnie może podwiesić z obsługą.

Ogólnie, to fajnie, że na SIO może być 1 albo 2 sygnały IRQ więcej, niż jest ich tam "oficjalnie". Tyle że chyba nawet tych dwóch, o których wszyscy wiedzą, nikt nie używa.

Ogólnie 2, to w Atari OS jest parę błędów rzeczywistych, tzn. takich, które powodują jakieś problemy. Brak obsługi przerwań, które i tak nie występują, to jest raczej szczegół.

KMK
? HEX$(6670358)

18

najwazniejsza i wlasciwie nowa informacja jest ta, ze linia COMMAND moze byc zaprogramowana jako wejsciem przerwan i po przyslowiowym jednym POKE na standardowym atari bez jakichkolwiek rozszerzen systemowa procedura rozpoznania przerwania IRQ nie moze go zidentyfikowac. reszta to tylko dodatkowe informacje z debugownia ;-)

no ale racja, skoro mozna zastapic systemowa procedure rozpoznania przerwania wlasna to w tym sensie OS atari nie ma bledow i jest przemyslany (raczej system w sensie sprzetu) - bo jesli OS Atari na jakims polu niedomaga zawsze mozna go wylaczyc i zastapic swoja procka. po to wlasnie jest ;-)

jest jeszcze jedna niescislosc w obsludze PIA, moze po weekendzie cos sie urodzi.

http://atari.pl/hsc/ad.php?i=1.

Panowie, jak tak was czytam to się boję że zaraz w GTIA akcelerator 3D znajdziecie ;)

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

20

xxl napisał/a:

no ale racja, skoro mozna zastapic systemowa procedure rozpoznania przerwania wlasna to w tym sensie OS atari nie ma bledow i jest przemyslany (raczej system w sensie sprzetu)

Można też spojrzeć z innej strony. Wysłanie sygnału na linię COMMAND przez urządzenie zewnętrzne (bo do tego się to sprowadza) jest zabronione w protokole i spowodowałoby spory rejwach wśród urządzeń wpiętch w łańcuch SIO. Zatem można uznać decyzję o braku obsługi bitu 6 PBCTL za celową, bo taka sytuacja zajdzie wyłącznie w systemach z nieprawidłowo działającymi peryferiami.

A8CAS - narzędzie do 100% archiwizacji kaset Atari

21

@Adam, to zalezy od Electrona :D http://atariarea.krap.pl/forum/viewtopic.php?id=8378

@Krótki: nie wydaje mi sie, jesli masz 4 stacje podlaczone jednoczesnie to taka sytuacja wystepuje caly czas i nic zlego sie nie dzieje. zeby uruchomic jakas akcje musi byc wspolpraca PIA i POKEYA po stronie atari.
ale pobujajmy troszke: zalozmy, ze napiszemy sobie bios dla stacji np.2001 w ktorym damy mozliwosc stacji dyskow samodzielnego nawiazywania kontaktu z inna stacja w systemie? dzieki bitowi PBCTL moglibysmy wykryc takie urzadzenie w lancuszku SIO ;-)

http://atari.pl/hsc/ad.php?i=1.

22 Ostatnio edytowany przez Krótki (2011-06-10 22:16:24)

xxl napisał/a:

@Krótki: nie wydaje mi sie, jesli masz 4 stacje podlaczone jednoczesnie to taka sytuacja wystepuje caly czas i nic zlego sie nie dzieje. zeby uruchomic jakas akcje musi byc wspolpraca PIA i POKEYA po stronie atari.

Podczas współpracy komputera z 4 stacjami dysków wszystko się dzieje zgodnie z protokołem SIO, więc stwierdzenie "taka sytuacja występuje cały czas" wygląda na oderwane zarówno od rzeczywistości jak i od tej dyskusji.

xxl napisał/a:

ale pobujajmy troszke: zalozmy, ze napiszemy sobie bios dla stacji np.2001 w ktorym damy mozliwosc stacji dyskow samodzielnego nawiazywania kontaktu z inna stacja w systemie? dzieki bitowi PBCTL moglibysmy wykryc takie urzadzenie w lancuszku SIO ;-)

A w jaki sposób taka stacja miałaby decydować, kiedy jest dobry moment na zwarcie linii COMMAND?
A co jeśli w danym momencie trwa transmisja między komputerem a inną stacją? W takiej sytuacji wszystkie urządzenia w systemie zaczynają oczekiwać ramki komend od komputera. No ale komputer jest właśnie w trakcie transmisji. Powiedzmy że  przypadkiem akurat zaczął wysyłać 5 bajtów wyglądających jak prawidłowa ramka komendy jednego z urządzeń. Mam kontynuować?
Celowo w protokole SIO wyłącznie jednostka centralna ma prawo zewrzeć linię COMMAND.

A8CAS - narzędzie do 100% archiwizacji kaset Atari

23

> Podczas współpracy komputera z 4 stacjami dysków wszystko się dzieje zgodnie z protokołem SIO, więc stwierdzenie "taka sytuacja występuje cały czas" wygląda na oderwane zarówno od rzeczywistości jak i od tej dyskusji.

jesli komputer wysyla komende do stacji numer x to COMMAND jest zwarty a 3 pozostale stacje nie szaleja. to normalna sytuacja.

> A w jaki sposób ...

no to podlaczmy kilka komputerow i kilka stacji dyskow w siec. jak moglaby wygladac siec zbudowana w oparciu o SIO? sprobujmy. mamy do dyspozycji 3 bity statusu linii przerwan. mozemy je dowolnie programowac jako wejscie i wyjscie wiec z dowolnego kompa w sieci mozemy ustawiac bity w PIA na kazdym innym komputerze w sieci. dowolny komputer aby przeprowadzic jakas operacje sprawdza status jednego z tych bitow (odpowiedzialnego za zajeta siec) jesli siec jest wolna ustawiamy bit i przeprowadza komunikacje, skonczyl, uwalnia siec. pomysl na szybko. moze to tak dzialac?

http://atari.pl/hsc/ad.php?i=1.

24 Ostatnio edytowany przez Krótki (2011-06-10 23:31:45)

xxl napisał/a:

moze to tak dzialac?

Race condition jak diabli.

EDIT: nie no ja oczywiście wierzę, że można sobie wyimaginować urządzenie wykorzystujące linię COMMAND do sobie znanych celów. Ale tak czy siak będzie to niezgodne z protokołem i z istniejącymi urządzeniami SIO, więc autorzy OSa mieli pełne prawo olać taki przypadek użycia.

A8CAS - narzędzie do 100% archiwizacji kaset Atari

25

wydaje mi sie ze nie masz racji. kolejny przyklad:

> Celowo w protokole SIO wyłącznie jednostka centralna ma prawo zewrzeć linię COMMAND.

w takim razie podlaczamy dwa komputery zwyklym kablem SIO, jeden dziala jako host standardowo, w drugim ustawiamy linie COMMAND jako wejscie i uruchamiamy program "emulator stacji dyskow". mozna?

http://atari.pl/hsc/ad.php?i=1.