http://romanworkshop.blutu.pl/asm68/chkcpu.htm Asembler procesora 68000 Dziala w systemie Workbench ChkCPU Kompilacja Ponizej znajduje sie kod zródlowy programu ChkCPU, który sprawdza i wyswietla model procesora z rodziny 680x0, zainstalowanego w Amidze. Rozpoznaje nastepujace procesory: 68000, 68010, 68020 (68EC020), 68030 (68EC030), 68040 (68EC040, 68LC040), 68060 (68EC060, 68LC060). Program dziala w systemie Workbench 1.2 lub nowszym. Mozna go uruchomic przez dwukrotne klikniecie jego ikony lub wpisujac jego nazwe w CLI. ChkCPU: ;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 sprawdza i wyswietla model procesora 680x0, zainstalowanego w Amidze. ;Dziala w systemie 1.2 lub nowszym i mozna go uruchomic przez ikone lub z CLI. moveq #$30,D1 ;procesor 68000 move.l 4.w,A6 ;adres bazowy biblioteki Exec 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 ChkCPU0 ;procesor 68000 ;W tym miejscu procesor to 68010 lub nowszy lea ChkCPU1(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) ChkCPU0: lea ChkCPU4(pc),A0 move.l A0,D2 ;adres danych do wyswietlenia w CLI move.b D1,8(A0) ;wartosc okresla model procesora: $30-$36=68000-68060 moveq #0,D0 lea ChkCPU5(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 moveq #11,D3 ;liczba bajtów do wyswietlenia w 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 ChkCPU1: ;procedura wykonywana przez funkcje Exec:Supervisor dc.l $4E7A3801 ;MOVEC VBR,D3 - instrukcja przenosi wartosc rejestru VBR do rejestru D3. ;Jest obslugiwana przez procesory 68010/20/30/40/60. moveq #$10,D2 move.l D2,A1 add.l D3,A1 move.l (A1),D2 ;wektor wyjatku nr 4 (Illegal Instruction), który wystapi ;gdy procesor natrafi na kod nieobslugiwanej instrukcji. lea ChkCPU3(pc),A0 move.l A0,(A1) ;zmiana wektora wyjatku nr 4 move.l D3,A2 moveq #$2C,D3 add.l D3,A2 move.l (A2),D3 ;wektor wyjatku nr 11 (Line 1111 Emulator), który wystapi gdy procesor ;natrafi na kod nieobslugiwanej instrukcji, rozpoczynajacy sie slowem $Fnnn. lea ChkCPU2(pc),A0 move.l A0,(A2) ;zmiana wektora wyjatku nr 11 move.l A7,A3 ;zapamietanie wskaznika stosu (A7=SSP) moveq #$31,D1 ;procesor 68010 dc.l $4E7A1002 ;MOVEC CACR,D1 - instrukcja obslugiwana przez 68020/30/40/60 moveq #$32,D1 ;procesor 68020/68030 dc.l $4E7A1004 ;MOVEC ITT0,D1 - instrukcja obslugiwana przez 68040/60. ;Przenosi wartosc rejestru ITT0 (68040, 68LC040, 68060, ;68EC060, 68LC060)/IACR0 (68EC040) do rejestru D1. moveq #$34,D1 ;procesor 68040 dc.l $4E7A1808 ;MOVEC PCR,D1 - instrukcja obslugiwana przez 68060 moveq #$36,D1 ;procesor 68060 ChkCPU2: ;kod obslugi wyjatku nr 11 (tylko dla 68020) move.l D2,(A1) ;przywrócenie wektora wyjatku nr 4 move.l D3,(A2) ;przywrócenie wektora wyjatku nr 11 move.l A3,A7 ;przywrócenie wskaznika stosu (A7=SSP) rte ;powrót z funkcji Exec:Supervisor ChkCPU3: ;kod obslugi wyjatku nr 4 cmp.b #$32,D1 bne.s ChkCPU2 ;Rozpoznawanie procesora 68020/68030 dc.w $F02F,$6200,$FFFE ;PMOVE.W PSR,-2(A7) - instrukcja odklada na stos (A7=SSP) ;wartosc rejestru MMUSR (68030)/ACUSR (68EC030). ;Na procesorze 68020 powoduje wystapienie wyjatku nr 11. moveq #$33,D1 ;procesor 68030 bra.s ChkCPU2 ChkCPU4: dc.b "CPU: 680x0",10 ChkCPU5: dc.b "dos.library",0 ;Rozmiar: 170 B, linii kodu: 53 Po kompilacji tego kodu, rozmiar programu wykonywalnego wynosi 208 B.