Asembler procesora 68000 Działa w systemie Workbench     Chk060           Kompilacja


Poniżej znajduje się kod źródłowy programu Chk060, który sprawdza obecność procesora 68060
w Amidze i w razie jego wykrycia, wyświetla szczegółowe informacje o nim: wersję ("68060" - pełna,
"xx060" - EC/LC), rewizję ("rev X") oraz wartość rejestru PCR (Processor Configuration Register).
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.

Procesory 68060 mogą mieć następujące wartości rejestru PCR:

$0430RRxx - pełna wersja 68060 (zawiera FPU i MMU)
$0431RRxx - wersja EC (bez FPU i MMU) lub LC (bez FPU)

RR - bajt z rewizją procesora (np. $01 = rev. 1, $06 = rev. 6)

Chk060:
;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 wyświetla informacje o procesorze 68060, zainstalowanym 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      Chk060a(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      Chk060k(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
 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

Chk060a:             ;procedura wykonywana przez funkcję Exec:Supervisor
 moveq    #$10,D2
 move.l   D2,A1
 move.l   (A1),D2    ;wektor wyjątku nr 4 (Illegal Instruction), który wystąpi gdy procesor
                     ;natrafi na kod nieobsługiwanej instrukcji (prawidłowy tylko dla 68000).
 lea      Chk060g(pc),A0
 move.l   A0,(A1)    ;zmiana wektora wyjątku nr 4 (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    Chk060b    ;procesor 68000

;W tym miejscu procesor to 68010 lub nowszy

 move.l   D2,(A1)    ;przywrócenie wektora wyjątku nr 4 (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 4 (prawidłowy dla 68010+)
 move.l   A0,(A1)    ;zmiana wektora wyjątku nr 4
Chk060b:
 dc.l     $4E7A1808  ;MOVEC PCR,D1 - instrukcja przenosi wartość rejestru PCR do rejestru D1.
                     ;Na procesorze innym niż 68060 powoduje wystąpienie wyjątku nr 4.

;Konwersja 4-bajtów z rejestru D1 do systemu HEX-ASCII
 lea      Chk060j(pc),A0 ;adres wyjścia danych
 moveq    #$07,D4
Chk060c:
 rol.l    #4,D1      ;dane do konwersji
 move.b   D1,D3
 lsl.b    #4,D3
 addq.b   #3,D3
 rol.b    #4,D3
 cmp.b    #$3A,D3
 bcs.s    Chk060d
 addq.b   #7,D3
Chk060d:
 move.b   D3,(A0)+
 dbf      D4,Chk060c

 lea      Chk060i(pc),A0
 move.w   D1,D3
 ror.w    #8,D3
 add.b    #$30,D3
 move.b   D3,16(A0)  ;numer rewizji procesora
 btst     #16,D1     ;wartość bitu określa wersję procesora: 0=68060, 1=68EC060/68LC060
 beq.s    Chk060e    ;procesor 68060 w pełnej wersji
 move.w   #"xx",5(A0) ;procesor 68060 w wersji EC/LC (bez FPU)
Chk060e:
 moveq    #34,D3     ;liczba bajtów do wyświetlenia w CLI
Chk060f:
 move.l   D2,(A1)    ;przywrócenie wektora wyjątku nr 4
 move.l   A2,A7      ;przywrócenie wskaźnika stosu (A7=SSP)
 move.l   A0,D2      ;adres danych do wyświetlenia w CLI
 rte                 ;powrót z funkcji Exec:Supervisor

Chk060g:             ;kod obsługi wyjątku nr 4
 lea      Chk060h(pc),A0
 moveq    #16,D3     ;liczba bajtów do wyświetlenia w CLI
 bra.s    Chk060f

Chk060h:
 dc.b     "68060 not found",10
Chk060i:
 dc.b     "CPU: 68060 (rev x)",10,"PCR: $"
Chk060j:
 dc.b     "xxxxxxxx",10
Chk060k:
 dc.b     "dos.library",0

;Rozmiar: 220 B, linii kodu: 59
Po kompilacji tego kodu, rozmiar programu wykonywalnego wynosi 256 B.