![]() |
Różne procedury | Kompilacja |
| ARGUMENTY WEJŚCIOWE | WYJŚCIE DANYCH | ||
| LenStr | Liczenie znaków w ciągu ASCIIZ | textbuf | D1.l |
| DelZero | Usuwanie zbędnych zer z wartości ASCIIZ | textbuf | textbuf |
| ClrZero | Zamienianie zbędnych zer w wartości ASCIIZ na spacje | textbuf | textbuf |
| CPUmodel | Generowanie ciągu ASCIIZ z modelem procesora (680x0) | - | textbuf |
| FPUmodel | Generowanie ciągu ASCIIZ z modelem koprocesora (6888x) | - | textbuf |
| RegCCR | Generowanie ciągu ASCIIZ z wartościami flag rejestru CCR | CCR | textbuf |
LenStr: lea textbuf,A0 ;adres wejścia danych
moveq #$FF,D1
LenStr0: addq.l #1,D1 ;liczba znaków (maks. 4294967295)
tst.b (A0)+
bne.s LenStr0
rts
;Rozmiar: 16 B, linii kodu: 6
LenStr: lea textbuf,A0 ;adres wejścia danych
move.l A0,D1
LenStr0: tst.b (A0)+
bne.s LenStr0
subq.l #1,A0
sub.l D1,A0
move.l A0,D1 ;liczba znaków (maks. 4294967295)
rts
;Rozmiar: 20 B, linii kodu: 8
DelZero: lea textbuf,A0 ;adres wejścia/wyjścia danych
move.l A0,A1
DelZero0: tst.b (A1)
beq.s DelZero3
cmp.b #$30,(A1)+
beq.s DelZero0
subq.l #1,A1
cmp.l A0,A1
beq.s DelZero2
DelZero1: move.b (A1)+,(A0)+
bne.s DelZero1
DelZero2: rts
DelZero3: clr.b $01(A0)
rts
;Rozmiar: 36 B, linii kodu: 14
ClrZero: lea textbuf,A0 ;adres wejścia/wyjścia danych
moveq #$30,D1
ClrZero0: cmp.b (A0),D1
beq.s ClrZero1
rts
ClrZero1: move.b #$20,(A0)+ ;znak spacji
tst.b (A0)
bne.s ClrZero0
move.b D1,-(A0)
rts
;Rozmiar: 26 B, linii kodu: 10
CPUmodel:
;Zakładam, że w tym miejscu procesor pracuje w trybie nadzorcy (Supervisor mode).
;Każdy procesor 680x0 pracuje w tym trybie, zaraz po włączeniu/resecie systemu.
;Ta procedura jest dedykowana do własnych systemów, opartych o procesory 680x0.
moveq #$30,D1 ;procesor 68000
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 CPUmodel1(pc),A0
move.l A0,(A1) ;zmiana wektora wyjątku nr 4 (prawidłowego tylko dla 68000)
move.l A7,A3 ;zapamiętanie wskaźnika stosu (A7=SSP)
dc.l $4E7A3801 ;MOVEC VBR,D3 - instrukcja przenosi wartość rejestru VBR do rejestru D3.
;Tylko na procesorze 68000 powoduje wystąpienie wyjątku nr 4.
;W tym miejscu procesor to 68010 lub nowszy
move.l D2,(A1) ;przywrócenie wektora wyjątku nr 4 (prawidłowego tylko dla 68000)
add.l D3,A1
move.l (A1),D2 ;wektor wyjątku nr 4 (prawidłowy dla 68010+)
lea CPUmodel3(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 CPUmodel0(pc),A0
move.l A0,(A2) ;zmiana wektora wyjątku nr 11
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
CPUmodel0: ;kod obsługi wyjątku nr 11 (tylko dla 68020)
move.l D3,(A2) ;przywrócenie wektora wyjątku nr 11
CPUmodel1: ;kod obsługi wyjątku nr 4 (tylko dla 68000)
move.l D2,(A1) ;przywrócenie wektora wyjątku nr 4
move.l A3,A7 ;przywrócenie wskaźnika stosu (A7=SSP)
lea textbuf,A0 ;adres wyjścia danych
lea CPUmodel4(pc),A1
move.b D1,3(A1) ;wartość określa model procesora: $30-$36=68000-68060
CPUmodel2:
move.b (A1)+,(A0)+
bne.s CPUmodel2
rts
CPUmodel3: ;kod obsługi wyjątku nr 4
cmp.b #$32,D1
bne.s CPUmodel0
;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 CPUmodel0
CPUmodel4:
dc.b "680x0",0
;Rozmiar: 114 B, linii kodu: 41
FPUmodel:
;Zakładam, że w tym miejscu procesor pracuje w trybie nadzorcy (Supervisor mode).
;Każdy procesor 680x0 pracuje w tym trybie, zaraz po włączeniu/resecie systemu.
;Ta procedura jest dedykowana do własnych systemów, opartych o procesory 680x0.
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 FPUmodel0(pc),A0
move.l A0,(A1) ;zmiana wektora wyjątku nr 4 (prawidłowego tylko dla 68000)
moveq #$2C,D3
move.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
;(prawidłowy tylko dla 68000).
lea FPUmodel1(pc),A4
move.l A4,(A2) ;zmiana wektora wyjątku nr 11 (prawidłowego tylko dla 68000)
move.l A7,A3 ;zapamiętanie wskaźnika stosu (A7=SSP)
dc.l $4E7A1801 ;MOVEC VBR,D1 - instrukcja przenosi wartość rejestru VBR do rejestru D1.
;Tylko na procesorze 68000 powoduje wystąpienie wyjątku nr 4.
;W tym miejscu procesor to 68010 lub nowszy
move.l D2,(A1) ;przywrócenie wektora wyjątku nr 4 (prawidłowego tylko dla 68000)
move.l D3,(A2) ;przywrócenie wektora wyjątku nr 11 (prawidłowego tylko dla 68000)
add.l D1,A1
add.l D1,A2
move.l (A1),D2 ;wektor wyjątku nr 4 (prawidłowy dla 68010+)
move.l (A2),D3 ;wektor wyjątku nr 11 (prawidłowy dla 68010+)
move.l A0,(A1) ;zmiana wektora wyjątku nr 4
move.l A4,(A2) ;zmiana wektora wyjątku nr 11
FPUmodel0: ;kod obsługi wyjątku nr 4 (tylko dla 68000)
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 A3,D4
sub.l A7,D4 ;rozmiar ramki odłożonej przez instrukcję FSAVE
moveq #5,D1 ;koprocesor 68881
cmp.b #$1C,D4 ;ramka IDLE
beq.s FPUmodel1
moveq #11,D1 ;koprocesor 68882
cmp.b #$3C,D4 ;ramka IDLE
beq.s FPUmodel1
moveq #17,D1 ;koprocesor wbudowany w 68040
cmp.b #4,D4 ;ramka IDLE
beq.s FPUmodel1
moveq #23,D1 ;koprocesor wbudowany w 68060
FPUmodel1: ;kod obsługi wyjątku nr 11 (tylko jeśli nie ma FPU)
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)
lea textbuf,A0 ;adres wyjścia danych
lea FPUmodel3(pc),A1
add.l D1,A1 ;wartość określa model FPU: 0=brak, 5=68881, 11=68882, 17=68040, 23=68060
FPUmodel2:
move.b (A1)+,(A0)+
bne.s FPUmodel2
rts
FPUmodel3:
dc.b "NONE",0,"68881",0,"68882",0,"IN040",0,"IN060",0
;Rozmiar: 138 B, linii kodu: 45
RegCCR:
;Zakładam, że w tym miejscu procesor 680x0 pracuje w dowolnym trybie (użytkownika lub nadzorcy)
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 RegCCR4(pc),A0
move.l A0,(A1) ;zmiana wektora wyjątku nr 4 (prawidłowego tylko dla 68000)
;Procedura generuje wartości flag rejestru CCR, jakie mają one w tym miejscu
dc.w $42C1 ;MOVE CCR,D1 - instrukcja przenosi wartość rejestru CCR do rejestru D1.
;Tylko na procesorze 68000 powoduje wystąpienie wyjątku nr 4.
;W tym miejscu procesor to 68010 lub nowszy
RegCCR0:
move.l D2,(A1) ;przywrócenie wektora wyjątku nr 4 (prawidłowego tylko dla 68000)
moveq #$07,D2
lea textbuf,A0 ;adres wyjścia danych
lea RegCCR3(pc),A1
RegCCR1:
move.b (A1)+,(A0)+
move.b #$3A,(A0)+
moveq #$30,D3
btst D2,D1
beq.s RegCCR2
addq.b #1,D3
RegCCR2:
move.b D3,(A0)+
move.b #$20,(A0)+
dbf D2,RegCCR1
clr.b -(A0)
rts
RegCCR3:
dc.b "---XNZVC"
RegCCR4: ;kod obsługi wyjątku nr 4 (tylko dla 68000)
;W tym miejscu procesor 68000 zawsze pracuje w trybie nadzorcy (Supervisor mode) i korzysta
;z oddzielnego stosu oraz jego wskaźnika (rejestr A7=SSP). Na stosie tym znajdują się odłożone
;wartości rejestrów SR i PC, jakie miały one przed wystąpieniem wyjątku.
move.w (A7),D1 ;wartość rejestru SR ze stosu (młodszy bajt to rejestr CCR)
lea RegCCR0(pc),A0
move.l A0,$02(A7) ;modyfikacja wartości rejestru PC na stosie
rte ;powrót z wyjątku
;Po wykonaniu instrukcji RTE wartości rejestrów SR i PC, są przywracane ze stosu.
;Jeśli przed wystąpieniem wyjątku procesor 68000 pracował w trybie użytkownika
;(User mode), to przywrócony rejestr SR wyłącza tryb nadzorcy (Supervisor mode).
;Przywrócony rejestr PC zawiera adres kodu, który zostanie wykonany po powrocie z wyjątku.
;Rozmiar: 76 B, linii kodu: 26