http://romanworkshop.blutu.pl/asm68/chk060.htm Asembler procesora 68000 Dziala w systemie Workbench Chk060 Kompilacja Ponizej znajduje sie kod zródlowy programu Chk060, który sprawdza obecnosc procesora 68060 w Amidze i w razie jego wykrycia, wyswietla szczególowe informacje o nim: wersje ("68060" - pelna, "xx060" - EC/LC), rewizje ("rev X") oraz wartosc rejestru PCR (Processor Configuration Register). Program dziala w systemie Workbench 1.2 lub nowszym. Mozna go uruchomic przez dwukrotne klikniecie jego ikony lub wpisujac jego nazwe w CLI. Procesory 68060 moga miec nastepujace wartosci rejestru PCR: $0430RRxx - pelna wersja 68060 (zawiera FPU i MMU) $0431RRxx - wersja EC (bez FPU i MMU) lub LC (bez FPU) RR - bajt z rewizja procesora (np. $01 = rev. 1, $06 = rev. 6) Chk060: ;Zakladam, ze w tym miejscu procesor pracuje w trybie uzytkownika (User mode). ;Kazdy procesor 680x0 pracuje w tym trybie, po uruchomieniu programu na Workbenchu. ;Program wyswietla informacje o procesorze 68060, zainstalowanym w Amidze. ;Dziala w systemie 1.2 lub nowszym i mozna go uruchomic przez ikone lub z CLI. move.l 4.w,A6 ;adres bazowy biblioteki Exec lea Chk060a(pc),A5 ;adres procedury, która zostanie wykonana w trybie nadzorcy jsr -30(A6) ;przelacza procesor w tryb nadzorcy i wykonuje procedure (funkcja Exec:Supervisor) moveq #0,D0 lea Chk060k(pc),A1 ;nazwa biblioteki DOS jsr -552(A6) ;otwiera biblioteke DOS (funkcja Exec:OpenLibrary) move.l D0,A6 ;adres bazowy biblioteki DOS jsr -60(A6) ;zwraca uchwyt okna CLI do wyswietlania danych. Jesli nie ma ;takiego okna, to jest ono otwierane (funkcja DOS:Output). move.l D0,D1 ;uchwyt okna CLI jsr -48(A6) ;wyswietla dane w CLI (funkcja DOS:Write) move.l A6,A1 ;adres bazowy biblioteki DOS move.l 4.w,A6 ;adres bazowy biblioteki Exec jsr -414(A6) ;zamyka biblioteke DOS (funkcja Exec:CloseLibrary) rts Chk060a: ;procedura wykonywana przez funkcje Exec:Supervisor moveq #$10,D2 move.l D2,A1 move.l (A1),D2 ;wektor wyjatku nr 4 (Illegal Instruction), który wystapi gdy procesor ;natrafi na kod nieobslugiwanej instrukcji (prawidlowy tylko dla 68000). lea Chk060g(pc),A0 move.l A0,(A1) ;zmiana wektora wyjatku nr 4 (prawidlowego tylko dla 68000) move.l A7,A2 ;zapamietanie wskaznika stosu (A7=SSP) btst #0,297(A6) ;wartosc bitu okresla procesor: 0=68000, 1=68010 lub nowszy (bit ten wchodzi ;w sklad flag AttnFlags, wypelnianych przez biblioteke Exec podczas startu Amigi). beq.s Chk060b ;procesor 68000 ;W tym miejscu procesor to 68010 lub nowszy move.l D2,(A1) ;przywrócenie wektora wyjatku nr 4 (prawidlowego tylko dla 68000) dc.l $4E7A3801 ;MOVEC VBR,D3 - instrukcja przenosi wartosc rejestru VBR do rejestru D3. ;Jest obslugiwana przez procesory 68010/20/30/40/60. add.l D3,A1 move.l (A1),D2 ;wektor wyjatku nr 4 (prawidlowy dla 68010+) move.l A0,(A1) ;zmiana wektora wyjatku nr 4 Chk060b: dc.l $4E7A1808 ;MOVEC PCR,D1 - instrukcja przenosi wartosc rejestru PCR do rejestru D1. ;Na procesorze innym niz 68060 powoduje wystapienie wyjatku nr 4. ;Konwersja 4-bajtów z rejestru D1 do systemu HEX-ASCII lea Chk060j(pc),A0 ;adres wyjscia danych moveq #$07,D4 Chk060c: rol.l #4,D1 ;dane do konwersji move.b D1,D3 lsl.b #4,D3 addq.b #3,D3 rol.b #4,D3 cmp.b #$3A,D3 bcs.s Chk060d addq.b #7,D3 Chk060d: move.b D3,(A0)+ dbf D4,Chk060c lea Chk060i(pc),A0 move.w D1,D3 ror.w #8,D3 add.b #$30,D3 move.b D3,16(A0) ;numer rewizji procesora btst #16,D1 ;wartosc bitu okresla wersje procesora: 0=68060, 1=68EC060/68LC060 beq.s Chk060e ;procesor 68060 w pelnej wersji move.w #"xx",5(A0) ;procesor 68060 w wersji EC/LC (bez FPU) Chk060e: moveq #34,D3 ;liczba bajtów do wyswietlenia w CLI Chk060f: move.l D2,(A1) ;przywrócenie wektora wyjatku nr 4 move.l A2,A7 ;przywrócenie wskaznika stosu (A7=SSP) move.l A0,D2 ;adres danych do wyswietlenia w CLI rte ;powrót z funkcji Exec:Supervisor Chk060g: ;kod obslugi wyjatku nr 4 lea Chk060h(pc),A0 moveq #16,D3 ;liczba bajtów do wyswietlenia w CLI bra.s Chk060f Chk060h: dc.b "68060 not found",10 Chk060i: dc.b "CPU: 68060 (rev x)",10,"PCR: $" Chk060j: dc.b "xxxxxxxx",10 Chk060k: dc.b "dos.library",0 ;Rozmiar: 222 B, linii kodu: 60 Po kompilacji tego kodu, rozmiar programu wykonywalnego wynosi 260 B.