Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44

Вывести координаты мыши в нижний угол экрана

30.05.2014, 19:55. Показов 2589. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите вывести координаты мыши в нижний угол(любой).
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
.model tiny
.code
.startup
 
;переход в графический режим
mov ax,0013h
int 10h
 
;инициализировать мышь
xor ax,ax
int 33h
 
;включить курсор. Пока стандартный.
mov ax,0001h
int 33h
 
;установим позицию курсора
mov dh,1
mov dl,1
call SetPos
 
;печатаем сообщение
mov bl,10       ;Цвет
mov si,offset mes   ;Выводим текст
call OutText
 
;ждем нажатия любой клавиши
xor ah,ah
int 16h
 
;настройка es на ds
push ds
pop es
 
;собственно замена курсора, с которой проблема
;должна произойти до отображения курсора
mov ax,0009h
mov bx,0
mov cx,0
lea dx,mas_1
int 33h
 
mov dh,2
mov dl,1
call SetPos
 
;печатаем сообщение
mov bl,10       ;Цвет
mov si,offset mes2  ;Выводим текст
call OutText
 
;ждем нажатия коавиши
xor ah,ah
int 16h
 
;текстовый режим
mov ax,3
int 10h
 
;выходим нах
int 20h
 
;подпрограмма установки позиции курсора
SetPos:
        mov ah,2
        xor bh,bh
        int 10h
        ret
 
;подпрограмма вывода текста
OutText:
        lodsb
        test al,al
        jz done
        mov ah,0eh
        xor bh,bh
        int 10h
        jmp SHORT OutText
done:       ret
 
;определение маски для изображения
mas_1:
     dw 1011111111111111b
     dw 1001111111111111b
     dw 1000111111111111b
     dw 1000011111111111b
     dw 1000001111111111b
     dw 1000000111111111b
     dw 1000000011111111b
     dw 1000000001111111b
     dw 1000000000111111b
     dw 1000000000011111b
     dw 1000000111111111b
     dw 1000000011111111b
     dw 1011000011111111b
     dw 1111100001111111b
     dw 1111100001111111b
     dw 1111110001111111b
 
     dw 0100000000000000b
     dw 0110000000000000b
     dw 0101000000000000b
     dw 0100100000000000b
     dw 0100010000000000b
     dw 0100001000000000b
     dw 0100000100000000b
     dw 0100000010000000b
     dw 0100000001000000b
     dw 0100000111100000b
     dw 0100111000000000b
     dw 0111100100000000b
     dw 0100100100000000b
     dw 0000010010000000b
     dw 0000010010000000b
     dw 0000001110000000b
mes:
     db 'NORMAL mouse. Press any key...',0
mes2:
     db 'OS/2 mouse. Press any key...',0
END
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.05.2014, 19:55
Ответы с готовыми решениями:

Вывести прямоугольник 10х10 ярко-зеленого цвета в правый нижний угол экрана: откомментировать код
Очень прошу помочь написать этот код и оставить комментарии. Заранее всем огромное спасибо!

Вывести поточные координаты курсора мыши относительно формы и экрана, при нажатии на кнопку-реверсное изменение кнопок мыши C++
доброй ночи, уважаемые программисты, умные школьники, преуспевающие студенты, а также все участники этого форума. помогите, пожалуйста,...

Устанавка указателя в левый нижний угол экрана
Пожалуйста помогите написать программу на ассемблере. Устанавливающую указатель в левый нижний угол экрана. В строку 24, столбец 00

13
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
01.06.2014, 14:19
Лучший ответ Сообщение было отмечено Militer как решение

Решение

https://www.cyberforum.ru/post4521110.html
В стр. 79 координаты пересчитайте 25*80-tpt_sz - нижний левый угол.
1
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
03.06.2014, 15:13  [ТС]
Почему-то не работает. а можно совместить вывод координат с кодом выше?
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
03.06.2014, 15:28
Цитата Сообщение от Militer Посмотреть сообщение
Почему-то не работает.
Потому что я был невнимателен. Стр 79:
mov di, (80*25-tpt_sz)*2
1
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
05.06.2014, 23:31  [ТС]
значение подвисает и не меняется. В чем причина?
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
06.06.2014, 03:09
Цитата Сообщение от Militer Посмотреть сообщение
значение подвисает и не меняется. В чем причина?
Militer,
об этом можно говорить, если видишь полный текст твоей программы и текст бат-файла, которым эту программу собирают
0
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
09.06.2014, 13:03  [ТС]
У меня не работает код с координатами, который скинул Charles Kludge, мне нужно чтобы прорисовывался курсор и выводились координаты. В коде, который я скинул, рисуется курсор, но нет координат.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
09.06.2014, 15:52
Лучший ответ Сообщение было отмечено Militer как решение

Решение

Militer, вобщем, работает. Координаты мыси и кнопки в левом нижнем углу.
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
.286
.MODEL  tiny
.CODE
    ORG 100h
start:
;переход в графический режим
    mov ax,0013h
    int 10h
 
;инициализировать мышь
    xor ax,ax
    int 33h
 
    mov ax, 0fh
    mov cx, 10h
    mov dx, cx
    int 33h
; Обработчик событий
    mov ax, 000Ch
    mov cx, 07Fh    ; флаги событий для вызова п/п
;Bitfields for mouse call mask:
 
;Bit(s) Description 
; 0 call if mouse moves
; 1 call if left button pressed
; 2 call if left button released
; 3 call if right button pressed
; 4 call if right button released
; 5 call if middle button pressed (Mouse Systems/Logitech/Genius mouse)
; 6 call if middle button released (Mouse Systems/Logitech/Genius mouse)
; 7-15  unused
    lea dx, msISR   ; адрес п/п
    int 33h
 
; вызываем п/п для первичной отрисовки шаблончика координат
    call    far ptr msISR
 
;включить курсор. Пока стандартный.
    mov ax,0001h
    int 33h
 
;установим позицию курсора
    mov dh,1
    mov dl,1
    call    SetPos
 
;печатаем сообщение
    mov bl,10           ;Цвет
    mov si,offset mes       ;Выводим текст
    call    OutText
 
;ждем нажатия любой клавиши
    xor ah,ah
    int 16h
 
;настройка es на ds
    push    ds
    pop es
 
;собственно замена курсора, с которой проблема
;должна произойти до отображения курсора
    mov ax,0009h
    mov bx,0
    mov cx,0
    lea dx,mas_1
    int 33h
 
    mov dh,2
    mov dl,1
    call    SetPos
 
;печатаем сообщение
    mov bl,10           ;Цвет
    mov si,offset mes2      ;Выводим текст
    call    OutText
 
;ждем нажатия коавиши
    xor ah,ah
    int 16h
; Отменить обработичк
    mov ax, 000Ch
    mov cx, 0000h
    int 33h
 
;текстовый режим
    mov ax,3
    int 10h
 
;выходим нах
    int 20h
 
;подпрограмма установки позиции курсора
SetPos:
    mov ah,2
    xor bh,bh
    int 10h
    ret
 
;подпрограмма вывода текста
OutText:
    lodsb
    test    al,al
    jz  done
    mov ah,0eh
    xor bh,bh
    int 10h
    jmp SHORT OutText
done:       ret
 
msISR:
    push    ds
    push    es
    push    cs
    pop es
    test    ax, 1   ; перемещение?
    jnz @1
    call    btn
    jmp @2
@1: lea di, y_end   ; хвост шаблончика координат
; чтобы выводить в знакоместах, CX и DX надо делить на 8 -> shr dx, 3
    push    cx
    mov ax,dx
    std     ; писать будем с хвоста, задом наперёд
    mov bx, 10  ; делитель
    call    cnv ; преобразуем Y
    dec di      ; пропускаем ':'
    pop ax
    call    cnv ; преобразуем X
@2: cld
    push    cs
    pop ds
; Вывод координат
 
    mov dl, 0   ; row
    mov dh, 24  ; col
    mov ah, 02h
    int 10h
    std
    mov cx, 11  ; tpt_sz
    mov ah, 0Ah
    lea si, mas_1
    mov bx, 00000011B   ; color: cyan on black
; цикл вывода
disp:
    lodsb
    int 10h
    loop    disp
    cld
    pop es
    pop ds
    retf
; обработка кнопок
btn:    test    ax, 110b    ; левая кнопка?
    jz  @3
    xor cs:_l, 6Ch      ; да, перебрасываем флаг: 20 xor 6Ch = 'L' или пробел
@3: test    ax, 11000b  ; правая кнопка?
    jz  @4
    xor cs:_r, 72h  ; да, перебрасываем флаг: 20 xor 72h = 'R' или пробел
@4: test    bx, 1100000b    ; средняя кнопка?
    jz  @5
    xor cs:_m, 6Dh  ; да, перебрасываем флаг: 20 xor 6Dh = 'M' или пробел
 
@5: ret
; Преобразование числа в строку
;   es:di - endbuf
cnv:    call    @@1
    call    @@1
@@1:    div bl      ; делим на 10.
    xchg    ah, al
    add al, 30h     ; в ASCII
    stosb                   ; сохраняем
    shr ax, 8
    ret
x   db '000:000'        ; шаблончик для вывода
y_end   = $ - 1
_l  db  20h     ;
_m  db  20h
_r  db  20h
tpt_sz  = $ - x
 
;определение маски для изображени
mas_1:
    dw  1011111111111111b
    dw  1001111111111111b
    dw  1000111111111111b
    dw  1000011111111111b
    dw  1000001111111111b
    dw  1000000111111111b
    dw  1000000011111111b
    dw  1000000001111111b
    dw  1000000000111111b
    dw  1000000000011111b
    dw  1000000111111111b
    dw  1000000011111111b
    dw  1011000011111111b
    dw  1111100001111111b
    dw  1111100001111111b
    dw  1111110001111111b
 
    dw  0100000000000000b
    dw  0110000000000000b
    dw  0101000000000000b
    dw  0100100000000000b
    dw  0100010000000000b
    dw  0100001000000000b
    dw  0100000100000000b
    dw  0100000010000000b
    dw  0100000001000000b
    dw  0100000111100000b
    dw  0100111000000000b
    dw  0111100100000000b
    dw  0100100100000000b
    dw  0000010010000000b
    dw  0000010010000000b
    dw  0000001110000000b
mes:
    db  'NORMAL mouse. Press any key...',0
mes2:
    db  'OS/2 mouse. Press any key...',0
    END start
1
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
09.06.2014, 16:08  [ТС]
Почему-то у меня вот так.
Миниатюры
Вывести координаты мыши в нижний угол экрана   Вывести координаты мыши в нижний угол экрана  
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
09.06.2014, 16:14
Проблемы эмо эмуляторов... В хрюше из-под cmd в полном экране всё работает.
1
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
09.06.2014, 16:21  [ТС]
а можно ссылку? и скрины рабочей, если не трудно
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
09.06.2014, 16:52
Цитата Сообщение от Militer Посмотреть сообщение
а можно ссылку?
Какую ссылку? Windows_XP_SP2_X86_eng.
Цитата Сообщение от Militer Посмотреть сообщение
и скрины рабочей
Не получается.
Вобщем, выковырял из архива забавную вещь - граф. курсор в текстовом режиме(игры с портами знакогенератора VGA), дописал вывод координат. Сразу предупреждаю, писано в 1992 и для себя, так что там чёрт ногу сломит, но работает.
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
        assume  cs:ddd,ds:ddd
        ddd segment
        org 100h
start:      jmp boot
        db  'Smoothly Mickey Mouse, (#)1992, 2014 by Charles Kludge',26,0
boot:       
; reset mouse
        xor ax,ax
        int 33h
; enable mouse drv
        mov ax,20h
        int 33h
; hide mouse
        mov ax,2
        int 33h
; position 0,0
        xor cx,cx
        xor dx,dx
        mov ax,4
        int 33h
;
        call    init
;
        mov ax,0bh
        int 33h
        mov cx, 07Fh
        mov ax,0ch
        push    cs
        pop es
        mov dx,offset cs:msdrv
        int 33h     ; set mouse ISR
 
        call    save
 
        mov ax,1
        mov si,0
        mov di,0
        call    far ptr cs:msdrv
 
loo:        xor ax,ax
        int 16h
        cmp     ax,4800h        ; up
        jnz ss_1
        cmp word ptr cs:yy,0
        jz  ss_11
        dec word ptr cs:yy
        jmp cmn
ss_11:      mov ax,word ptr cs:bpc
        mov word ptr cs:yy,ax
        jmp cmn
        ;
ss_1:       cmp     ax,5000h                ; dn
        jnz ss_2
        mov ax,word ptr cs:bpc
        cmp word ptr cs:yy,ax
;       jz  ss_21
        inc word ptr cs:yy
        jmp cmn
ss_21:      mov word ptr cs:yy,0
        jmp cmn
 
        ;
ss_2:       cmp     ax,4D00h        ; rt
        jnz ss_3
        cmp word ptr cs:xx,7
;       jz  ss_31
        inc word ptr cs:xx
        jmp cmn
ss_31:      mov word ptr cs:xx,0
        jmp cmn
        ;
ss_3:       cmp     ax,4B00h        ; lf
        jnz ss_4
        cmp word ptr cs:xx,0
        jz  ss_41
        dec word ptr cs:xx
        jmp cmn
ss_41:      mov word ptr cs:xx,7
        jmp cmn
        ;
ss_4:       cmp     al,27           ; esc
        jz  bye
        jmp loo
cmn:        mov si,word ptr cs:xx
        mov di,word ptr cs:yy
        mov ax,1
        call    far ptr cs:msdrv
        jmp loo
 
bye:        call    restore
        xor ax,ax
        int 33h
        mov ax,21h
        int 33h
        ;
        call    rsfnt
        ;
        int 20h
xx:     dw  0
yy:     dw  0
;
init:       xor ax,ax
        mov es,ax
        push    cs
        pop ds
        ;
        mov al,byte ptr es:[484h]
        inc al
        mov byte ptr rows,al    ; rows on screen
        ;
        mov ax,word ptr es:[44Ah]
        shl ax,1
        mov word ptr cols,ax    ; columns on screen
        ;
        mov ax,word ptr es:[485h]
        mov byte ptr bpc,al     ; char height
        ;
        mov ax,0b000h
        mov bx,word ptr es:[463h]
        cmp bx,03B4h
        jz  i_1
        or  ax,800h
i_1:        mov word ptr cs:cptr+2,ax    ; video buffer seg addr
        mov word ptr cs:cptr,0
        ;
i_2:
        ;
        call    svfnt
        ;
        retn
;
svfnt:
        push    si
        push    di
        xor si,si
        mov di,2000h
        call    sv_rs
        call    ope
        mov ax,0A000h
        mov es,ax
        mov ds,ax
        mov cx,40h
        mov di,1600h
        mov si,di
sf_1:       lodsb
        shl al,1
        stosb
        loop    sf_1
        call    clo
        pop di
        pop si
        ret
 
rsfnt:
        push    si
        push    di
 
        xor di,di
        mov si,2000h
 
        call    sv_rs
        pop di
        pop si
        ret
 
sv_rs:      push    es
        push    ds
        cld
        call    ope
 
        mov ax,0A000h
        mov es,ax
        mov ds,ax
        mov cx,1000h
        rep movsw
 
        call    clo
        pop ds
        pop es
        ret
 
;
;Bitfields for mouse call mask:
 
;Bit(s) Description 
; 0 call if mouse moves
; 1 call if left button pressed
; 2 call if left button released
; 3 call if right button pressed
; 4 call if right button released
; 5 call if middle button pressed (Mouse Systems/Logitech/Genius mouse)
; 6 call if middle button released (Mouse Systems/Logitech/Genius mouse)
; 7-15  unused
;       AX = condition mask (same bit assignments as call mask)
;       BX = button state
;       CX = cursor column
;       DX = cursor row
;       SI = horizontal mickey count
;       DI = vertical mickey count
msdrv:
        cli
        push    es
        push    ds
        push    cs
        pop ds
        mov word ptr cs:[xx],cx
        mov word ptr cs:[yy],dx
        ;
        test    ax,1
;       jnz ms_mm0
        call    btn
ms_mm0:     cmp di,0
        jns ms_1
        xor di,di
        ;
ms_1:       mov ax,si
        mov cx,3
        shr ax,cl
        shl ax,1                    ; x mickeys / 4
        mov word ptr cs:xpos,ax
        ;
        and si,07h
        mov word ptr cs:d_x,si
        ;
        mov ax,di
        mov bx,word ptr cs:bpc
        div bl
        mov byte ptr cs:d_y,ah
        xor ah,ah
        mov word ptr cs:ypos,ax
        ;
        cld
        call    restore
        mov ax,word ptr cs:ypos
        mul word ptr cs:cols    ; linear offset in video buffer
        add ax,word ptr cs:xpos
        mov bx,word ptr cs:d_x
        mov word ptr cs:cptr,ax
        call    save
        call    movec
done:       call    coord
        pop ds
        pop es
        sti
        retf
;
restore:    push    cx
        push    dx
        push    di
        push    si
        ;
        les di,dword ptr cs:cptr
        push    cs
        pop ds
        cld
        mov si,offset s1
        movsb
        ;
        inc di
        movsb
        add di,word ptr cs:cols
        sub di,3
        movsb
        ;
        inc di
        movsb
        ;
        pop si
        pop di
        pop dx
        pop cx
        retn
;
save:
        lds si,dword ptr cs:cptr
        push    cs
        pop es
        cld
        lodsb
        mov byte ptr cs:s1,al
        mov byte ptr ds:[si-1],211
        inc si
        ;
        lodsb
        mov byte ptr cs:s2,al
        cmp al,0c0h
        jb  sv_1
        cmp al,0e0h
        ja  sv_1
        mov byte ptr ds:[si-1],216
        mov word ptr cs:mv_chr,0a0h
        jmp sv_2
sv_1:       mov byte ptr ds:[si-1],241
        mov word ptr cs:mv_chr,3c0h
sv_2:       add si,word ptr cs:cols
        sub si,3
        ;
        lodsb
        mov byte ptr cs:s3,al
        mov byte ptr ds:[si-1],209
        inc si
        ;
        lodsb
        mov byte ptr cs:s4,al
        cmp al,0c0h
        jb  sv_3
        cmp al,0e0h
        ja  sv_3
        mov byte ptr ds:[si-1],210
        mov word ptr cs:mv_chr1,20h
        jmp sv_4
sv_3:       mov byte ptr ds:[si-1],242
        mov word ptr cs:mv_chr1,420h
sv_4:
 
        retn
;
movec:
        push    bp
        push    es
        push    ds
        cld
        call    ope
 
        mov bx,offset cs:msk_and
        mov ax,word ptr cs:bpc
        sub ax,word ptr cs:d_y
        mov word ptr cs:y_off,ax
        mov ax,0A000h
        mov es,ax
        mov ds,ax
        xor ax,ax
        mov di,1a60h
        mov al,byte ptr cs:s1
        mov cx,5
        shl ax,cl
        mov si,ax
        xor ax,ax
        mov al,byte ptr cs:s2
        shl ax,cl
        sub ax,si
        dec ax
        mov word ptr cs:chr2,ax
 
        mov bp,16
 
        mov cx,word ptr cs:bpc
mv_1:
        lodsb
        xchg    ah,al
        push    si
        add si,word ptr cs:chr2
        lodsb
        pop si
        cmp cx,word ptr cs:y_off
        ja  mv_2
        cmp bp,0
        jz  mv_2
        push    cx
 
        mov cx,word ptr cs:d_x
        xor dx,dx
        mov dh, byte ptr cs:[bx]
        shr dx,cl
        not dx
        and ax,dx
        xor dx,dx
        mov dh, byte ptr cs:[bx+16]
        shr dx,cl
        or  ax,dx
 
        pop cx
 
        inc bx
        dec bp
 
mv_2:
        mov byte ptr es:[di+03c0h],al
mv_chr      equ $ - 2
        xchg    ah,al
            stosb
        loop    mv_1
 
        xor ax,ax
        mov di,1a20h
        mov al,byte ptr cs:s3
        mov cx,5
        shl ax,cl
        mov si,ax
        xor ax,ax
        mov al,byte ptr cs:s4
        shl ax,cl
        sub ax,si
        dec ax
        mov word ptr cs:chr2,ax
        ;
        mov cx,word ptr cs:bpc
mv_11:
        lodsb
        xchg    ah,al
        push    si
        add si,word ptr cs:chr2
        lodsb
        pop si
 
        cmp bp,0
        jz  mv_21
        push    cx
 
        mov cx,word ptr cs:d_x
        xor dx,dx
        mov dh, byte ptr cs:[bx]
        shr dx,cl
        not dx
        and ax,dx
        xor dx,dx
        mov dh, byte ptr cs:[bx+16]
        shr dx,cl
        or  ax,dx
 
        pop cx
 
        inc bx
        dec bp
 
mv_21:
 
        mov byte ptr es:[di+03c0h],al
mv_chr1     equ $ - 2
        xchg    ah,al
            stosb
        loop    mv_11
 
mv_4:       call    clo
        pop ds
        pop es
        pop bp
        retn
chr2:       dw  ?
y_off:      dw  ?
;
ope:        push    si
        mov si,offset cs:open
        call    prgdev
        call    prgdev
        pop si
        retn
;
clo:        mov si,offset cs:close
        call    prgdev
        call    prgdev
        retn
;
prgdev:     clc
        lods    word ptr cs:[si]
        mov dx, ax
        lods    word ptr cs:[si]
        mov cx, ax
        cli
ll1:        lods    word ptr cs:[si]
        out dx, ax
        loop    ll1
        sti
        retn
 
coord:      lea di, y_end   ; хвост шаблончика координат
; чтобы выводить в знакоместах, CX и DX надо делить на 8 -> shr dx, 3
;   push    cx
;   mov ax,dx
    std     ; писать будем с хвоста, задом наперёд
    mov bx, 10  ; делитель
    mov ax, word ptr cs:[yy]
    call    cnv ; преобразуем Y
    dec di      ; пропускаем ':'
;   pop ax
    mov ax, word ptr cs:[xx]
    call    cnv ; преобразуем X
@2: cld
    push    cs
    pop ds
; Вывод в видеопамять
    mov cx, tpt_sz  ; длина шаблончика
    mov ax, 0B800h  ; видеосегмент
    mov es, ax
    mov di, (80*25-tpt_sz)*2 ;008Ch ; смещение в видеобуффере (80-tpt_sz)*2
    mov ah, 00000011B   ; color: cyan on black
    lea si, x
; цикл вывода
disp:
    lodsb
    stosw
    loop    disp
;   pop es
;   pop ds
    ret
 
; обработка кнопок
btn:    test    ax, 110b    ; левая кнопка?
    jz  @3
    xor cs:_l, 6Ch      ; да, перебрасываем флаг: 20 xor 6Ch = 'L' или пробел
@3: test    ax, 11000b  ; правая кнопка?
    jz  @4
    xor cs:_r, 72h  ; да, перебрасываем флаг: 20 xor 72h = 'R' или пробел
@4: test    bx, 1100000b    ; средняя кнопка?
    jz  @5
    xor cs:_m, 6Dh  ; да, перебрасываем флаг: 20 xor 6Dh = 'M' или пробел
@5: ret
; Преобразование числа в строку
;   es:di - endbuf
cnv:    call    @@1
    call    @@1
@@1:    div bl      ; делим на 10.
    xchg    ah, al
    add al, 30h     ; в ASCII
    stosb                   ; сохраняем
    shr ax, 8
    ret
;
open:       dw  3C4h, 2, 0402h, 0704h, 3CEh, 3, 0204h, 0005, 0006
close:      dw  3C4h, 2, 0302h, 0304h, 3CEh, 3, 0004, 1005h, 0E06h
 
msk_and:
        db  000h,000h,0E0h,0B0h,098h,08Ch,086h,083h,081h,087h,0B2h,0EBh,009h,00Fh,000h,000h; 0D2
        db  000h,000h,000h,040h,060h,070h,078h,07Ch,07Eh,078h,04Ch,004h,006h,000h,000h,000h; 0D3
 
rows:       dw  0       ; rows on screen
cols:       dw  0       ; cols * 2 ( bytes per line )
bpc:        dw  0       ; bytes per chr
d_x:        dw  0       ;
d_y:        dw  0
x   db '000:000'        ; шаблончик для вывода
y_end   = $ - 1
_l  db  20h     ;
_m  db  20h
_r  db  20h
tpt_sz  = $ - x
 
cptr:       dw  0       ; char ptr
        dw  0
 
s1      db  0       ; saved chars
s2      db  0
s3      db  0
s4      db  0
xpos        dw  0
ypos        dw  0
;public scr
;scr:       db  4096 dup(1)
$end$:
ddd ends
    end start
2
1 / 1 / 0
Регистрация: 12.03.2013
Сообщений: 44
09.06.2014, 17:02  [ТС]
Спасибо, работает
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
10.06.2014, 00:20
Еще вариант:
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
.model tiny
.code
.386
ORG 100h
START:
    mov ax,12h  ;640*480
    int 10h
 
    mov ax,1    ;показать курсор 
    int 33h
m1:
    mov dh,29   ;Y
    mov dl,1    ;X
    mov ah,2    ;установить курсор для строки
    xor bh,bh
    int 10h
 
    mov ax,3    ;получить положение курсора
    int 33h
push dx
    mov ax,cx
    call OutInt ;вывод на экран
    mov al,':'
    int 29h
pop ax
    call OutInt
 
    in al,60h   ; прочитать скан-код последнего символа,
    cmp al,81h  ; если это 81h (отпускание клавиши Esc),
    jnz short m1
 
    mov ax,3    ;текстовый режим
    int 10h
 
    ret     ;завершить программу
 
OutInt:
    mov cx,3
    mov bx,10 ; основание сс. 10 для десятеричной и т.п.
oi2:
    xor dx,dx
    div bx
    push dx
    loop oi2
 
    mov cx,3
oi3:
    pop ax
    add al,'0'
    int 29h
    loop oi3
 
    ret
 
end start
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2014, 00:20
Помогаю со студенческими работами здесь

Движение окружности по диагонали из правого верхнего в левый нижний угол экрана
Сделайте программу, пожалуйста. Написать программу движения по экрану окружности радиусом 10 по диагонали из правого верхнего в левый...

Вывести заданный текст в правый нижний угол графического окна
Напишите процедуру TextOutRightBottomCorner, которая выводит заданный текст в правый нижний угол графического окна. Текст должен...

Вывести на экран матрицу, левый нижний угол заполнять нулями
Программа должна выводить на экран матрицу, левый нижний угол заполнять нулями. Помогите, пожалуйста как-нибудь объединить 2 массива ...

Получить координаты мыши с экрана
Здравствуйте, я тут пытаюсь получить координаты стрелки мыши когда елозишь ею по экрану, получается только получать координаты формы, а как...

Вывести координаты мыши [WIN API]
Пишу на NASM простейшее WIN32 приложение, требуется вывести на экран (в окно) координаты мыши. Сделал обработку сообщений, на событие...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru