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