kategoria: Asembler
[#31] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #30

Przyjrzałem się dokładnie temu kodowi, poczytałem trochę dokumentacji procesorów i wywnioskowałem, co następuje:
;W tym miejscu procesor pracuje w trybie nadzorcy (Supervisor mode).
;Kod z systemu 3.1 sprawdzający model procesora 680x0 (do 68040 włącznie).
;Algorytm wykorzystuje właściwości bitów (flag) rejestru CACR,
;które są różne dla poszczególnych modeli procesorów 68020+.
;
0C1C	MOVEM.L	A2/A3,-(A7)
0C20	MOVEA.L	$0010.W,A0	;wektor wyjątku nr 4 (Illegal Instruction)
0C24	MOVEA.L	$002C.W,A2	;wektor wyjątku nr 11 (Line 1111 Emulator)
0C28	LEA	(0CC0,PC),A1
0C2C	MOVE.L	A1,$0010.W	;zmiana wektora wyjątku nr 4
0C30	MOVE.L	A1,$002C.W	;zmiana wektora wyjątku nr 11
0C34	MOVEA.L	A7,A1	;zapamiętanie wskaźnika stosu (A7=SSP)
0C36	MOVEQ	#$00,D0
0C38	MOVEC	D0,VBR	;instrukcja obsługiwana przez 68010/20/30/40.
;
;procesor 68010+
;
0C3C	BSET	#$00,D0
0C40	MOVE.L	#$0A09,D1	;Próba ustawienia bitów 0, 3, 9 i 11 w CACR,
0C46	MOVEC	D1,CACR	;instrukcją obsługiwaną przez 68020/30/40.
;
;procesor 68020+
;
0C4A	MOVEC	CACR,D1
0C4E	BSET	#$01,D0
0C52	BTST	#$09,D1	;sprawdzanie wartości bitu 9 w CACR
0C56	BEQ.B	0C5C	;skok, jeśli bit 9 w CACR =0, procesor to 68020
0C58	BSET	#$02,D0	;procesor 68030
0C5C	BTST	#$00,D1	;sprawdzanie wartości bitu 0 w CACR
0C60	BNE.B	0C84	;skok, jeśli bit 0 w CACR =1, procesor to 68020/68030
;
;procesor 68040
;
0C62	OR.W	#$000C,D0
0C66	CINVA	BC
0C68	MOVE.L	#$C040,D1
0C6E	MOVEC	D1,DTT0
0C72	MOVE.L	#$00FFC000,D1
0C78	MOVEC	D1,DTT1
0C7C	MOVEC	D1,ITT0
0C80	MOVEC	D1,ITT1
;
0C84	MOVE.L	#$A009,D1
0C8A	MOVEC	D1,CACR
0C8E	BTST	#$03,D0
0C92	BEQ.B	0C9E	;skok, jeśli procesor to 68020/68030
;
;sprawdzanie FPU w procesorze 68040
;
0C94	FSAVE	-(A7)
0C96	FRESTORE (A7)+
0C98	BSET	#$06,D0	;FPU wbudowany w procesor 68040 (zgodny z 68882)
0C9C	BRA.B	0CC0
;
;sprawdzanie FPU
;
0C9E	MOVEQ	#$00,D1
0CA0	FMOVE.L	D1,FPCR
0CA4	FMOVE.L	FPCR,D1
0CA8	TST.L	D1
0CAA	BNE.B	0CC0	;skok, jeśli brak FPU
0CAC	BSET	#$04,D0	;FPU 68881+
0CB0	FSAVE	-(A7)
0CB2	CMPI.B	#$18,($0001,A7)
0CB8	BEQ.B	0CBE	;skok, jeśli FPU to 68881
0CBA	BSET	#$05,D0	;FPU 68882
0CBE	FRESTORE (A7)+
;
;kod obsługi wyjątku nr 4 i 11
;
0CC0	MOVEA.L	A1,A7	;przywrócenie wskaźnika stosu (A7=SSP)
0CC2	MOVE.L	A0,$0010.W	;przywrócenie wektora wyjątku nr 4
0CC6	MOVE.L	A2,$002C.W	;przywrócenie wektora wyjątku nr 11
0CCA	MOVEM.L	(A7)+,A2/A3
0CCE	RTS

Tak więc, wszystko stało się jasne. Wyszło na jaw, jak system Kickstart 3.1 rozpoznaje procesory 680x0. Jednak raczej niczego z tego kodu, nie zaimplementuje w swoim programie. Moje rozwiązania są lepsze... :D
[#32] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #31

No to skoro poczatek juz masz to teraz czas na dalsza prace, czyli wyliczanie szybkosci procesora w MHz oraz jego MIPS-ow a w koncu na dobra/nowa wersje SysInfo.

Ostatnia aktualizacja: 07.06.2013 14:04:26 przez Don_Adan

Ostatnia aktualizacja: 07.06.2013 14:04:42 przez Don_Adan
[#33] Re: Sprawdzanie modelu procesora 680x0

@Don_Adan, post #32

No, aż tak ambitny nie jestem (SysInfo jest niezłe). Na pewno obliczanie częstotliwości i wydajności procesorów 680x0 to ciekawy temat, ale dosyć skomplikowany. Nawet nie wiem od czego zacząć... A już wiem, od Google :) Jakby ktoś miał jakąś wiedzę w tym zakresie, to niech się podzieli albo założy nowy temat na forum.
[#34] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #33

Zacznij od przeglądu kodu źródłowego whichamiga.
[#35] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #33

Ja do wyliczania MHz uzylbym timera ciab i pewnie krotkiego kodu w chipie ramie. Cos w stylu:

moveq #0,D0
bset #0,$BFxxxx (start timer)
loop
addq.l #1,D0
bra.b loop

Timer wylacza/modyfikuje petle za pomoca NOP lub RTS.
Potem wyliczasz MHz bazujac na D0 i ilosci cykli potrzebnych dla danego procesora do wykonania tej petli, pewnie trzeba jeszcze uzyc Forbid/Permit i wylaczyc/wlaczyc cache.
[#36] Re: Sprawdzanie modelu procesora 680x0

@Don_Adan, post #35

Tak to chyba najlepsze rozwiązanie, stosowane zresztą przez WhichAmiga. Zajmę się napisaniem takiego programu w najbliższej przyszłości. Ciąg dalszy nastąpi... :)
[#37] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #36

Nadszedł czas na ciąg dalszy. Kolejnym krokiem, jaki chcę zrobić jest sprawdzanie modelu koprocesora matematycznego (68881, 68882 lub wbudowany w 68040/68060). Na początek napisałem prosty kod sprawdzający, czy koprocesor jest w ogóle zainstalowany w Amidze.

Źródło, program.

Ma on wyświetlać napis "FPU: 1" jeśli koprocesor jest zainstalowany lub "FPU: 0" jeśli go nie ma. Program kompiluję w Asm-One 1.44 i sprawdzam na WinUAE 2.6. Gdy go uruchomię na konfiguracji bez FPU, pojawia się czerwony komunikat Guru Meditation: 80000004 (Illegal instruction). Jeśli w konfiguracji jest koprocesor, to nie ma żadnego błędu, ale jest wyświetlany napis "FPU: 0".

Obsługuję wyjątek 11 (Line 1111 emulator) i używam instrukcji dc.w $F280 (FNOP). Co ciekawe ta instrukcja jest 2-bajtowa, ale gdy w źródle wpiszę "FNOP" to kompilator generuje kod 4-bajtowy $F2800000. Po usunięciu instrukcji dc.w $F280, program nie powoduje żadnych błędów w systemie.

Wina leży zatem chyba w sposobie obsługi wyjątku. Co robię nie tak?
[#38] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #37

Z chęcią przetestuję twój program do sprawdzania CPU, zdarzyło się tak że moje appolo dziwnie się
zachowuje, opis tutaj, i bardzo pomogłoby mi stwierdzenie ile MHz ma moja turbina w tej chwili. Jak masz jakiś działający programik
to daj znać.
[#39] Re: Sprawdzanie modelu procesora 680x0

@Radek_Cz, post #38

Dobra, przeczytałem ten wątek już po sprawdzeniu twoim programem wyczytałem że nie sprawdza taktowania procka. Mniejsza z tym, program u mnie działa i przy Apollo 040 wyświetla CPU: 68040 :D.
To tak tylko żeby pomóc w testowaniu.

chkfpu też sprawdziłem i jest tak jak piszesz, czyli:
FPU: 0.

Ostatnia aktualizacja: 26.03.2014 16:43:21 przez Radek_Cz
[#40] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #2

Mi wyświetliło:
CPU: 68000

Sprzęt jak w mojej stópce.
[#41] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #37

Mój błąd: instrukcja FNOP jest jednak 4-bajtowa i ma kod $F2800000 (niedokładnie czytałem dokumentację). Nie zmienia to jednak faktu, że ten algorytm z tą instrukcją również nie działa - kiedy w konfiguracji nie ma FPU, to pojawia się Guru. Natomiast, jeśli kod wykonuję w trybie nadzorcy wszystko jest OK.

Zmieniłem algorytm i teraz instrukcję testującą obecność koprocesora, wykonuję w trybie nadzorcy.
Kod rozpoznający konkretny model FPU: źródło, program.

Testowałem go na emulatorze WinUAE 2.7.0 i problem jest tylko z rozpoznawaniem FPU w 68060, ale dotyczy on również takich programów, jak: WhichAmiga, SysInfo, czy CPU-Control. Problem ten wynika zapewne z tego, że do pełnej obsługi tego procesora w systemie są potrzebne odpowiednie biblioteki, których nie mam zainstalowanych. Czy ktoś mógłby go przetestować na prawdziwym sprzęcie? Interesuje mnie zwłaszcza rozpoznawanie FPU wbudowanego w procesor 68060.

Ostatnia aktualizacja: 29.03.2014 16:21:31 przez RomanWorkshop
[#42] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #41

U mnie działa. Wyświetla FPU:IN060.

A4000D z Cyberstormem060. I na A1200 z CPPC060 też działa. ;)

Ostatnia aktualizacja: 29.03.2014 16:40:50 przez Deftronic/...
[#43] Re: Sprawdzanie modelu procesora 680x0

@Deftronic/..., post #42

Dzięki, bardzo cieszy mnie taka odpowiedź ;)
[#44] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #43

Wiem, że nie mogliście się doczekać więc po "krótkiej" przerwie, kolejny odcinek z cyklu "Zaglądamy Amidze pod maskę". Dziś przyjrzymy się bliżej Agnusowi (fuuujj) i/lub Alicji (brzmi już lepiej). Dla przypomnienia wszystkie dotychczasowe odcinki:

ChkCPU, ChkFPU, Chk060, ChkGFX
[#45] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #44

Kolejna część cyklu, tym razem program do sprawdzania wersji Kickstartu: ChkKS
[#46] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #44

Czy ChkCPU może pokazać czy procesor posiada MMU? Bo te programu nie posiadają żadnego --help-a.

Ostatnia aktualizacja: 07.03.2015 21:48:35 przez amizet
[#47] Re: Sprawdzanie modelu procesora 680x0

@amizet, post #46

Nie, ten program sprawdza tylko model procesora. Do sprawdzania obecności MMU być może kiedyś napiszę program ChkMMU. Niestety nie ma jednoznacznej metody na sprawdzenie, czy w systemie jest MMU.

Każdy z tych programów, to jedynie przykład realizacji określonego testu w asemblerze. Nie potrzebują żadnego tekstu pomocy, który zajmowałby pewnie 50% objętości całego programu. Nazwa każdego z nich mówi sama za siebie ;)
[#48] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #47

No dobra z tym --help-em to może trochę przesadziłem. Może kiedyś powstanie jeden program np: ChkAmiga który będzie posiadał funkcje wszystkich wcześniejszych Chk... i wtedy taki --help by się przydał.


Nie chce być dociekliwy ale na stronie programu jest napisane,

Poniżej znajduje się kod źródłowy programu ChkCPU,...


z naciskiem na,

68030 (68EC030),


W jaki sposób program rozpoznaje jaki jest procesor? rozumie że przez wartość rejestru,

;wartość rejestru MMUSR (68030)/ACUSR (68EC030).


Czyli wartość rejestru może być ACUSR a MMU może występować?

Nie żebym wiedział oco chodzi tylko tak po prostu chciałem zapytać?

Ostatnia aktualizacja: 07.03.2015 23:24:03 przez amizet
[#49] Re: Sprawdzanie modelu procesora 680x0

@amizet, post #48

Cały algorytm sprawdzania modelu procesora, opiera się na wyjątkach. Kiedy wystąpi wyjątek (np. gdy w programie pojawi się kod instrukcji, której dany model procesora nie obsługuje), to procesor 680x0 zawsze wykonuje skok pod określony adres (wektor wyjątku). Najpierw modyfikuję ten wektor tak, żeby procesor w razie wyjątku skoczył do mojej procedury jego obsługi. Następnie próbuję wykonywać instrukcje, obsługiwane tylko przez określone modele procesorów w kolejności od 68000 do 68060. Jeśli wystąpi wyjątek, to wiem że procesor nie obsługuje danej instrukcji, a tym samym nie może być nowszy, niż dany model.

Procesor 68030 testuję instrukcją "PMOVE.W PSR,-2(A7)", która odkłada na stos wartość rejestru MMUSR w przypadku pełnego 68030 lub ACUSR dla 68EC030. Wartość tego rejestru nie ma znaczenia, a tylko to czy ta instrukcja zostanie wykonana, czy też wywoła wyjątek, który zasygnalizuje mi że procesor to 68020.

W procesorach 68EC030 kilka rejestrów MMU jest zaimplementowanych (pod inną nazwą), ale reszty jednostki MMU nie ma.

Ostatnia aktualizacja: 07.03.2015 23:52:40 przez RomanWorkshop
[#50] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #49

Dzięki, teraz mniej więcej wiem o co chodzi, można tak stwierdzić że coś tam załapałem.
[#51] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #45

Postanowiłem połączyć wszystkie moje dotychczasowe programiki diagnostyczne w jedną całość i powstała taka dyskietka diagnostyczna (ADF): BasicDiag. Kod diagnostyczny znajduje się tylko w bootbloku.

Przy okazji zapytam, czy Kickstart 1.3 lub nowszy zawsze jest dostępny pod adresem $F80000 w momencie wykonywania kodu bootbloku dyskietki? Mam tu na myśli różne funkcje (głównie kart turbo), podmieniające Kickstart i umieszczające go w pamięci FAST.

Na razie rozpoznawanie wersji Kickstartu nie działa. Drugi problem, to że pod WinUAE na Kickstarcie 1.3, po naciśnięciu przycisku myszki na ramce programu, dyskietka powoduje Guru 00000004. Nie mam pojęcia dlaczego, bo na innych Kickstartach normalnie uruchamia się CLI.

Ostatnia aktualizacja: 02.04.2017 19:12:51 przez RomanWorkshop
[#52] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #51

Coś mnie się ten pliczek nie ściąga.
[#53] Re: Sprawdzanie modelu procesora 680x0

@Risc, post #52

Mi wszystko działa ze ściąganiem pliku, spróbuj inną przeglądarką. Dodałem rozpoznawanie wersji Kickstartu i program już działa tak, jak powinien.

Na wcześniejsze moje pytania odpowiedział Toni Wilen:

1. Kickstart 1.3+ powinien być zawsze dostępny pod adresem $F80000, ale nie musi to być ten sam Kickstart, z którego aktualnie korzysta Amiga. Jeśli w Amidze jest zainstalowany Kickstart o rozmiarze 1MB, to pod adresem $F80000 znajduje się tylko jego druga połowa.

2. Problem z zawieszaniem się programu pod Kickstartem 1.3, został rozwiązany przez zapamiętanie wartości rejestrów A2-A6/D2-D7 na stosie i ich przywrócenie, tuż przed wyjściem z kodu bootbloku. Coś w starej wersji systemu AmigaOS 1.3 (pisanego w BCPL) zakłada, że pewne rejestry nie zmieniają swojej wartości, a mój kod je modyfikuje.

Ostatnia aktualizacja: 03.04.2017 21:39:04 przez RomanWorkshop
[#54] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #53

Poprawiłem kod sprawdzający wersję Kickstartu. Teraz wersje starsze niż 1.2 zostaną rozpoznane jako "Kickstart 1.x (xx.x)". Kickstart 3.5 (40.71) zostanie rozpoznany jako "Kickstart 3.1 (40.71)". Kickstarty nowsze niż 3.1 (40.72), zostaną rozpoznane jako "Kickstart 3.x".
[#55] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #54

Program teraz powinien działać na każdej Amidze ze stacją dyskietek lub jej emulatorem. Kod źródłowy i obraz ADF można pobrać ze strony: link.
[#56] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #55

Dodałem wyświetlanie ilości wolnej pamięci CHIP i FAST, wyrażonej w "kB".
[#57] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #56

Przyszedł czas na nową, poprawioną i zoptymalizowaną o 24 bajty wersję BasicDiag 1.06 (964 bajty). Strona projektu: link.

* Zmieniłem procedurę rozpoznawania Kickstartu - teraz adres startowy $FC0000/$F80000 Kickstartu 256/512kB jest obliczany (zamiast stałego $F80000). Najstarsze Kickstarty 0.7/1.0/1.1 zostaną rozpoznane jako "1.x ()", natomiast nowsze (43+) jako "3.x (vv.rr)" z wersją i rewizją podaną w nawiasie. Kickstart 1.2.1 (34.4) zostanie rozpoznany jako "1.3 (34.4)", a Kickstart 3.5 (40.71) jako "3.1 (40.71)".
Wyświetlona wersja Kickstartu może nie być tą, która jest aktualnie używana przez system Amigi. Zwłaszcza, jeśli Kickstart został załadowany (relokowany/remapowany) do pamięci RAM przez program (np. ReKick, SKick), funkcję maprom/fastrom karty turbo lub jednostkę zarządzania pamięcią (MMU).

* Zwiększyłem maksymalną wyświetlaną ilość wolnej pamięci CHIP/FAST do 4194303 kB (zmieniłem też procedurę konwersji 32-bitów do systemu DEC-ASCII na procedurę 24-bitową, która jest znacznie mniejsza).

Ponadto napisałem program diagnostyczny ChkAll 1.0, który łączy wszystkie opracowane do tej pory małe programiki z serii "Chkxxx". Jest to odpowiednik programu BasicDiag, ale uruchamiany z poziomu systemu (ikona/CLI). Różni się tym, że ma bardziej rozbudowaną procedurę rozpoznawania wersji Kickstartu oraz wyświetla ilość całej dostępnej (zamontowanej) pamięci CHIP/FAST (zamiast aktualnie wolnej). Strona projektu: link, Aminet: link.

Zachęcam do testowania i zgłaszania ewentualnych błędów w tym temacie, przez prywatne wiadomości lub e-mail.

Ostatnia aktualizacja: 07.06.2025 20:25:49 przez RomanWorkshop
3
[#58] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #57

Zrobiłem nowe wersje programów BasicDiag 1.07 i ChkAll 1.01 z drobnymi poprawkami w kodzie. Teraz program ChkAll wyłącza wielozadaniowość (multitasking) podczas sprawdzania konfiguracji Amigi.

Do prawidłowego działania oba programy wymagają Kickstartu 1.1 (31.34) lub nowszego, ponieważ używają bitu nr 0 (AFB_68010) z flag AttnFlags biblioteki Exec do ustalenia, czy zainstalowany procesor to 68000 lub 68010+. Na starszych Kickstartach 0.7/1.0 programy zadziałają tylko, gdy rejestr VBR=0 dla procesorów 68010+, ale każdy procesor zostanie wykryty jako "68000", a FPU w procesorze 68060 nie zostanie wykryty (napis "NONE"), jeśli jest programowo wyłączony (bit DFP=1 w rejestrze PCR). Wynika to z tego, że te Kickstarty nie rozpoznają procesorów innych niż 68000 (bit AFB_68010 ma zawsze wartość 0).
[#59] Re: Sprawdzanie modelu procesora 680x0

@RomanWorkshop, post #58

Nie wiem, ile masz tam wolnego miejsca na ta procedure, ale mi osobiscie podoba sie sposob ross-a na rozpoznawanie CPU.

link

To co uzywasz to jest raczej odczyt tego co kickstart rozpozna a nie tego co jest w rzeczywistosci zainstalowane.
Tak mi sie przynajmniej wydaje.
Bodaj Thor twierdzil, ze kickstarty do 1.3 nie rozpoznaja procesora wyzszego niz 68020.
[#60] Re: Sprawdzanie modelu procesora 680x0

@Don_Adan, post #59

W bootblocku BasicDiag zostało wolnych 60 bajtów. Podlinkowany sposób podobnie jak detekcja w Kickstarcie 3.1, sprawdza właściwości bitów rejestru CACR, które są inne w poszczególnych modelach procesorów 68020+. Tego sposobu nie studiowałem, ale musi być skuteczny skoro system z niego korzysta i da się nawet wykryć procesor 68060.

Ja wykorzystuję tylko jeden bit 0 (AFB_68010) z AttnFlags Kickstartu, żeby ustalić czy program działa na 68000 lub 68010+, ale to też można wyeliminować i wtedy program (w następnej wersji) będzie całkowicie niezależny od systemu. Według moich informacji Kickstart 1.1 rozpoznaje procesory 68010, a Kickstart 1.2 także 68020. Sprawdziłem to pod emulatorem WinUAE i tak właśnie jest.

Reszta detekcji opiera się na podmianie adresów wektorów wyjątków procesora i wykonywaniu kolejnych instrukcji obsługiwanych przez wszystkie nowsze modele CPU, aż któraś spowoduje wystąpienie wyjątku, co oznacza wykrycie zainstalowanego modelu. Podobnie wygląda detekcja FPU, ale konkretny model jest rozpoznawany przez rozmiar ramki ze stanem FPU, odłożonej na stosie przez instrukcję FSAVE.
Te sposoby detekcji opracowałem na podstawie dokumentacji procesorów 680x0 i koprocesorów matematycznych. Wszystko działa pod emulatorem WinUAE, miałem też kilka raportów od użytkowników różnych procesorów, którzy testowali moje programiki Chkxxx. Oczywiście są potrzebne kolejne testy na prawdziwym sprzęcie, ale w teorii wszystko powinno działać.

Ostatnia aktualizacja: 14.06.2025 23:07:11 przez RomanWorkshop
1
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem