486 CPU identifizieren
486 CPU identifizieren
Hallo,
ich habe in einem großen Computerteilepaket eine 486er CPU mit aufgeklebtem Kühlkörper bekommen, der sich nicht entfernen lässt. Da ich gerne wissen will, was sich darunter verbirgt, habe ich jetzt bei Ebay zugeschlagen und günstig ein neuwertiges 486 Baby-AT-Board von MITAC gekauft.
Wie taste ich mich jetzt am besten an das Problem heran? Jumpere ich zuerst die niedrigste Taktfrequenz und schaue, was passiert?! Mit welchem DOS-Programm kann ich die CPU zweifelsfrei identifizieren?
Edit: Ich habe das ganze jetzt angeschlossen. Beim Bootvorgang meldet er sich als 486SX2 at 66 Mhz. Das tut er unabhängig davon, ob ich DX oder SX-CPU auf dem Board gejumpert habe. Ist diese Angabe vertrauenswürdig?
ich habe in einem großen Computerteilepaket eine 486er CPU mit aufgeklebtem Kühlkörper bekommen, der sich nicht entfernen lässt. Da ich gerne wissen will, was sich darunter verbirgt, habe ich jetzt bei Ebay zugeschlagen und günstig ein neuwertiges 486 Baby-AT-Board von MITAC gekauft.
Wie taste ich mich jetzt am besten an das Problem heran? Jumpere ich zuerst die niedrigste Taktfrequenz und schaue, was passiert?! Mit welchem DOS-Programm kann ich die CPU zweifelsfrei identifizieren?
Edit: Ich habe das ganze jetzt angeschlossen. Beim Bootvorgang meldet er sich als 486SX2 at 66 Mhz. Das tut er unabhängig davon, ob ich DX oder SX-CPU auf dem Board gejumpert habe. Ist diese Angabe vertrauenswürdig?
Re: 486 CPU identifizieren
mach mal noch einen Benchmark. (z.b. nssi)
Wenn die Werte stimmen (und die Software keine FPU findet) ist es zumindest ein SX2
Wenn die Werte stimmen (und die Software keine FPU findet) ist es zumindest ein SX2
- philscomputerlab
- DOS-Übermensch
- Beiträge: 1218
- Registriert: Fr 1. Okt 2010, 10:40
- Wohnort: Australien
- Kontaktdaten:
Re: 486 CPU identifizieren
Ich habe auch zwei CPUs mit einem Kuehler den ich einfach nicht runter bekomme. Gibt es da eine Loesung?
Re: 486 CPU identifizieren
Es kann softwareseitig nicht wirklich zweifelsfrei bestimmt werden, ob eine CPU richtig getaktet wird, weil erst mit dem Pentium ein genaue Kennung mit dem CPUID-Befehl eingeführt wurde. So ist es bei älteren CPUs schon davon abhängig, ob die Hardware richtig eingestellt ist.Mau1wurf1977 hat geschrieben:Ich habe auch zwei CPUs mit einem Kuehler den ich einfach nicht runter bekomme. Gibt es da eine Loesung?
Hier ist eine Software-Lösung um festzustellen welchen CPU-Typ wir haben und ob eine FPU vorhanden ist.
Auch wird eine Schleife mit 64 NOP-Befehlen 1 Sekunde lang durchlaufen und die Anzahl der Durchläufe kann als Verzögerungsfaktor verwendet werden, um auf unterschiedlich schnellen CPUs einen zeitlich gleichbleibenden Ablauf z.B. einer Ausgabe am Bildschirm, oder die Steuerung über die Tastatur zu ermöglichen.
Code: Alles auswählen
;╔═══════════════════════════════════════════════════════════════════════════╗
;║ (C) Copyright: Freie Cracker Crew Hamburg Horn ║
;║ ║
;║ von: Dirk Wolfgang Glomp ║
;╚═══════════════════════════════════════════════════════════════════════════╝
.MODEL SMALL
.386P
.387
.CODE
org 100h
;────────────────────────────────────────────────────────────────────────────
Cpu86 = 0 ; Wert als Index in der Takt-Tabelle
Cpu286 = 4
Cpu386 = 8
Cpu486 = 12
Cpu586 = 16
;-------------------------------------
FpuNone = 0
FpuYes = 10h
FpuEmul = 50h
;────────────────────────────────────────────────────────────────────────────
START: mov ax, @DATA
mov ds, ax ; DS auf Daten-Bereich
;----------------------------------------------------------------------------
call GETCPU ; Prozessor-Analyse: AX=CPU
;-------------------------------------
call PUTP ; Prozessor-Typ in die Ausgabe-Maske
;----------------------------------------------------------------------------
call GETFPU ; Co-Prozessor-Analyse: DX=FPU
mov FPU, dl ; Typ retten
;-------------------------------------
call PUTF ; Co-Prozessor-Typ in die Ausgabe-Maske
;----------------------------------------------------------------------------
mov bx, OFFSET TAKT ; CPU-Geschwindigkeit holen
add bx, ax ; Offset in der Takt-Tabelle
call GETSPEED
;-------------------------------------
xor ax, ax ; Mhz.-Wert in die Ausgabe-Maske
mov al, MHZ
mov di, OFFSET WERT8
call DEZOUT8 ; Wert in AL, nach 3 Ascii's wandeln
;----------------------------------------------------------------------------
mov di, OFFSET LAUF ; Timer-Wert in die Ausgabe-Maske
cmp WORD PTR[TIMER+2], 0 ; TIMER = 32 Bit-Wert ?
jz short W16
mov eax, DWORD PTR[TIMER]
call DEZOUT32 ; Wert in EAX, nach 10 Ascii's wandeln
jmp short TOUT
;-------------------------------------
org START + ((($-START)/16)*16) + 16
;-------------------------------------
W16: mov ax, TIMER
add di, 5
call DEZOUT16 ; Wert in AX, nach 5 Ascii's wandeln
;----------------------------------------------------------------------------
TOUT: mov dx, OFFSET TEXT ; Ausgabe der ermittelten Werte (Maske)
mov ah, 9
int 21h
;---------------------------------------------------------------------------
xor ax, ax
mov al, MHZ ; Mhz. als Errorlevel zurückgeben
;-------------------------------------
mov ah, 4Ch ; Dos-Rücksprung, Programm-Ende
int 21h
;────────────────────────────────────────────────────────────────────────────
; U N T E R - R O U T I N E N
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
GETCPU: mov ax, Cpu86
xor bx, bx
push bx ; Null auf Stack
popf ; Null in Flagregister
pushf
pop bx ; zurück nach bx
and bh, 0F0h
cmp bh, 0F0h ; wenn gleich, dann 8086
je short CPUOK
;-------------------------------------
mov ax, Cpu286
push 7000h ; dasselbe mit 7000h
popf
pushf
pop bx
and bh, 70h
jz short CPUOK
;-------------------------------------
mov ax, Cpu386
mov edx, esp
and esp, 0FFFCh ; durch vier teilbare Adr.
pushfd
pop ebx
mov ecx, ebx
btc ebx, 18 ; Bit 18 umdrehen
push ebx
popfd
pushfd
pop ebx
push ecx ; alte Flaggen zurück
popfd
mov esp, edx ; Stack zurück
cmp ecx, ebx ; wenn gleich dann 386
jz short CPUOK
;-------------------------------------
mov ax, Cpu486
btc ecx, 21
push ecx
popfd
pushfd
pop ebx
cmp ebx, ecx ; wenn ungleich, dann 486
jnz short CPUOK
;-------------------------------------
mov ax, Cpu586 ; sonst Pentium
;----------------------------------------------------------------------------
CPUOK: mov bp, ax
ret ; AX=Cpu
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;----------------------------------------------------------------------------
GETFPU: mov dx, FpuNone ; von keiner FPU ausgehen
mov BYTE PTR cs:[F1], 90h
mov BYTE PTR cs:[F2], 90h
F1: finit ; initialisieren
F2: fstcw WORD PTR[FLAGS] ; CW speichern
cmp BYTE PTR[FLAGS+1], 3
jnz short FPUOK
;-------------------------------------
mov dx, FpuYes
cmp ax, Cpu86 ; keine Emulation bei 8086
jz short FPUOK
;-------------------------------------
smsw bx ; MSW nach BX
shr bx, 1
and bx, 3 ; Bits 0 und 1 maskieren
cmp bx, 2 ; Bit 2=1 -> Emul
jnz short FPUOK
;-------------------------------------
mov dx, FpuEmul
;-------------------------------------
FPUOK: ret ; DX=FPU
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
PUTP: mov si, ax ; Prozessor-Typ in die Ausgabe-Maske
mov cl, 6
add si, ax
mov di, OFFSET PROZ
add si, OFFSET P1
;-------------------------------------
PCOPY: mov bx, [si]
mov [di], bx
inc si
inc di
dec cl
jnz PCOPY
ret
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
PUTF: xor si, si ; Co-Prozessor-Typ in die Ausgabe-Maske
mov di, OFFSET COPR
and dl, dl ; Co-Prozessor vorhanden ?
jz short NOCO
mov si, ax
mov cl, 2
shl si, cl
add si, dx
NOCO: mov cl, 0Eh
add si, OFFSET C1
;-------------------------------------
FCOPY: mov bx, [si]
mov [di], bx
inc si
inc di
dec cl
jnz FCOPY
ret
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
GETSPEED: cli ; Interrupt's verbieten
xor ax, ax
mov es, ax ; ES auf Seg.: 0
;-------------------------------------
mov di, es:[20h] ; Vector von INT 8 retten (Offset)
mov si, es:[22h] ; (Segment)
;-------------------------------------
mov es:[20h], OFFSET NEUVEC ; Interrupt-Vector von INT 8
mov es:[22h], cs ; auf neue Routine legen
;-------------------------------------
mov al, 36h ; Timer auf 18,2 Hertz (Standart)
out 43h, al
xor al, al
out 40h, al ; low
out 40h, al ; high
;-------------------------------------
cmp bp, 8 ; 32-Bit-CPU ?
jb short M16
jmp M32
;---------------------------------------------------------------------------
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
M16: mov bp, 1 ; Aktiv-Flag = IRQ-Ende wenn 0
xor cx, cx ; Zähler low
xor dx, dx ; Zähler high
sti ; neuen Interrupt 8 starten
;-------------------------------------
S1: and bp, bp ; Auf IRQ-Ende warten
jnz S1
mov bp, 1 ; Für's Zählen IRQ Aktiv-Flag setzen
;-------------------------------------
S2: inc cx ; Hauptzählschleife
jnz short S3
inc dx
;-------------------------------------
S3: nop ; 64 Nop's
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
;-------------------------------------
and bp, bp ; auf Timer-IRQ-Ende abfragen
jnz S2 ; weiter, wenn Timer-IRQ noch aktiv
;-------------------------------
mov TIMER, cx ; Zähler low retten
mov TIMER+2, dx ; Zähler high retten
;---------------------------------------------------------------------------
ANALYS: cli ; Interrupts verbieten
mov es:[20h], di ; alten Interrupt-Vector
mov es:[22h], si ; von INT 8 wiederherstellen
sti ; Interrupts erlauben
;---------------------------------------------------------------------------
cmp BYTE PTR[FPU], 0 ; Coprozessor vorhanden ?
jnz short ANALYS2
;---------------------------------------------------------------------------
mov ax, cx ; DX:AX = TIMER * PULS
mul WORD PTR[PULS]
cmp ax, 1388h ; low-Word kleiner als 5000 ?
jb short HOE
add ax, 1388h ; aufrunden
adc dx, 0
;-------------------------
HOE: div WORD PTR[ZTAU] ; DX:AX = TIMER * PULS / 10.000
;-------------------------
xor dx, dx ; DX:AX = TIMER * PULS * TAKT / 10.000
mul WORD PTR[bx]
;-------------------------
xor dx, dx ; AL = TIMER * PULS * TAKT / 10.000.000
div WORD PTR[TAUS]
;-------------------------------------
mov MHZ, al ; MHZ = AL
ret
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
ANALYS2: finit ; Coprozessor initalisieren
fild DWORD PTR[PULS] ; aus 182 durch 10
fidiv DWORD PTR[ZEHN] ; wird 18.2
fimul DWORD PTR[TIMER] ; mal Timer
fimul DWORD PTR[bx] ; mal Takte
fidiv DWORD PTR[MILL] ; durch eine Million
fistp DWORD PTR[MHZ] ; MHZ=Timer*Takte*18,2/(1000*1000)
ret
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
M32: mov bp, 1 ; Aktiv-Flag = IRQ-Ende wenn 0
xor ecx, ecx ; Zähler
sti ; neuen Interrupt 8 starten
;-------------------------------------
S4: and bp, bp ; Auf IRQ-Ende warten
jnz S4
;-------------------------------------
mov bp, 1 ; Für's Zählen IRQ Aktiv-Flag setzen
;-------------------------------------
S5: inc ecx ; Hauptzählschleife
nop ; 64 Nop's
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
;-------------------------------------
and bp, bp ; auf Timer-IRQ-Ende abfragen
jnz S5 ; weiter, wenn Timer-IRQ noch aktiv
;---------------------------------------------------------------------------
mov DWORD PTR[TIMER], ecx ; Zähler retten
jmp ANALYS
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
DEZOUT8: mov bx, 100 ; Wert durch hundert
mov cl, 3 ; maximal 3 Ziffern
xor si, si ; Ascii-Zähler
ASC8: xor dx, dx
div bx
mov bp, dx ; Rest retten
add al, 30h ; nach ASCII wandeln
and si, si ; schon ein Ascii eingetragen ?
jnz short STORE8 ; 1.ten Ziffern ?
cmp al, "0" ; Ascii = "0" ?
jz short NULL8
STORE8: mov [di], al ; Ascii-Ziffer eintragen
inc si ; Ascii-Zähler erhöhen
NULL8: inc di ; Zeiger erhöhen
mov ax, bx
mov bx, 0Ah ; Teiler holen
xor dx, dx
div bx ; durch zehn
mov bx, ax ; Wert retten
mov ax, bp ; Rest holen
dec cl
jnz ASC8
ret
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
DEZOUT16: mov bx, 10000 ; Wert durch zehntausend
mov cl, 5 ; maximal fünf Ziffer
xor si, si ; Ascii-Zähler
ASC16: xor dx, dx
div bx
mov bp, dx ; Rest retten
add al, 30h ; nach ASCII wandeln
and si, si ; schon ein Ascii eingetragen ?
jnz short STORE16 ; 1.ten Ziffern ?
cmp al, "0" ; Ascii = "0" ?
jz short NULL16
STORE16: mov [di], al ; Ascii-Ziffer eintragen
inc si ; Ascii-Zähler erhöhen
NULL16: inc di ; Zeiger erhöhen
mov ax, bx
mov bx, 0Ah ; Teiler holen
xor dx, dx
div bx ; durch zehn
mov bx, ax ; Wert retten
mov ax, bp ; Rest holen
dec cl
jnz ASC16
ret
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
DEZOUT32: mov ebx, 1000000000 ; Wert durch eine Millarde
mov cl, 0Ah ; maximal Zehn Ziffer
xor si, si ; Ascii-Zähler
ASC32: xor edx, edx
div ebx
mov ebp, edx ; Rest retten
add al, 30h ; nach ASCII wandeln
and si, si ; schon ein Ascii eingetragen ?
jnz short STORE32 ; 1.ten Ziffern ?
cmp al, "0" ; Ascii = "0" ?
jz short NULL32
STORE32: mov [di], al ; Ascii-Ziffer eintragen
inc si ; Ascii-Zähler erhöhen
NULL32: inc di ; Zeiger erhöhen
mov eax, ebx ; Teiler holen
mov ebx, 0Ah
xor edx, edx
div ebx ; durch zehn
mov ebx, eax ; Wert retten
mov eax, ebp ; Rest holen
dec cl
jnz ASC32
ret
;────────────────────────────────────────────────────────────────────────────
; neue I R Q - R o u t i n e für INT 8
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/16)*16) + 16
;---------------------------------------------------------------------------
NEUVEC: mov al, 20h ; neue IRQ-Routine für INT 8
dec bp ; Aktiv-Flag löschen
out 20h, al ; =EOI
iret
;────────────────────────────────────────────────────────────────────────────
; D A T E N - B E R E I C H
;────────────────────────────────────────────────────────────────────────────
org START + ((($-START)/64)*64) + 64
;---------------------------------------------------------------------------
.DATA
org 0
;---------------------------------------------------------------------------
TAKT DW 3*64+58, 0 ; für Berechnung des 8086
DW 3*64+34, 0 ; für Berechnung des 80286
DW 3*64+28, 0 ; für Berechnung des 80386
DW 1*64+6, 0 ; für Berechnung des 80486
DW 1*64+4, 0 ; für Berechnung des 80586
;-------------------------------------
PULS DW 182, 0 ; 18.2 = Timer-Takt-Frequenz
;-------------------------------------
ZEHN DW 10, 0 ; zehn zum teilen
;-------------------------------------
TAUS DW 1000, 0 ; ein Tausend zum teilen
;-------------------------------------
ZTAU DW 10000, 0 ; zehn Tausend zum teilen
;-------------------------------------
MILL DD 1000000 ; eine Million zum teilen
;-------------------------------------
TIMER DW 0, 0 ; Anzahl der Schleifen-Durchläufe
;-------------------------------------
MHZ DB 0, 0, 0, 0 ; CPU-Geschwindigkeit
;-------------------------------------
FPU DB 0, 0, 0, 0 ; FPU-Flag
;----------------------------------------------------------------------------
FLAGS DB 0, 0, 0, 0 ; für CPU-Analyse
;----------------------------------------------------------------------------
P1 DB "8086/88 "
DB " 80286 "
DB " 80386 "
DB " 80486 "
DB " 80586 "
;-------------------------------------
C1 DB "nicht vorhanden "
DB " ist ein 8087 "
DB " ist ein 80287 "
DB " ist ein 80387 "
DB " ist ein 80487 "
DB " ist integriert "
DB " wird emuliert "
;----------------------------------------------------------------------------
TEXT DB 0Dh,0Ah," ╔═══════════════════════════════════╗",0Dh,0Ah
DB " ║ Freie Cracker Crew Hamburg Horn ║", 0Dh, 0Ah
DB " ╠═══════════════════════════════════╣", 0Dh, 0Ah
DB " ║ ║", 0Dh, 0Ah
DB " ║ Der Prozessor ist ein: "
PROZ DB " ║", 0Dh, 0Ah
DB " ║ ║", 0Dh, 0Ah
DB " ║ Der Coprozessor: "
COPR DB " ║", 0Dh, 0Ah
DB " ║ ║", 0Dh, 0Ah
DB " ║ Die Taktfrequenz beträgt: "
WERT8 DB " Mhz ║", 0Dh, 0Ah
DB " ║ ║", 0Dh, 0Ah
DB " ║ Anzahl der Durchläufe: "
LAUF DB " ║", 0Dh, 0Ah
DB " ║ ║", 0Dh, 0Ah
DB " ╚═══════════════════════════════════╝", 0Dh, 0Ah, "$"
;────────────────────────────────────────────────────────────────────────────
.STACK 20h
end
Re: 486 CPU identifizieren
Gibts überhaupt einen 66Mhz ? dachte die gehen nur bis 50Mhz ?
Re: 486 CPU identifizieren
Mein Retro-Blog: http://gameseller.de
Re: 486 CPU identifizieren
Es ging wohl bis 80 Mhz:jippel hat geschrieben:Jo, mußte auch erstmal nachgucken ;)
http://neon-wa.x86-guide.com/en/collect ... o4340.html

Dirk
Re: 486 CPU identifizieren
Kann ich bestätigen, in meinem Fundus:
- AMD DX2-80
- IBM Blue Lightning DX2-80

- AMD DX2-80
- IBM Blue Lightning DX2-80

Re: 486 CPU identifizieren
Ich glaube es ging um SX-CPUs, oder was hast Du gemeint,matze79 ?
Mein Retro-Blog: http://gameseller.de
Re: 486 CPU identifizieren
Ich meinte ganz speziell SX CPU's.
486 gibts sogar mit 120 und 133Mhz.
Es gibt auch 486 SoC's mit paar hundert Mhz.
486 gibts sogar mit 120 und 133Mhz.
Es gibt auch 486 SoC's mit paar hundert Mhz.
Re: 486 CPU identifizieren
Es gibt definitiv auch 166 MHz 486er.
Und ich meinte auch mal von 180 Mhz gelesen zu haben... da bin ich mir aber nicht sicher, ob es sich dabei um 486er handelte.
Und ich meinte auch mal von 180 Mhz gelesen zu haben... da bin ich mir aber nicht sicher, ob es sich dabei um 486er handelte.