|
V roce 2003 jsem řešil problém, jak umožnit spouštění starých DOSových servisních programů pro ústředny ESSER na tehdy moderních noteboocích s procesory, které byly 10x rychlejší, než programy předpokládaly a tudíž nefungovaly. Firma ESSER tou dobou už zhruba 8 let slibovala, že servisní programy budou i pro Windows. Ale sliby chyby a skutek utek. Nezbylo než napsat program, který vypnul cache a procesor tím drasticky zpomalil. S vypnutou cache CPU staré DOSové programy fungovaly sice pomalu, ale za to spolehlivě.
Kdysi velmi dávno (na začátku devadesátých let minulého století), jsem s nástupem procesorů Intel 80x486 řešil stejný problém: procesor byl příliš rychlý pro některé staré programy. V DEBUGu jsem tehdy napsal kraťounký program, který vypínal write-through cache. Nic jsem v něm nekontroloval, protože write-back cache tehdy ještě neexistovala. Ovšem v roce 2003 už bylo zapotřebí typ procesoru zkontrolovat, aby program nezpůsobil vytuhnutí počítače. Program jsem tedy napsal v assembleru x86 a zkompiloval ho programem NASM (příkazem: nasm wbiced.asm -o WBICED.COM). Použití bylo prosté program se v operačním systému MS DOS 6.22 (případně DOSu 7.x) spustil buď bez parametru nebo s jakýmkoli parametrem. V jednom případě cache vypnul ve druhém pro změnu zapnul. Zapnutí keše podle všeho nefungovalo úplně dobře, záleželo na typu notebooku, někdy bylo nutné notebook rebootovat, aby se zapnutí keše "projevilo".
; Pentium Internal Cache Enable / Disable
; wbiced.asm (write back internal cache enable/disable)
; 31-Jan-2003 initial release
; 30-Jul-2003 v1.0
; (c) 2003, K5
ORG 0100H
CMDL EQU 0080H
START:
PUSHF ; save the flags
PUSH EAX ; save eax
MOV DX,TXT1 ; text to display
MOV AH,09H ; func: display text
INT 21H ; call DOS service
MOV EAX,0 ; id
CPUID
MOV DX,TXT4 ; text to display
CMP EAX,00000000h ; <486wb+pentium 1
JE EXIT
PUSH EAX ; save eax
MOV DX,TXT5 ; text to display
MOV AH,09H ; func: display text
INT 21H ; call DOS service
POP EAX ; restore eax
MOV DX,TXT6 ; text to display
CMP EAX,00000001h ; 486+pentium 1
JE DSPLID
MOV DX,TXT7 ; text to display
CMP EAX,00000002h ; pentium pro
JE DSPLID
MOV DX,TXT8 ; text to display
CMP EAX,00000003h ; unknown cpu
JE DSPLID
MOV DX,TXT9 ; text to display
DSPLID:
MOV AH,09H ; func: display text
INT 21H ; call DOS service
CLI ; disable interrupts while we do this
MOV EAX,CR0 ; read CR0
MOV AH,[CMDL] ; check command-line parameter
OR AH,AH ; not present=disable
JZ DIS ; is present=enable
OR EAX,9FFFFFFFh ; set Cache and Write-through Enable bits of CR0
MOV CR0,EAX ; cache is now enabled
MOV DX,TXT2 ; text to display
JMP EXIT
DIS:
OR EAX,40000000h ; set Cache Disable but not Write-through bit of CR0
MOV CR0,EAX ; cache is now disabled
WBINVD ; flush and invalidate cache
MOV EAX,CR0 ; read CR0
OR EAX,20000000h ; now set the Write-through bit
MOV CR0,EAX ; turn off the cache entirely
MOV DX,TXT3 ; text to display
EXIT:
STI ; enable interrupts
MOV AH,09H ; func: display text
INT 21H ; call DOS service
POP EAX ; restore eax
POPF ; restore the flags
MOV AX,4C00H ; return to caller with errcode 0
INT 21H ; DOS service
TXT1: DB 'Enable/Disable write-back internal cache (C) 2003, K5',13,10,'$',0
TXT2: DB 'Your Pentium class CPU is running its native speed',13,10,'$',0
TXT3: DB 'Your Pentium class CPU does not run faster than 286',13,10,'$',0
TXT4: DB 'Your CPU is not Pentium class, program does nothing',13,10,'$',0
TXT5: DB 'Type of detected CPU: $',0
TXT6: DB '2',13,10,'$',0
TXT7: DB '2',13,10,'$',0
TXT8: DB '3',13,10,'$',0
TXT9: DB '>3',13,10,'$',0
|