Listing Six
TITLE intel
DOSSEG
.model small
.stack 100h
;----- Include file section -----
includelib \masm\lib\miscutil.lib
includelib \masm\lib\videofns.lib
; ----- External declarations -----
extrn _get_fpu_type: proc
extrn _get_cpu_type: proc
extrn Set_cursor: proc
extrn Get_cursor: proc
extrn HEX32OUT: proc
extrn CLS: proc
extrn _cpu_type: byte
extrn _fpu_type: byte
extrn _cpuid_flag: byte
extrn _intel_CPU: byte
extrn _vendor_id: byte extrn _cpu_signature: dword
extrn _features_ecx: dword
extrn _features_edx: dword
extrn _features_ebx: dword
;------ Local variables & Equates ------
KBD_ReadFn equ 0 ; function to read keyboard
KBD_StatusFn equ 1 ; function to read keyboard status
; ------ Misc data variables ------
.data
PSeriesMsg label byte
db "P6: "
P6Buffer db " ",0dh,0ah
db "P5: "
P5Buffer db " ",0dh,0ah
db "P4: "
P4Buffer db " ",0dh,0ah
db "P3: "
P3Buffer db " ",0dh,0ah
db "P2: "
P2Buffer db " ",0dh,0ah
db "P2: "
P1Buffer db " ",0dh,0ah
db "P0: "
P0Buffer db " ",0dh,0ah,24h
P6Count dd 0
P5Count dd 0
P4Count dd 0
P3Count dd 0
P2Count dd 0
P1Count dd 0
P0Count dd 0
CPUTbl1 dw offset P6Count
dw offset P5Count
dw offset P4Count
dw offset P3Count
dw offset P2Count
dw offset P1Count
dw offset P0Count
CPUTbl2 dw offset P6Buffer
dw offset P5Buffer
dw offset P4Buffer
dw offset P3Buffer
dw offset P2Buffer
dw offset P1Buffer
dw offset P0Buffer
CPUID_Buffer db " $"
;------------------------------------------------------------------------
.code
.8086
start: mov ax, @data
mov ds, ax ; set segment register mov es, ax ; set segment register
and sp, not 3 ; align stack to avoid AC fault
call CLS ; clear screen
call Get_cursor
mov ah,9
mov dx,offset PSeriesMsg ; get message buffer address
int 21h
mov P6Buffer[8],'$' ; make ASCII$ string
mov P5Buffer[8],'$' ; make ASCII$ string
mov P4Buffer[8],'$' ; make ASCII$ string
mov P3Buffer[8],'$' ; make ASCII$ string
mov P2Buffer[8],'$' ; make ASCII$ string
mov P1Buffer[8],'$' ; make ASCII$ string
mov P0Buffer[8],'$' ; make ASCII$ string
@GetCPUID:
call _get_cpu_type ; determine processor type
call print
mov _cpu_type,0 ; clear it...for later
mov ah,KBD_StatusFn ; get keyboard status
int 16h ; read keyboard status
jz @GetCPUID
mov ah,KBD_ReadFn ; read keyboard function
int 16h ; get get key
mov ax, 4c00h ; terminate program
int 21h
;----- print proc near -----
xor bx,bx
mov bl,_cpu_type ; get CPUID
shl bx,1 ; *2
mov si,CPUTbl1[bx] ; get pointer to variable
add word ptr [si],1 ; adjust CPUID counter
adc word ptr [si][2],0
mov dx,608h ; get initial row/col pointer
sub dh,byte ptr _cpu_type
call Set_cursor ; set cursor position
mov si,CPUTbl1[bx]
mov di,CPUTbl2[bx] ; get buffer pointer
call HEX32OUT ; do buffer
mov ah,9 ; print it
mov dx,CPUTbl2[bx] ; get buffer address
int 21h
ret
print endp
end start