Gna, immer diese Extrawünsche...
Aber gut, hier der Code mit dem bei diesem Projekt der Floppy-Controller gesucht wurde:
detect_basic_hw_string: db "detecting basic hardware: ",0A,0D,0
create_temp_pmode_env: db "creating temporary pmode environment... ",0
start_pmode: db "starting protected mode... ",0
hw_start:
hw_cpu_id_string: dd 0,0,0 ; Prozessor ID-String (o0 l13).
db 0
hw_cpu_version: dd 0 ; Informationen ?ber die Version (o13 l4).
hw_cpu_features: dd 0 ; Informationen ?ber die Features (o17 l4).
hw_cpu_speed: dd 0 ; ungefâhre MHz Zahl (o21 l4).
hw_memory: dd 0 ; KB an Speicher (o25 l4).
hw_fdc: db 0 ; 0=none / 1=extended fdc (o29 l1).
hw_floppys: db 0 ; Anzahl der Floppylaufwerke (o30 l1).
; Path des Bootscripts (o31 l72).
bootscript_path: db ".......................................................................",0
#define HW_SIZE 103xD
; *** PREPARE_KERNEL ***
prepare_kernel:
; Hardware suchen:
mov si,detect_basic_hw_string
call print_string
call detect_processor
call detect_memory
call detect_fdc
call detect_floppys
; Den Temp-Pmode vorbereiten:
mov si,create_temp_pmode_env
call print_string
jmp temp_pm
; *** DETECT_FDC ***
#define FDC_DATA 3F5 ; Data Register.
#define FDC_MSR 3F4 ; Main Status Register (input).
#define CMD_VERSION 10 ; FDC version.
detect_fdc_string: db " floppy disk controller: ",0
detect_fdc_ec_found: db "extended controller",0A,0D,0
detect_fdc_no_ec_found: db "none",0A,0D,0
detect_fdc:
mov bl,COLOR_WHITE
mov si,detect_fdc_string
call print_string_color
; Testet, welche FDC-Version installiert ist:
mov bl,CMD_VERSION
call sendbyte_fdc
call getbyte_fdc
cmp bl,90
jnz detect_fdc_no_ec
mov si,detect_fdc_ec_found
call print_string
mov byte ptr [hw_fdc],1
ret
detect_fdc_no_ec:
mov si,detect_fdc_no_ec_found
call print_string
mov byte ptr [hw_fdc],0
ret
; *** SENDBYTE_FDC ***
; (->bl = Byte to send)
; Sendet das Byte in bl an den FDC.
sendbyte_fdc:
push cx
push dx
push ax
mov cx,80
mov dx,FDC_MSR
sendbyte_fdc_loop:
in al,dx
and al,0C0
cmp al,80
jnz sendbyte_fdc_weiter
mov dx,FDC_DATA
mov al,bl
out dx,al
pop ax
pop dx
pop cx
ret
sendbyte_fdc_weiter:
in al,80 ; delay
loop sendbyte_fdc_loop
pop ax
pop dx
pop cx
ret
; *** GETBYTE_FDC ***
; (bl<- = received Byte ( FF = Timeout ))
; Empfângt in bl ein Byte vom FDC.
getbyte_fdc:
push cx
push dx
push ax
mov cx,80
mov dx,FDC_MSR
getbyte_fdc_loop:
in al,dx
and al,0D0
cmp al,0D0
jnz getbyte_fdc_weiter
mov dx,FDC_DATA
in al,dx
mov bl,al
pop ax
pop dx
pop cx
ret
getbyte_fdc_weiter:
in al,80 ; delay
loop getbyte_fdc_loop
pop ax
pop dx
pop cx
mov bl,0FF ; Timeout
ret
; *** DETECT_PROCESSOR ***
detect_processor_string: db " processor: ",0
detect_processor_speed_string1: db " ~",0
detect_processor_speed_string2: db "MHz",0A,0D,0
detect_processor:
mov si,detect_processor_string
mov bl,COLOR_WHITE
call print_string_color
; Den ID-String holen (12 Bytes in ebx,edx,ecx):
xor eax,eax
cpuid
mov [hw_cpu_id_string],bl
shr ebx,8
mov [(hw_cpu_id_string+1)],bl
shr ebx,8
mov [(hw_cpu_id_string+2)],bl
shr ebx,8
mov [(hw_cpu_id_string+3)],bl
shr ebx,8
mov [(hw_cpu_id_string+4)],dl
shr edx,8
mov [(hw_cpu_id_string+5)],dl
shr edx,8
mov [(hw_cpu_id_string+6)],dl
shr edx,8
mov [(hw_cpu_id_string+7)],dl
shr edx,8
mov [(hw_cpu_id_string+8)],cl
shr ecx,8
mov [(hw_cpu_id_string+9)],cl
shr ecx,8
mov [(hw_cpu_id_string+0A)],cl
shr ecx,8
mov [(hw_cpu_id_string+0B)],cl
mov si,hw_cpu_id_string
call print_string
; Erweiterte Informationen holen:
xor eax,eax
inc ax
cpuid
mov [hw_cpu_version],eax
mov [hw_cpu_features],edx
; CPU Geschwindigkeit ermitteln:
call detect_cpu_speed
mov si,detect_processor_speed_string1
call print_string
mov eax,[hw_cpu_speed]
mov ebx,10xD
call print_number
mov si,detect_processor_speed_string2
call print_string
ret
detect_cpu_speed_lo: dd 0
detect_cpu_speed_hi: dd 0
detect_cpu_speed_delay: dd 0
detect_cpu_speed:
; Aktuelle Cycle Zahl holen:
db 0F,31 ; RDTSC
mov [detect_cpu_speed_lo],eax
mov [detect_cpu_speed_hi],edx
; Delay von ca. 500ms:
xor ax,ax
int 1A
shl ecx,16xD
mov cx,dx
mov [detect_cpu_speed_delay],ecx
add dword ptr [detect_cpu_speed_delay],9
detect_cpu_speed_delay_loop:
int 1A
shl ecx,16xD
mov cx,dx
cmp [detect_cpu_speed_delay],ecx
jg detect_cpu_speed_delay_loop
; Jetzt aktuelle Cycle Zahl holen und die alte davon abziehen:
db 0F,31 ; RDTSC
sub eax,[detect_cpu_speed_lo]
sbb edx,[detect_cpu_speed_hi]
; Einen kleinen Korrekturwert hinzuf?gen:
add eax,600000
adc edx,0
; Nun ausrechnen wie viele Cycle der Rechner in 1000 Sekunden macht (MHz):
mov ecx,7A120
div ecx
mov [hw_cpu_speed],eax
ret
; *** DETECT_MEMORY ***
detect_memory_string1: db " memory: ",0
detect_memory_string2: db "kb",0A,0D,0
detect_memory:
mov si,detect_memory_string1
mov bl,COLOR_WHITE
call print_string_color
; Dieser Interrupt gibt die Menge an Erweiterungsspeicher in kb zur?ck:
mov eax,0E801
int 15
; Es kann sein, dass âltere BIOS-Versionen diese Funktion noch nicht haben:
jc detect_memory_noE801
and eax,0FFFF ; 16-Bit mem unter 16mb in 1kb Blâcken.
and ebx,0FFFF ; 16-bit mem ?ber 16mb in 64kb Blâcken.
shl ebx, 6 ; Auf 1kb Blâcke bringen.
add eax,ebx
mov [hw_memory],eax
jmp detect_memory_ende
detect_memory_noE801:
; Die Speichergrâáe aus dem CMOS lesen:
mov al,17
out 70,al
in al,71
mov [hw_memory],al
mov al,18
out 70,al
in al,71
mov [(hw_memory+1)],al
detect_memory_ende:
; Den gesammten Speicher nicht nur den Erweiterten (also +1mb):
add dword ptr [hw_memory],1024xD
mov eax,[hw_memory]
mov ebx,10xD
call print_number
mov si,detect_memory_string2
call print_string
ret
; *** DETECT_FLOPPYS ***
detect_floppys_string: db " floppy disks: ",0
detect_floppys:
mov si,detect_floppys_string
mov bl,COLOR_WHITE
call print_string_color
; Floppy 1 testen:
push es
mov ax,800
xor dx,dx
int 13
pop es
jc detect_floppys_done ; Error.
cmp cx,0
je detect_floppys_done ; Nicht installiert.
inc byte ptr [hw_floppys]
; Floppy 2 testen:
push es
mov ax,800
mov dx,1
int 13
pop es
jc detect_floppys_done ; Error.
cmp cx,0
je detect_floppys_done ; Nicht installiert.
inc byte ptr [hw_floppys]
detect_floppys_done:
xor eax,eax
mov al,[hw_floppys]
mov ebx,10xD
call print_number
mov si,new_line
call print_string
ret
detect_fdc wird prüfen, ob eine Floppy da ist und detect_floppys prüft, ob 1 oder 2 Laufwerke installiert sind (glaub ich). Die anderen Funktionen sind für so Zeug wie Prozessorerkennung usw...
MM