LOCALS

.MODEL	TINY


.DATA

szCPUHeader	DB	'CPU: ','$'


.DATA?

szCPU		DB	39 DUP(?)	;строка с типом процессора


.CODE

ORG	100h

EXTRN	GetCPUTypeStr:PROC
EXTRN	CPU_Speed:PROC

Start:
		call	GetCPUTypeStr	;DX = смещение ASCIIZ-строки с типом
					;процессора
		mov	si,dx
		call	StrLen		;CX = длина строки
		mov	di,OFFSET szCPU
		cld
		rep	movsb
		mov	BYTE PTR [di],0

		call	CPU_Speed	;AX = тактовая частота процессора
		or	ax,ax
		jz	@@Print

		mov	BYTE PTR [di],'-'
		inc	di
		call	WordToStr

@@Print:	mov	dx,OFFSET szCPUHeader
		mov	ah,9
		int	21h

		mov	si,OFFSET szCPU
		call	StrLen		;CX = длина строки
		mov	bx,1
		mov	dx,si
		mov	ah,40h
		int	21h

		call	NewLine

		xor	ah,ah
		int	16h

Exit:		mov	ax,4C00h	;AH=4Ch (функция завершения программы)
		int	21h

;*******************************************************************************
;StrLen		определяет длину строки
;*******************************************************************************
;Использует:	нет
;
;Вызов:		DS:SI -> строка символов, заканчивающаяся нулем
;
;Возврат:	CX = число символов в строке (длина строки)
;
;Изменяемые
;  регистры:	AL,CX,Flags
;*******************************************************************************
StrLen		PROC

		push	es		;сохраняем регистры в стеке
		push	di

		push	ds
		pop	es
		mov	di,si		;ES:DI -> строка символов

		xor	al,al		;AL=0 (признак конца строки)
		mov	cx,0FFFFh
		cld
		repne	scasb
		not	cx
		dec	cx		;CX = длина строки

		pop	di		;восстанавливаем регистры
		pop	es
		ret

StrLen		ENDP

;*******************************************************************************
;ByteToStr	выполняет преобразование 8-битного беззнакового числа
;		в строку символов, заканчивающуюся нулем
;*******************************************************************************
;Использует:	нет
;
;Вызов:		AL = 8-битное беззнаковое число (N)
;		ES:DI -> буфер
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AX,BX,CX,DX,Flags
;*******************************************************************************
ByteToStr	PROC

		xor	ah,ah

;*******************************************************************************
;WordToStr	выполняет преобразование 16-битного беззнакового числа
;		в строку символов, заканчивающуюся нулем
;*******************************************************************************
;Использует:	нет
;
;Вызов:		AX = 16-битное беззнаковое число (N)
;		ES:DI -> буфер
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AX,BX,CX,DX,Flags
;*******************************************************************************
WordToStr:

		xor	dx,dx

;*******************************************************************************
;DWordToStr	выполняет преобразование 32-битного беззнакового числа
;		в строку символов, заканчивающуюся нулем
;*******************************************************************************
;Использует:	нет
;
;Вызов:		DX:AX = 32-битное беззнаковое число (N)
;		ES:DI -> буфер
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AX,BX,CX,DX,Flags
;*******************************************************************************
DWordToStr:

		push	si		;сохраняем регистры в стеке
		push	di

		mov	si,10		;SI = делитель на 10
		xor	cx,cx		;CX = счетчик цифр, помещенных в стек

@@Next_Digit:	push	ax
		mov	ax,dx
		xor	dx,dx
		div	si		;AX = старшее слово (N / 10)
					;DX = (старшее слово N) mod 10
		mov	bx,ax		;BX = старшее слово (N / 10)
		pop	ax		;AX = младшее слово N

		div	si		;AX = младшее слово (N / 10)
					;DX = N mod 10
		push	dx		;поместить одну цифру в стек

		mov	dx,bx		;DX = старшее слово (N / 10)

		inc	cx
		or	bx,ax		;N равно нулю?
		jnz	@@Next_Digit		

;берем цифры в обратном порядке, преобразуем в символы и помещаем в ОП

		cld

@@Store_Digit_Loop:
		pop	ax		;берем цифры в обратном порядке
		add	al,'0'		;преобразуем цифру в символ
		stosb
		loop	@@Store_Digit_Loop

		mov	BYTE PTR es:[di],0	;записываем 0 в конце строки

		pop	di		;восстанавливаем регистры
		pop	si

		ret

ByteToStr	ENDP

;*******************************************************************************
;NewLine	переводит курсор на новую строку на стандартном устройстве
;		вывода
;*******************************************************************************
;Использует:	int 21h
;
;Вызов:		нет
;
;Возврат:	нет
;
;Изменяемые
;  регистры:	AH,DL,Flags
;*******************************************************************************
NewLine		PROC

		mov	ah,2
		mov	dl,0Dh
		int	21h
		mov	dl,0Ah
		int	21h

		ret

NewLine		ENDP


END		Start
