;*********Программа запуска ЕХЕ-файлов************************
Include Library.inc ;Подключение файла макросов
Code segment ;Начало кодового сегмента
Assume cs:code,ds:data ;Привязка сегментных регистров к сегментам
push es ;Сохраняем ES
mov ax,data ;Связываем регистр DS c
mov ds,ax ;сегментом DATA
Start: ;--ПЕРВОНАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ--
Hidecursor ;Сделать курсор невидимым
BackGround ;Заполнить экран фоном
xor bx,bx ;Устанавливаем начальные координаты маркера
;bh-X координата маркера ,bl-Y координата маркера
Invert 0,0,8 ;Выделить маркером первый пункт меню
ReadKey:
xor ah, ah ;--НАЧИНАЕМ ОПРОС КЛАВИАТУРЫ--
int 16h
cmp ax,4800h ;Нажата клавиша ‘Вверх’ ?
je mUp ;если да, то вычисляем новую координату У
cmp ax,5000h ;Нажата клавиша ‘Вниз’ ?
jne else1 ;если нет, то продолжаем сравнение кода клавиши
jmp far ptr mDn ;иначе вычисляем новую координату У
else1: cmp ax,4B00h ;Нажата клавиша ‘Влево’?
jne else2 ;если нет, то продолжаем сравнение кода клавиши
jmp far ptr mLeft ;иначе вычисляем новую координату Х
else2: cmp ax,4D00h ;Нажата клавиша ‘Вправо’?
jne else3 ;если нет, то продолжаем сравнение кода клавиши
jmp far ptr mRight ;иначе вычисляем новую координату У
else4: cmp ax,1C0Dh ;Нажата клавиша ‘Enter’?
jne else5 ;если нет, то продолжаем сравнение кода клавиши
jmp far ptr mEnter ;иначе определяем, что нужно выполнить
else5: jmp WhatWin ;Определяем какое окно надо вывести
mUp: ;--ВЫЧИСЛЕНИЕ НОВОЙ КООРДИНАТЫ У И
; ПЕРЕМЕЩЕНИЕ МАРКЕРА НА НОВОЕ МЕСТО--
invert bh,bl,8 ;Убрать маркер со старого места
cmp bl,2 ;Если У=0 или У=2, то запрещаем перемещать маркер
je mUpNext ; выше 0-й строки или 2-й строки
cmp bl,0
je mUpNext ;
sub bl,2 ;иначе вычисляем новую координату Y (Y:=Y-2)
mUpNext:
invert bh,bl,8 ;Поставить маркер на новом месте
jmp WhatWin ;Определяем какое окно надо вывести
mDn: ;--ВЫЧИСЛЕНИЕ НОВОЙ КООРДИНАТЫ У И
; ПЕРЕМЕЩЕНИЕ МАРКЕРА НА НОВОЕ МЕСТО--
cmp bh,0 ;Если У=0 и Х=0(первый пункт меню -'Exit'), то
jne mDnNext ;запрещаем перемещать маркер вниз
cmp bl,0
jne mDnNext ;
jmp far ptr WhatWin ; и определяем какое окно надо вывести
mDnNext:
invert bh,bl,8 ;Иначе убрать маркер со старого места
cmp bl,8 ;Если У=8, то запрещаем перемещать маркер ниже
je mDnNext2 ;8-й строки
add bl,2 ;Иначе вычисляем новую координату Y (Y:=Y+2)
mDnNext2:
invert bh,bl,8 ;Cтавим маркер на новом месте
jmp WhatWin ;Определяем какое окно надо вывести
mRight: ;--ВЫЧИСЛЕНИЕ НОВОЙ КООРДИНАТЫ Х И
; ПЕРЕМЕЩЕНИЕ МАРКЕРА НА НОВОЕ МЕСТО--
invert bh,bl,8 ;Убрать маркер со старого места
cmp bl,0 ;Если У<>0, то
je mRightNext ; при нажатии клавиши ‘Вправо’
xor bl,bl ; У присваиваем 0 (Y:=0)
mRightNext: ;Иначе
cmp bh,7 ;если У=7, то запрещаем перемещать маркер дальше
je mRightNext2 ;7-й строки
add bh,7 ;иначе вычисляем новую координату X
mRightNext2:
invert bh,bl,8 ;Ставим маркер на новом месте
jmp WhatWin ;Определяем какое окно надо вывести
mLeft: ;--ВЫЧИСЛЕНИЕ НОВОЙ КООРДИНАТЫ Х И
; ПЕРЕМЕЩЕНИЕ МАРКЕРА НА НОВОЕ МЕСТО--
invert bh,bl,8 ;Убрать маркер со старого места
cmp bl,0 ;Если У<>0, то
je mLeftNext ; при нажатии клавиши ‘Влево’
xor bl,bl ; У присваиваем 0 (Y:=0)
mLeftNext: ;Иначе
cmp bh,0 ;если У=0 запрещаем перемещать маркер меньше
je mLeftNext2 ;0-й строки
sub bh,7 ;иначе вычисляем новую координату X
mLeftNext2:
invert bh,bl,8 ;Ставим маркер на новом месте
jmp WhatWin ;Определяем какое окно надо вывести
mEnter: ;--ОПРЕДЕЛЯЕМ КАКОЙ ПУНКТ МЕНЮ НАДО ВЫПОЛНИТЬ--
cmp bx,0 ;Выбрали команду 'Exit'?
jne next1 ;если нет, то продолжаем определять что выбрано
jmp far ptr mExit ;иначе выходим из программы
next1: cmp bh,7 ;Выбрали пункт 'Other'?
je mExecutor ;если да, то определяем какую команду выбрали
jmp far ptr mExit ;иначе выходим из программы
mExecutor:
cmp bl,2 ;Выбрали команду'Executor'? (У=2)
je mExecutorStart ;если да, то выполнить эту команду
jmp far ptr mHelp ;иначе продлжаем определять что выбрано
mExecutorStart:
SelectFile ;Макрос выбора и запуска ЕХЕ-файлов
jmp Start ;На начала программы
mHelp:
cmp bl,4 ;Выбрали 'Help'? (У=4)
je mHelpStart ;если да, то выполнить эту команду
jmp far ptr mAbout ;иначе продлжаем определять что выбрано
mHelpStart:
Help ;макрос вывода окна ‘Help’
invert 0,0,8 ;Ставим маркер
jmp WhatWin ;Определяем какое окно надо вывести
mAbout:
cmp bl,6 ;Выбрали 'About'? (У=6)
je mAboutStart ;если да, то выполнить эту команду
jmp far ptr mExit ;иначе выбрана последняя команда-‘Exit’
mAboutStart:
About ;макрос вывода окна ‘About’
invert 0,0,8 ;Ставим маркер и
WhatWin: ;---ОПРЕДЕЛЯЕМ КАКОЕ ОКНО МЕНЮ ВЫВЕСТИ---
cmp bl,0 ;координата y=0?
je Yes ;если Да, то ищем координату Х
jmp far ptr ReadKey ;если нет, то переходим на считывание кода клавиши
Yes: push bx ;Запомнить регистры bh,bl
cmp bh,0 ;Маркер стоит в координате(0,0)? (Команда - ’Exit’)
jne mNEXT ;Если нет, то продолжаем определять где находится
; маркер.
FillTable ;Иначе заполняем рабочий стол фоном(т.е. никакого
; окна выводить не надо)
jmp mQuit ;Выход
mNEXT:
cmp bh,7 ;X-координата маркера X=7? (Пункт меню–‘Other’)
je next2 ;Если да, то вывести окно ‘Other’
jmp far ptr mQuit ;Иначе на выход
next2: FillTable ;Заполняем рабочий стол фоном
POther ;Выводим окно 'Other'
mQuit:
pop bx ;Восстановить регистры bh,bl
jmp ReadKey ;На опрос клавиатуры
mExit:
ClearScreen ;Очистка экрана
mov ax,4C00h ;Завершение работы программы
int 21h
Code ends ;Конец кодового сегмента
;---Сегмент данных------------------------------------------------------------
Data segment
WinBar db 80,' Exit Other '; Строка меню
FileExec db 8,'Executor' ; Строка-сообщение
FileHelp db 4,'Help' ; Строка-сообщение
FileAbout db 5,'About' ; Строка-сообщение
FileExit db 4,'Exit' ; Строка-сообщение
HelpString db 19,'Executing EXE-files'; Строка-сообщение
About1 db 6,'Tutaev' ; Строка-сообщение
About2 db 6,' Alex ' ; Строка-сообщение
About3 db 5,' 2000' ; Строка-сообщение
EnterUserFileName db 19,'Enter path of file:'; Строка-сообщение
ExeMessage db 9,'PROGRAMS:' ;Строка-сообщение
PPMessage db 11,'pas_pas.exe' ; Строка-сообщение
PAMessage db 11,'pas_asm.exe' ; Строка-сообщение
APMessage db 11,'asm_pas.exe' ; Строка-сообщение
AAMessage db 11,'asm_asm.exe' ; Строка-сообщение
WiMessage db 11,'windows.exe' ; Строка-сообщение
UsMessage db 11,'User file..' ; Строка-сообщение
ExitMessage db 11,'- Q U I T -' ; Строка-сообщение
;-----ASCIIZ имена загружаемых и исполняемых файлов
paspas db 'pas_pas.exe',0
pasasm db 'pas_asm.exe',0
asmpas db 'asm_pas.exe',0
asmasm db 'asm_asm.exe',0
WinPro db 'windows.exe',0
;----------------------------------------
UserFileName db 50 dup (?) ;Путь ЕХЕ-файла вводимый пользователем
parametrs dw 3 dup(0) ;блок параметров
oldss dw ? ;буферная переменная для регистра ss
oldsp dw ? ;буферная переменная для регистра sp
Data ends
Virtual segment ;”Виртуальный” сегмент без данных(необходим
Virtual ends ; для определения адреса конца программы)
End
