📄 oemrun.asm
字号:
; This table can be modified according to OEM requirement. ;
; For example, if P6 CPU is used only, which starts from 133MHz, the ;
; entries below 133MHz can be deleted which will create some space. ;
;-----------------------------------------------------------------------;
public cpu_freq_table
public cpu_freq_table_end
cpu_freq_table label byte
; X * 100 X
dw 14300, 133
dw 17600, 166
dw 21000, 200
dw 24300, 233
dw 27600, 266
dw 31000, 300
dw 34300, 333
dw 36000, 350
dw 41000, 400
dw 46000, 450
dw 51000, 500
dw 56000, 550
dw 61000, 600
cpu_freq_table_end label byte
;-----------------------------------------------------------------------;
; CHANGE_SPEED ;
;-----------------------------------------------------------------------;
; this is called from INT-9 ISR. this is in INT-9.ASM. ;
; input : ;
; ds 0040H ;
; stack available ;
; register usage : do not destroy any register ;
;=================== NOTE ==== NOTE ==== NOTE ========================= ;
; this routine is moved here from NRUNTIME.ASM file. The generic code ;
; of this routine takes much space so we decided to disable the generic;
; code. If any OEM needs this generic code, then activate the generic ;
; code. ;
; Default implementation : <CTRL><ALT> keystrokes are not supported. ;
; To support <CTRL><ALT> : Activate the generic code. ;
;-----------------------------------------------------------------------;
IF MKF_CTRL_ALT ; generic code for <CTRL><ALT>
public change_speed ; change CPU speed/cache etc
change_speed:
cli
cmp al,cgroup:_ctrl_alt_minus
jnz cs_1
test ds:byte ptr [17h],00000011b
jz cs_3
call cache_off ; <ctrl><alt><shift><->
jmp short cs_2
cs_3:
call frequency_low ; <ctrl><alt><->
jmp short cs_2
cs_1:
cmp al,cgroup:_ctrl_alt_plus
jnz cs_5
test ds:byte ptr [17h],00000011b
jz cs_4
call cache_on ; <ctrl><alt><shift><+>
jmp short cs_2
cs_4:
call frequency_high ; <ctrl><alt><->
jmp short cs_2
cs_5:
;---------------------------------------;
COMMENT !
; if hot-key setup is needed, activate the following code..
cmp al,cgroup:_ctrl_alt_setup; hot key setup
jnz cs_2 ; no
test cgroup:misc_info,hot_key_setup_bit; hot key setup enabled ?
jz cs_2 ; no
; verify that lower 32k of rom is present..
push ax
push es
push di
push si
push cx
push cs
pop es
mov di,offset cgroup:_bios_name; ES:DI = ptr to normal bios name
xor si,si ; CS:SI = ptr to name present at CS:0000h
mov cx,0008h ; 8bytes name
push si
push cx
db 2eh ; segcs
repz cmpsb
pop cx
pop si
;;;; jz cs_7 ; setup present in lower 32k
;;;; mov di,offset cgroup:_setup_name; ES:DI = ptr to compressed setup name
;;;; db 2eh ; segcs
;;;; repz cmpsb
;;;;cs_7:
pop cx
pop si
pop di
pop es
jnz cs_0 ; not present
mov ax,ds:word ptr [72h]
cmp al,'S' ; in setup ?
jz cs_0 ; yes
cmp al,'H' ; in hot-key setup ?
jz cs_0 ; yes
cmp ah,'P' ; in password checking ?
jz cs_0 ; yes
or ax,ax
jnz cs_0
mov ds:byte ptr [72h],'h' ; indicate to invoke hot-key setup
cs_0:
pop ax
!
;---------------------------------------;
cs_2:
sti
ret
;-----------------------------------------------------------------------;
; all registers must be saved except CX. (ds) = 40h always set, this ;
; routine is also called from INT-8, INT-16, be careful about registers.;
;-----------------------------------------------------------------------;
public frequency_low
frequency_low:
push si
push dx
push ax
mov si,offset cgroup:_low_speed_chipset
mov dx,offset cgroup:low_speed
mov ax,2000h ; AL = 00 for low speed
; AH = OR value, bit-5 = 1..low speed
freq_cache_common:
call freq_low_high_cache_on_off
freq_cache_common_exit:
pop ax
pop dx
pop si
ret
;-----------------------------------------------------------------------;
public frequency_high
frequency_high:
push si
push dx
push ax
mov si,offset cgroup:_high_speed_chipset
mov dx,offset cgroup:high_speed
mov ax,0df01h ; AL = 01 for high speed
; AH = AND value, bit-5 = 0..high speed
jmp short freq_cache_common
;-----------------------------------------------------------------------;
public cache_on
cache_on:
pushad
call enable_l1_cache
popad
push si
push dx
push ax
mov si,offset cgroup:_cache_on_chipset
mov dx,offset cgroup:enable_l2_cache
mov ax,1002h ; AL = 02 for cache on
; AH = OR value, bit-4 = 1..cache on
jmp short freq_cache_common
;-----------------------------------------------------------------------;
public cache_off
cache_off:
push si
push dx
push ax
mov si,offset cgroup:_cache_off_chipset
mov dx,offset cgroup:disable_l2_cache
mov ax,0ef03h ; AL = 03 for cache off
; AH = AND value, bit-4 = 0..cache off
call freq_low_high_cache_on_off
pushad
call disable_l1_cache
popad
jmp short freq_cache_common_exit
;-----------------------------------------------------------------------;
freq_low_high_cache_on_off:
push ax
xor cx,cx ; func not done
cmp cgroup:byte ptr [si],0
jz fc_01 ; no chipset used
call dx
fc_01:
mov al,cgroup:[si+1]
or al,al
jz fc_02 ; no 8042 pin used
out 64h,al
fc_06:
jcxz short $+2 ; i/o delay
in al,64h
test al,00000001b ; wait for o/b full
jz fc_06
in al,60h
mov cl,0ffh ; CX <>00..func done
fc_02:
mov dx,cgroup:[si+2]
or dx,dx
jz fc_03 ; no external port used
in al,dx
jcxz short $+2 ; i/o delay
jcxz short $+2 ; i/o delay
and al,cgroup:[si+5]
or al,cgroup:[si+4]
out dx,al
mov cl,0ffh ; CX <>00..func done
fc_03:
pop ax
jcxz fc_04 ; CX = 00..func not done
test al,1 ; bit- 0 = 0/1..OR/AND
jz fc_05
and ds:byte ptr [0016h],ah
jmp short fc_04
fc_05:
or ds:byte ptr [0016h],ah
fc_04:
ret
;-----------------------------------------------------------------------;
ELSE ; <CTRL><ALT> support not needed
;-----------------------------------------------------------------------;
public change_speed ; change CPU speed/cache etc
change_speed:
ret
COMMENT ~
;-----------------------------------------------------------------------;
; all registers must be saved except CX. (ds) = 40h always set, this ;
; routine is also called from INT-8, INT-16, be careful about registers.;
;-----------------------------------------------------------------------;
public frequency_low
frequency_low:
push dx
push ax
call low_speed
mov ax,0df20h ; AH, AL = AND, OR value
fl_01:
jcxz short fl_00 ; CX = 00..func not done
fl_02:
and ds:byte ptr [0016h],ah
or ds:byte ptr [0016h],al
fl_00:
pop ax
pop dx
ret
;-----------------------------------------------------------------------;
public frequency_high
frequency_high:
push dx
push ax
call high_speed
mov ax,0df00h ; AH, AL = AND, OR value
jmp short fl_01
;-----------------------------------------------------------------------;
public cache_on
cache_on:
pushad
call enable_l1_cache
popad
push dx
push ax
call enable_l2_cache
mov ax,0ef10h ; AH, AL = AND, OR value
; bit-4 = 1..cache on
jmp short fl_02
;-----------------------------------------------------------------------;
public cache_off
cache_off:
push dx
push ax
call disable_l2_cache
mov ax,0ef00h ; AH, AL = AND, OR value
; bit-4 = 0..cache off
pushad
call disable_l1_cache
popad
jmp short fl_02
~
public frequency_high
public frequency_low
frequency_high:
frequency_low:
ret
;-----------------------------------------------------------------------;
ENDIF
;-----------------------------------------------------------------------;
; TIMER_INTERRUPT_INT8 ;
;-----------------------------------------------------------------------;
; This routine will get control in every timer tick, any special turbo ;
; switch can be done here. this is called from INT-8 ISR in INT8.INC. ;
; input : ;
; DS 40H ;
; stack available ;
; output: ;
; none ;
; register usage : DO NOT destroy any register ;
; Note: This routine can be used to implement the turbo switch using ;
; OEM specific stuff. The following code uses KB controller pin. ;
;-----------------------------------------------------------------------;
public timer_interrupt_int8
extrn timer_interrupt_int8_end:near
timer_interrupt_int8:
IF MKF_TURBO_SWITCH
extrn turbo_switch:near
public turbo_switch_end
jmp turbo_switch
turbo_switch_end:
ENDIF ; No Turbo Switch support
; push ax
; mov al,0ah
; call cmos_data_in_x
; test al,080h ; CMOS0A.7=1 (time update in progress) ?
; jnz update_in_progress ; yes..
; mov al,032h ; Century byte
; call cmos_data_in_x
; mov ah,al
; mov al,009h ; RTC year
; call cmos_data_in_x
; cmp ax,1900h ; AC1900 ?
; jne update_in_progress
; mov ax,20h*256+32h
; call cmos_data_out_x ; 1900 -> 2000, (06/27/1995)
;update_in_progress:
; pop ax
jmp timer_interrupt_int8_end
;-----------------------------------------------------------------------;
public _OEM_RUNTIME_ENDS
_OEM_RUNTIME_ENDS label byte ; marks end of module
;---------------------------------------;
_text ends
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -