mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.5 KiB
70 lines
1.5 KiB
|
|
chkcpu macro
|
|
|
|
jmp begn
|
|
msg db 13,10,"This copy of MS-DOS will run only on an 8086",13,10
|
|
db "or 8088 CPU based computer. This computer is not ",13,10
|
|
db "based on an 8086 or 8088 CPU. ",13,10
|
|
db 13,10,"Insert a copy of the appropriate MS-DOS system disk ",13,10
|
|
db "and press any key to re-boot.",13,10,0
|
|
|
|
begn:
|
|
;------GET_CPU_TYPE------------------------------------------------------------May, 88 by M.Williamson
|
|
; Returns: AX = 0 if 8086 or 8088
|
|
; = 1 if 80286
|
|
; = 2 if 80386
|
|
;
|
|
pushf
|
|
push bx ; preserve bx
|
|
xor bx, bx ; init bx to zero
|
|
|
|
xor ax,ax ; 0000 into AX
|
|
push ax ; put it on the stack...
|
|
popf ; ...then shove it into the flags
|
|
pushf ; get it back out of the flags...
|
|
pop ax ; ...and into ax
|
|
and ax,0F000h ; mask off high four bits
|
|
cmp ax,0F000h ; was it all 1's?
|
|
je scpu_8086 ; aye; it's an 8086 or 8088
|
|
|
|
mov ax,0F000h ; now try to set the high four bits..
|
|
push ax
|
|
popf
|
|
pushf
|
|
pop ax ; ...and see what happens
|
|
and ax,0F000h ; any high bits set ?
|
|
jz scpu_286 ; nay; it's an 80286
|
|
|
|
scpu_386: ; bx starts as zero
|
|
inc bx ; inc twice if 386
|
|
scpu_286: ; just inc once if 286
|
|
inc bx
|
|
scpu_8086: ; don't inc at all if 086
|
|
mov ax, bx ; put CPU type value in ax
|
|
pop bx ; restore original bx
|
|
popf
|
|
|
|
cmp ax, 0000
|
|
je cpu_ok
|
|
push cs
|
|
pop ds
|
|
mov si, offset msg
|
|
prnt: lodsb
|
|
or al, al
|
|
jz prnt_done
|
|
mov ah, 14
|
|
mov bx, 7
|
|
int 10h
|
|
jmp prnt
|
|
|
|
prnt_done:
|
|
xor ah, ah
|
|
int 16h
|
|
|
|
int 19h
|
|
cpu_ok:
|
|
endm
|
|
|
|
|
|
|
|
|