Asembler procesora 68000 Działa w systemie Workbench     ChkFPU           Kompilacja


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.