Poniżej znajduje się kod źródłowy programu ChkCPU, który sprawdza i wyświetla model procesora
z rodziny 680x0, zainstalowanego w Amidze. Rozpoznaje następujące procesory: 68000, 68010,
68020 (68EC020), 68030 (68EC030), 68040 (68EC040, 68LC040), 68060 (68EC060, 68LC060).
Program działa w systemie Workbench 1.2 lub nowszym. Można go uruchomić przez dwukrotne
kliknięcie jego ikony lub wpisując jego nazwę w CLI.
ChkCPU:
;Zakładam, że w tym miejscu procesor pracuje w trybie użytkownika (User mode).
;Każdy procesor 680x0 pracuje w tym trybie, po uruchomieniu programu na Workbenchu.
;Program sprawdza i wyświetla model procesora 680x0, zainstalowanego w Amidze.
;Działa w systemie 1.2 lub nowszym i można go uruchomić przez ikonę lub z CLI.
moveq #$30,D1 ;procesor 68000
move.l 4.w,A6 ;adres bazowy biblioteki Exec
btst #0,297(A6) ;wartość bitu określa procesor: 0=68000, 1=68010 lub nowszy (bit ten wchodzi
;w skład flag AttnFlags, wypełnianych przez bibliotekę 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) ;przełącza procesor w tryb nadzorcy i wykonuje procedurę (funkcja Exec:Supervisor)
ChkCPU0:
lea ChkCPU4(pc),A0
move.l A0,D2 ;adres danych do wyświetlenia w CLI
move.b D1,8(A0) ;wartość określa model procesora: $30-$36=68000-68060
lea ChkCPU5(pc),A1 ;nazwa biblioteki DOS
jsr -408(A6) ;otwiera bibliotekę DOS (funkcja Exec:OldOpenLibrary)
move.l D0,A6 ;adres bazowy biblioteki DOS
jsr -60(A6) ;zwraca uchwyt okna CLI do wyświetlania danych. Jeśli 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 wyświetlenia w CLI
jsr -48(A6) ;wyświetla 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 bibliotekę DOS (funkcja Exec:CloseLibrary)
rts
ChkCPU1: ;procedura wykonywana przez funkcję Exec:Supervisor
dc.l $4E7A3801 ;MOVEC VBR,D3 - instrukcja przenosi wartość rejestru VBR do rejestru D3.
;Jest obsługiwana przez procesory 68010/20/30/40/60.
moveq #$10,D2
move.l D2,A1
add.l D3,A1
move.l (A1),D2 ;wektor wyjątku nr 4 (Illegal Instruction), który wystąpi
;gdy procesor natrafi na kod nieobsługiwanej instrukcji.
lea ChkCPU3(pc),A0
move.l A0,(A1) ;zmiana wektora wyjątku nr 4
move.l D3,A2
moveq #$2C,D3
add.l D3,A2
move.l (A2),D3 ;wektor wyjątku nr 11 (Line 1111 Emulator), który wystąpi gdy procesor
;natrafi na kod nieobsługiwanej instrukcji, rozpoczynający się słowem $Fnnn.
lea ChkCPU2(pc),A0
move.l A0,(A2) ;zmiana wektora wyjątku nr 11
move.l A7,A3 ;zapamiętanie wskaźnika stosu (A7=SSP)
moveq #$31,D1 ;procesor 68010
dc.l $4E7A1002 ;MOVEC CACR,D1 - instrukcja obsługiwana przez 68020/30/40/60
moveq #$32,D1 ;procesor 68020/68030
dc.l $4E7A1004 ;MOVEC ITT0,D1 - instrukcja obsługiwana przez 68040/60.
;Przenosi wartość rejestru ITT0 (68040, 68LC040, 68060,
;68EC060, 68LC060)/IACR0 (68EC040) do rejestru D1.
moveq #$34,D1 ;procesor 68040
dc.l $4E7A1808 ;MOVEC PCR,D1 - instrukcja obsługiwana przez 68060
moveq #$36,D1 ;procesor 68060
ChkCPU2: ;kod obsługi wyjątku nr 11 (tylko dla 68020)
move.l D2,(A1) ;przywrócenie wektora wyjątku nr 4
move.l D3,(A2) ;przywrócenie wektora wyjątku nr 11
move.l A3,A7 ;przywrócenie wskaźnika stosu (A7=SSP)
rte ;powrót z funkcji Exec:Supervisor
ChkCPU3: ;kod obsługi wyjątku nr 4
cmp.b #$32,D1
bne.s ChkCPU2
;Rozpoznawanie procesora 68020/68030
dc.w $F02F,$6200,$FFFE ;PMOVE.W PSR,-2(A7) - instrukcja odkłada na stos (A7=SSP)
;wartość rejestru MMUSR (68030)/ACUSR (68EC030).
;Na procesorze 68020 powoduje wystąpienie wyjątku nr 11.
moveq #$33,D1 ;procesor 68030
bra.s ChkCPU2
ChkCPU4:
dc.b "CPU: 680x0",10
ChkCPU5:
dc.b "dos.library",0
;Rozmiar: 168 B, linii kodu: 52
Po kompilacji tego kodu, rozmiar programu wykonywalnego wynosi 204 B.