Asembler procesora 68000 Działa w systemie Workbench     ChkCPU           Kompilacja


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.