Poniżej znajduje się kod źródłowy programu ChkFPU, który sprawdza i wyświetla model koproce-
sora matematycznego (FPU) z rodziny 6888x, zainstalowanego w Amidze. Rozpoznaje następujące
koprocesory: zewnętrzny 68881 i 68882 oraz wewnętrzny, wbudowany w procesor 68040 i 68060.
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.
ChkFPU:
;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 koprocesora 6888x, zainstalowanego w Amidze.
;Działa w systemie 1.2 lub nowszym i można go uruchomić przez ikonę lub z CLI.
move.l 4.w,A6 ;adres bazowy biblioteki Exec
lea ChkFPU0(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)
lea ChkFPU6(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
ChkFPU0: ;procedura wykonywana przez funkcję Exec:Supervisor
moveq #$2C,D2
move.l D2,A1
move.l (A1),D2 ;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
;(prawidłowy tylko dla 68000).
lea ChkFPU2(pc),A0
move.l A0,(A1) ;zmiana wektora wyjątku nr 11 (prawidłowego tylko dla 68000)
move.l A7,A2 ;zapamiętanie wskaźnika stosu (A7=SSP)
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 ChkFPU1 ;procesor 68000
;W tym miejscu procesor to 68010 lub nowszy
move.l D2,(A1) ;przywrócenie wektora wyjątku nr 11 (prawidłowego tylko dla 68000)
dc.l $4E7A3801 ;MOVEC VBR,D3 - instrukcja przenosi wartość rejestru VBR do rejestru D3.
;Jest obsługiwana przez procesory 68010/20/30/40/60.
add.l D3,A1
move.l (A1),D2 ;wektor wyjątku nr 11 (prawidłowy dla 68010+)
move.l A0,(A1) ;zmiana wektora wyjątku nr 11
ChkFPU1:
moveq #0,D1 ;brak koprocesora
dc.l $F201583A ;FTST.B D1 - instrukcja testuje najmłodszy bajt w rejestrze D1 procesora
;(zapobiega wygenerowaniu ramki NULL przez instrukcję FSAVE).
;Jeśli nie ma zainstalowanego FPU, powoduje wystąpienie wyjątku nr 11.
dc.w $F327 ;FSAVE -(A7) - instrukcja odkłada na stos (A7=SSP) ramkę ze stanem FPU
move.l A2,D3
sub.l A7,D3 ;rozmiar ramki odłożonej przez instrukcję FSAVE
moveq #5,D1 ;koprocesor 68881
cmp.b #$1C,D3 ;ramka IDLE
beq.s ChkFPU2
moveq #11,D1 ;koprocesor 68882
cmp.b #$3C,D3 ;ramka IDLE
beq.s ChkFPU2
moveq #17,D1 ;koprocesor wbudowany w 68040
cmp.b #4,D3 ;ramka IDLE
beq.s ChkFPU2
moveq #23,D1 ;koprocesor wbudowany w 68060
ChkFPU2: ;kod obsługi wyjątku nr 11 (tylko jeśli nie ma FPU)
move.l D2,(A1) ;przywrócenie wektora wyjątku nr 11
move.l A2,A7 ;przywrócenie wskaźnika stosu (A7=SSP)
lea ChkFPU4(pc),A0
lea ChkFPU5(pc),A1
move.l A0,D2 ;adres danych do wyświetlenia w CLI
addq.l #5,A0
add.l D1,A1 ;wartość określa model FPU: 0=brak, 5=68881, 11=68882, 17=68040, 23=68060
ChkFPU3:
move.b (A1)+,(A0)+
tst.b (A1)
bne.s ChkFPU3
rte ;powrót z funkcji Exec:Supervisor
ChkFPU4:
dc.b "FPU: xxxx ",10
ChkFPU5:
dc.b "NONE",0,"68881",0,"68882",0,"IN040",0,"IN060",0
ChkFPU6:
dc.b "dos.library",0
;Rozmiar: 196 B, linii kodu: 56
Po kompilacji tego kodu, rozmiar programu wykonywalnego wynosi 232 B.