LOCALS

.MODEL	TINY


CR		EQU	0Dh		;возврат коретки
LF		EQU	0Ah		;перевод строки

ESC_CharCode	EQU	1Bh		;код символа клавиши "ESC"
F1_ScanCode	EQU	3Bh		;скан-код клавиши "F1"


.DATA

sErrorMsg1	DB	'This program requires DOS 2.00 or later.',CR,LF,'$'
sErrorMsg2	DB	'This program requires VGA or better.',CR,LF,'$'
sErrorMsg3	DB	'This program requires 128K free memory.',CR,LF,'$'


.CODE

EXTRN	ScreenOn:PROC
EXTRN	FreeMainMemSize:PROC
EXTRN	InitGraph:PROC
EXTRN	FormImage:PROC
EXTRN	CloseGraph:PROC
EXTRN	ReadKey:PROC
EXTRN	Delay:PROC
EXTRN	Sound:PROC
EXTRN	GetComputerInfo:PROC
EXTRN	GetVideoInfo:PROC
EXTRN	GetMemoryInfo:PROC
EXTRN	GetDiskInfo:PROC
EXTRN	GetCDInfo:PROC
EXTRN	GetOtherInfo:PROC
EXTRN	DefParSysWindow:PROC
EXTRN	AboutWindow:PROC
EXTRN	OutSystemInfo12:PROC

ORG	100h

Start:

;-------------------------------------------------------------------------------
;Проверяем необходимые условия для работы программы
;-------------------------------------------------------------------------------

;проверяем номер версии DOS

		mov	ah,30h		;AH=30h (функция определения версии DOS)
		int	21h		;AL = старший номер версии DOS
					;AH = младший номер версии DOS

		cmp	al,2		;первая версия DOS?
		jnb	DOS_Ok

		mov	dx,OFFSET sErrorMsg1
		mov	ah,9
		int	21h

		int	20h		;завершение программы

DOS_Ok:

;проверяем наличие видеоадаптера VGA

		call	ScreenOn	;AL=12h, если видеоадаптер - VGA

		cmp	al,12h		;это VGA?
		je	VGA_Ok

		mov	dx,OFFSET sErrorMsg2
		jmp	Error_Exit	;выход из программы с сообщением
					;об ошибке

VGA_Ok:

;проверяем объем доступной программе основной оперативной памяти

		call	FreeMainMemSize	;AX = размер свободной оперативной
					;памяти в параграфах
		cmp	ax,2000h
		jae	Mem_Ok

		mov	dx,OFFSET sErrorMsg3

Error_Exit:	mov	ah,9
		int	21h

		mov	al,0FFh		;AL=0FFh (код возврата)
		jmp	Exit		;выход из программы

Mem_Ok:

;-------------------------------------------------------------------------------
;Рабочая часть программы
;-------------------------------------------------------------------------------

		mov	ax,ds
		add	ax,1000h
		mov	es,ax		;ES = дополнительный сегмент данных

;инициализация программы

		call	InitGraph

;определение параметров системы

		call	DefParSysWindow	;вывод окна "Определение параметров
					;системы"

		call	GetComputerInfo
		call	GetVideoInfo
		call	GetMemoryInfo
		call	GetDiskInfo
		call	GetCDInfo
		call	GetOtherInfo

		mov	cx,9		;задержка на пол-секунды
		call	Delay

;вывод информации на экран

		call	FormImage
		call	OutSystemInfo12

Next_Key:	call	ReadKey		;AL = код символа нажатой клавиши
					;AH = скан-код нажатой клавиши

		cmp	ah,F1_ScanCode
		je	ShowAboutBox

		cmp	al,ESC_CharCode
		je	Quit

		mov	bx,560		;частота звукового сигнала - 560Гц
		mov	cx,2		;длительность звучания сигнала - 0,11с
		call	Sound
		jmp	Next_Key

ShowAboutBox:	xor	bx,bx		;ES:BX -> буфер
		call	AboutWindow
		jmp	Next_Key

Quit:

;завершение программы

		call	CloseGraph

		xor	al,al		;AL=0 (код возврата)

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


END		Start
