Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
Nastya1928
0 / 0 / 1
Регистрация: 18.02.2018
Сообщений: 9
#1

Работа с мышкой и видеопамятью в текстовом режиме - Assembler

18.02.2018, 20:40. Просмотров 269. Ответов 9
Метки нет (Все метки)

Огромная просьба помочь с задачей.Искала на многих сайтах и в разных книгах ,но сложно понять с чего начать
Реализовать подпрограмму формирования окна с параметрами:
• x и у координата (в символах) левого верхнего угла,
• ширина окна в символах,
• высота окна в символах,
• атрибут фона.
Под окном здесь понимается прямоугольная область экрана с цветом фона. С помощью подпрограммы обеспечить создание окна с фиксированной высотой и шириной при нажиме правой кнопки мыши. Координаты верхнего левого угла окна соответствуют координатам х и у (разделенных на 8), поступающих от драйвера мыши.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2018, 20:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с мышкой и видеопамятью в текстовом режиме (Assembler):

Работа с видеопамятью напрямую
Есть ли какой-нибудь способ управлять мерцанием символа, не устанавливая...

Перехват прерываний от клавиатуры и работа с видеопамятью
Здравствуйте)) Помогите мне, пожалуйста, с лабораторной)) Вот задание:...

Циферблат в текстовом режиме
У меня такая проблема! Мы только начали учить ассемблер, а лабу сдавать скоро!...

Программа в текстовом режиме...
Программа должна принимать значение которое было введено с клавиатуры и...

Рисование прямоугольника в текстовом режиме
Помогите, пожалуйста. Есть программа, которая рисует прямоугольник в...

В текстовом режиме отобразить палитру дисплея
Добрый вечер :) СРАЗУ говорю, что я не прошу написать за меня код, но от...

9
ФедосеевПавел
Модератор
3419 / 1916 / 815
Регистрация: 01.02.2015
Сообщений: 6,455
18.02.2018, 22:09 #2
Определение окна - однократное? Т.е. программа:
1. Ожидание нажатия ПКМ
2. По координатам курсора мыши определяется координаты углов окна.
3. По координатам окна производится закрашивание области экрана.
4. Ожидание нажатия любой клавиши
5. Завершение программы.

Нет изменения и перетаскивания окна?
0
Nastya1928
0 / 0 / 1
Регистрация: 18.02.2018
Сообщений: 9
18.02.2018, 22:25  [ТС] #3
Нет никаких изменений,все как Вы описали
0
ФедосеевПавел
Модератор
3419 / 1916 / 815
Регистрация: 01.02.2015
Сообщений: 6,455
18.02.2018, 22:44 #4
Попробуйте начать самостоятельно. У меня уже позднее время и с понедельника загруженная рабочая неделя. Что либо делать смогу лишь на выходных.
У вас в программе - инициализация мыши, показать мышь, потом в цикле проверка нажатия правой кнопки, после чего получение координат и обращение к функции SCROLL (int 10h ah=06h) с заполнением размера окрашиваемой области (окна).

инициализация мыши
показать мышь
проверка нажатия кнопки и текущие координаты
int 10h ah=06h
ожидание нажатия любой клавиши
спрятать мышь

Пример
http://www.cyberforum.ru/assembler-dos/thread2171030.html
0
Nastya1928
0 / 0 / 1
Регистрация: 18.02.2018
Сообщений: 9
18.02.2018, 22:52  [ТС] #5
Я уже немного пробовала начинать :
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
.data segment use 16
        ;координаты левого верхнего угла прямоугольника
        Xstart                          dw      0
        Ystart                          dw      0
        ;размеры прямоугольника
       Rwidth                       dw      80
       Heigth                      dw      10
        ;цвет прямоугольника
        Color                       dw      7
 
.code segment use 16; основной сегмент кода
start:
mov ax,3 ;установка режима 
int 10h
mov ax,00h ;инициализация мыши
int 33h
mov ax,0ch ; установка обработчика мыши
mov cx,03h ; нажатие правой клавиши мыши
mov dx,offset func
int 33h
mov ah,0
int 16h
mov ax,000Ch
mov cx,0000h
int 33h
mov ah,4Ch;завершаем программу
int 21h
 
func:
???
 
end start
END
но буду питаться дальше)Спасибо большое )
0
ФедосеевПавел
Модератор
3419 / 1916 / 815
Регистрация: 01.02.2015
Сообщений: 6,455
18.02.2018, 23:09 #6
Да, попробуйте. Для небольших программ изменять код легче, чем набирать с нуля.

Можете воспользоваться автоформаттером кода (там добавляется первая рекламная строка)
http://ato.su/asmtidy/
Он далёк от совершенства, но лучше, чем ничего.

Добавлено через 1 минуту
А по заданию обязательно устанавливать собственный обработчик мыши? Или можно обойтись опросом?

Добавлено через 4 минуты
Если обязательно - то примеры из FAQ (уже приводил ссылку) вам помогут.
И тогда структура программы будет похожа на
http://www.cyberforum.ru/assembler-dos/thread2161678.html
только режим текстовый и многое можно удалить (описания курсоров, процедуры рисования, что-то ещё)
0
Nastya1928
0 / 0 / 1
Регистрация: 18.02.2018
Сообщений: 9
18.02.2018, 23:19  [ТС] #7
Спасибо)
0
Nastya1928
0 / 0 / 1
Регистрация: 18.02.2018
Сообщений: 9
22.02.2018, 14:37  [ТС] #8
Подскажите пожалуйста почему может не работать ?

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
.model small
.286
.data 
        x  dw 0
        y  dw 0
        ;размеры прямоугольника
        W  dw    50
        H  dw     20
        ;цвет прямоугольника
        Col  db      07h
 
.code 
start:
        mov ax, @data
        mov ds, ax
        mov ax,3        ;установка режима 
        int 10h
        mov ax,00h      ;инициализация мыши
        int 33h
        mov ax,01h    ;Показать курсор "мыши"
        int 33h
        mov ax,0ch      ; установка обработчика мыши
        mov cx,03h ; нажатие правой клавиши мыши
        push cs
        pop es
        lea dx,prmaus
        int 33h
 
prmaus proc far
        push ds
        push es
        pusha
        push 0B800h
        pop es
    
        shr dx,3
        shr cx,3
        mov si,cx
        add si,W
        mov di,dx
        sub di,H
        mov al,7h
        mov x,cx
        mov y,dx
c1:                 
    int 10h         ; вызываем прерывание и ставим точку
    cmp dx, di      ; сравниваем со значением y+H
    jne lp          ; если не равно - goto LP
    cmp cx, si      ; если равно - сравниваем с x+H
    jne lp2         ; не равно - goto lp2
    jmp ex          ; иначе - выходим из цикла (т.к. половину прямоугольника мы нарисовали)
lp:
    inc dx          ; увеличиваем координату
    jmp c1 
lp2:
    inc cx
    jmp c1 
     
ex:  
; аналогичный цикл на достроение 2 части прямоугольника  
c2:  
    int 10h
    cmp dx, y
    jne lp3
    cmp cx, x
    jne lp4
    jmp ex2
lp3:
    dec dx
    jmp c2
lp4:
    dec cx
    jmp c2  
ex2:    
    mov ah, 1
    int 21h
     
        popa
        pop     es
        pop     ds
        retf
prmaus endp   
exit:
     mov ah,0
    int 16h
    mov ax,000Ch
    mov cx,0000h
    int 33h
    mov ah,4Ch      ;завершаем программу
    int 21h
end start
END
0
Jin X
❗❗ RTFM 👈
4007 / 1151 / 151
Регистрация: 14.12.2014
Сообщений: 2,292
Записей в блоге: 5
Завершенные тесты: 2
22.02.2018, 15:01 #9
Nastya1928, во-первых, не mov cx,03h, а mov cx,1 shl 3 (ну или mov cx,8), нужно установить 3-й бит, а не записать число 3.
Во-вторых, что происходит после установки своего обработчика событий от мыши? Правильно, запуск prmaus, потому что она у вас в коде идёт сразу после этого момента. Или вы думаете, что процедуру, раз она обрамлена директивами proc / endp, процессор обойдёт стороной? Нет. Переносите процедуру в самый конец.
В-третьих, в самой prmaus при вызове int 10h вы устанавливаете al=7, а чему равен ah (код функции) – неизвестно.

Поэтому ничего и не работает...

p.s. Сам алгоритм не смотрел, сначала надо исправить это. Честно говоря, не совсем понимаю, какую функцию вы хотели использовать для вывода символа. Надеюсь, не 0Ch? Это же не графический режим...

Добавлено через 3 минуты
А ну да, ещё...
Assembler
1
2
    mov ah, 1
    int 21h
...уберите из обработчика событий.
Во-первых, int 21h в таких местах использовать нельзя (в резидентной обработчике или в обработчиках событий от мыши).
А во-вторых, зачем оно тут?
1
ФедосеевПавел
Модератор
3419 / 1916 / 815
Регистрация: 01.02.2015
Сообщений: 6,455
22.02.2018, 22:25 #10
Nastya1928, я ещё раз уточню - обязательно использовать пользовательский обработчик прерывания (prmaus) или достаточно опрашивать в цикле состояние кнопок до нажатия ПКМ, а потом определить координаты?

Добавлено через 19 минут
То, о чём говорил Jin X - можно объяснить ещё и так.
Структура DOS exe программы
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.model small
 
.stack 100h
 
.data
    CrLf    db  0Dh, 0Ah, '$'
 
.code
 
main    proc
    mov ax,     @data
    mov ds, ax
        .................
    mov ax, 4C00h
    int 21h
main    endp
 
pmaus proc
        ..................
pmaus endp
 
end main
Т.е. объявление и содержимое процедуры находится за пределами основной программы. А у вас, почему-то, pmaus оказался внутри main.
1
22.02.2018, 22:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2018, 22:25
Привет! Вот еще темы с решениями:

В текстовом режиме выделяет мышью блок инвертируя фон
Здравствуйте помогите с программкой. теоретически понимаю что надо сделать...

Вывод на экран в текстовом режиме с использованием средств BIOS
Задание: Ввести с клавиатуры строку, и вывести её на экран несколько раз...

Какое максимальное количество видео страниц в графическом и в текстовом режиме?
Подскажите пожалуйста. Какое максимальное количество видео страниц в...

Количество нажатий левой кнопки мыши на экран в текстовом режиме
Прошу помочь кто сможет! Написать программу, которая выводит количество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru