Цель работы – выполнение задач ввода-вывода и интерпретации управляющей программы в системах ЧПУ оборудованием, разработка интерпретатора управляющей программы в системах ЧПУ.
Рабочее задание
-
Разработать и осуществить ввод управляющей программы с клавиатуры и вывод на дисплей.
-
Разработать и осуществить ввод управляющей программы из файла и вывод на дисплей.
-
Разработать интерпретатор управляющей программы в системах числового программного управления.
Выполнение работы
1. Ввод-вывод управляющей программы с клавиатуры.
Zad1: ClearScreen
Locate 0,0 ;курсор в позицию 0,0
tt1: ClearScreen
Locate 0,0 ;курсор в позицию 0,0
Call _Wwod ;ввод текста
Locate 0,1 ;курсор в позицию 0,1
Call _Wiwod ;вывод введенного текста
Locate 0,2 ;курсор в позицию 0,2
KeyWait
PrintXY 0,4,RT
KeyWait
;ClearScreen
cmp al,'y'
jz tt1
cmp al,'Y'
jz tt1
KeyWait
jmp menu ;выход в меню программы
;================================
Результат выполнения:
Использованные процедуры:
Proc _Wwod ;процедура
push ax ;сохранить
push dx ;регистры
CursorOn ;включить курсор
mov di,OFFSET Bufer ;адрес приемника символов
mov cx,0 ;cчетчик введенных символов
@@1: mov ah,0 ;ввод символа с клавиатуры
int 16h ;в регистр al
cmp al,0 ;признак функциональной клавиши
jz @@1 ;не принимать функциональные клавиши
cmp al,08h ;это клавиша Backspace (← удалить )?
jnz @@2 ;если нет, дальше
cmp cx,0 ;да, обрабатываем удаление, все удалено?
jz @@1 ;да, за новым символом
Tout 20h ;нет, надо удалить: код пробела → на экран
Tout 8 ;и шаг назад
dec cx ;уменьшить число введенных символов
dec di ;и счетчик текущего адреса в буфере
mov [byte ptr di],20h ;код пробела в буфер(косвенно)
jmp @@1 ;за новым символом
@@2: cmp al,13 ;это enter?
jnz @@4 ;если нет, дальше
mov [byte ptr di],al ;да, символ →в текстовый буфер
inc cx ;увеличить адрес знакоместа
jmp short @@5 ;да, на завершение
@@4: mov [byte ptr di],al ;не Enter, символ в буфер
inc cx ;позиция на экране
inc di ;позиция в буфере
jmp @@1 ;за очередным символом
@@5: mov [LenStr],cx ;длина текста с учетом Enter
pop dx ;восстановить измененные
pop ax ;регистры
ret ;завершение ввода
ENDP
;===================================
Proc _Wiwod
mov ah,40h ;вывести на экран из буфера символов
mov bx,01 ;в количестве, заданном в сх
mov dx,OFFSET Bufer ;из буфера с именем Bufer
int 21h ;с помощью прерывания с номером 21h
ret
ENDP
;================================
2. Ввод-вывод управляющей программы из файла.
Zad2:
Locate 0,0 ;позиция курсора
Call _FName ;вводим имя файла
Locate 0,1 ;курсор, завершение ввода
mov ah,40h ;вывести на экран из буфера символов
mov bx, 01 ;в количестве, заданном в сх
mov dx,OFFSET FName ;из буфера имя файла
int 21h ;с помощью прерывания с номером 21h
;завершен ввод имени файла
KeyWait ;останов для прочтения введенного имени файла
Call _FileRead ;читаем файл с диска в BuferData
cmp [Er],0 ;ошибки есть?
jz cle ;если нет, дальше; иначе
ClearScreen ;чистка экрана и
jmp menu ;на меню после ошибки чтения файла
;выводим его на экран, если нет ошибок в чтении файла
cle: Locate 0,3 ;курсор
mov cx, [FileLen] ;выводим на экран файл с УП
mov ah,40h ;из буфера BuferData
mov bx,01 ;в количестве, заданном в сх
mov dx,OFFSET BuferData ;адрес источника
int 21h ;с помощью прерывания с номером 21h
KeyWait ;останов для просмотра вывода
jmp menu ;выход в меню программы
;================================
Необходимые данные в сегменте данных:
DataSeg ;сегмент данных
ExSg dw 0 ;хранение регистра ES
FName db 63 DUP (0) ;поле имени (пути) файла
BuferData db 4096 DUP(0) ;буфер для размещения файла
FileLen dw 0 ;длина файла
Handle dw 0 ;номер (дескриптор) файла
Hand dw 0
FileNumber dw 0
LenStr dw ;длина строки
RT db `Введете следующий кадр? Да – Y$`
;==================================
Результат выполнения:
Использованные процедуры:
Proc _FileName ; ввод имени файла в буфер FName
CursorOn ;установить курсор
mov di,OFFSET FName ;начальный адрес буфера
;ввод имени файла с УП
mov cx,0 ;cчетчик удалений
wwa: mov ah,01 ;ввод символа с эхо
int 21h ;от клавиатуры
cmp al,0
jz wwa ;не принимать функциональные клавиши
@@1:
cmp al,08h ;это Backspace?
jnz @@2
cmp cx,0 ;да, все удалено?
jz wwa ;да, за новым символом
Tout 20h ;надо удалить, пробел на экран
Tout 8 ;и шаг назад
dec cx ;уменьшить счетчик после удаления
dec di ;и счетчик текущего адреса в буфере УП
mov [byte ptr di],20h ;код пробела в буфер
jmp wwa ;за символом
@@2: cmp al,13 ;это enter ?
jnz @@3 ;нет, уйти
mov [byte ptr di],0 ;имя файла заканчивается нулем
jmp short mm ;да, на завершение
@@3: cmp al,' ' ;это пробел?
jnz @@4
jmp wwa ;да пробел, не обрабатывать
@@4: mov [di],al ;нет, символ в буфер