http://romanworkshop.blutu.pl/asm68/chkfpu.htm Asembler procesora 68000 Dziala w systemie Workbench ChkFPU Kompilacja Ponizej znajduje sie kod zródlowy programu ChkFPU, który sprawdza i wyswietla model koproce- sora matematycznego (FPU) z rodziny 6888x, zainstalowanego w Amidze. Rozpoznaje nastepujace koprocesory: zewnetrzny 68881 i 68882 oraz wewnetrzny, wbudowany w procesor 68040 i 68060. Program dziala w systemie Workbench 1.2 lub nowszym. Mozna go uruchomic przez dwukrotne klikniecie jego ikony lub wpisujac jego nazwe w CLI. ChkFPU: ;Zakladam, ze w tym miejscu procesor pracuje w trybie uzytkownika (User mode). ;Kazdy procesor 680x0 pracuje w tym trybie, po uruchomieniu programu na Workbenchu. ;Program sprawdza i wyswietla model koprocesora 6888x, zainstalowanego w Amidze. ;Dziala w systemie 1.2 lub nowszym i mozna go uruchomic przez ikone 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) ;przelacza procesor w tryb nadzorcy i wykonuje procedure (funkcja Exec:Supervisor) moveq #0,D0 lea ChkFPU6(pc),A1 ;nazwa biblioteki DOS jsr -552(A6) ;otwiera biblioteke DOS (funkcja Exec:OpenLibrary) move.l D0,A6 ;adres bazowy biblioteki DOS jsr -60(A6) ;zwraca uchwyt okna CLI do wyswietlania danych. Jesli 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 wyswietlenia w CLI jsr -48(A6) ;wyswietla 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 biblioteke DOS (funkcja Exec:CloseLibrary) rts ChkFPU0: ;procedura wykonywana przez funkcje Exec:Supervisor moveq #$2C,D2 move.l D2,A1 move.l (A1),D2 ;wektor wyjatku nr 11 (Line 1111 Emulator), który wystapi gdy procesor ;natrafi na kod nieobslugiwanej instrukcji, rozpoczynajacy sie slowem $Fnnn ;(prawidlowy tylko dla 68000). lea ChkFPU2(pc),A0 move.l A0,(A1) ;zmiana wektora wyjatku nr 11 (prawidlowego tylko dla 68000) move.l A7,A2 ;zapamietanie wskaznika stosu (A7=SSP) btst #0,297(A6) ;wartosc bitu okresla procesor: 0=68000, 1=68010 lub nowszy (bit ten wchodzi ;w sklad flag AttnFlags, wypelnianych przez biblioteke Exec podczas startu Amigi). beq.s ChkFPU1 ;procesor 68000 ;W tym miejscu procesor to 68010 lub nowszy move.l D2,(A1) ;przywrócenie wektora wyjatku nr 11 (prawidlowego tylko dla 68000) dc.l $4E7A3801 ;MOVEC VBR,D3 - instrukcja przenosi wartosc rejestru VBR do rejestru D3. ;Jest obslugiwana przez procesory 68010/20/30/40/60. add.l D3,A1 move.l (A1),D2 ;wektor wyjatku nr 11 (prawidlowy dla 68010+) move.l A0,(A1) ;zmiana wektora wyjatku nr 11 ChkFPU1: moveq #0,D1 ;brak koprocesora dc.l $F201583A ;FTST.B D1 - instrukcja testuje najmlodszy bajt w rejestrze D1 procesora ;(zapobiega wygenerowaniu ramki NULL przez instrukcje FSAVE). ;Jesli nie ma zainstalowanego FPU, powoduje wystapienie wyjatku nr 11. dc.w $F327 ;FSAVE -(A7) - instrukcja odklada na stos (A7=SSP) ramke ze stanem FPU move.l A2,D3 sub.l A7,D3 ;rozmiar ramki odlozonej przez instrukcje 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 obslugi wyjatku nr 11 (tylko jesli nie ma FPU) move.l D2,(A1) ;przywrócenie wektora wyjatku nr 11 move.l A2,A7 ;przywrócenie wskaznika stosu (A7=SSP) lea ChkFPU4(pc),A0 lea ChkFPU5(pc),A1 move.l A0,D2 ;adres danych do wyswietlenia w CLI addq.l #5,A0 add.l D1,A1 ;wartosc okresla 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: 198 B, linii kodu: 57 Po kompilacji tego kodu, rozmiar programu wykonywalnego wynosi 236 B.