Квадрат, движущийся по нажатию кнопок - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите!!! Квадрат(должен быть разукрашенным) движущая по нажатью кнопок(вверх, вниз, направо, налево)!!!Еще помогите вывести вертикальные линии циклом!!!Ассемблер
assume cs:mycode,ds:mydate,ss:mystack 
mycode segment para 
start: 
mov ax, seg mydate 
mov ds,ax 
 
begin:
mov AX,00h
mov AL,10h
int 10h
rgr:    mov SI,300
    mov DX,110
    mov CX,10
    call vertical
mov SI,301
    mov DX,110
    mov CX,10
    call vertical
mov SI,302
    mov DX,110
    mov CX,10
    call vertical
mov SI,303
    mov DX,110
    mov CX,10
    call vertical
mov SI,304
    mov DX,110
    mov CX,10
    call vertical
mov SI,305
    mov DX,110
    mov CX,10
    call vertical
........ еще помогите вывести циклом
 
key:    mov ah,8
    int 21h
    cmp al,1bh
    jz exit
    cmp al,0
    jnz key
    int 21h
    cmp al,4bh  
    jz left
    cmp al,48h
    jnz key
left: ................
.................
.............
    
exit:   mov AX,4C00h
    int 21h
 
vertical proc
v:
push CX
mov AH,0Ch
mov AL,6
mov BH,0
mov CX,SI
int 10h
inc DX
pop CX
loop v
ret
vertical endp

mycode ends 
mydate segment para 
mydate ends 
 
mystack segment para stack 'stack' 
dw 128 dup (0) 
mystack ends 
 
end start
end begin

Решение задачи: «Квадрат, движущийся по нажатию кнопок»

textual
Листинг программы
.model small
 
.stack 100h
 
.data
        ;коды, возвращаемые int 16h ah=00h
        kbArrowUp       equ     4800h
        kbArrowDown     equ     5000h
        kbArrowLeft     equ     4B00h
        kbArrowRight    equ     4D00h
        kbEsc           equ     011Bh
        ;коды цветов символов и точек в графическом режиме
        Red             equ     4
        Gray            equ     7
        Blue            equ     1
        White           equ     15
 
        Mode0D_W        equ     320     ;ширина экрана в пикселях для видеорежима 0Dh
        Mode0D_H        equ     200     ;высота экрана в пикселях для видеорежима 0Dh
        Mode0D_C        equ     16      ;количество цветов для видеорежима 0Dh
        Mode0D_A        equ     0A000h  ;начальный адрес видеопамяти для видеорежима 0Dh
 
        VideoPage       db      ?       ;номер видеостраницы
 
        Xstart          dw      100     ;координаты начала прямоугольника
        Ystart          dw      70
 
;        Xcurr           dw      ?       ;текущие координаты левого верхнего угла строки
;        Ycurr           dw      ?
 
        sqColor         dw      1       ;цвет выводимого прямоугольника
        sqWidth         dw      37      ;ширина прямоугольника
        sqHeight        dw      37      ;высота прямоугольника
 
;макрос для упрощения вызова процедур с параметрами
invoke  macro   CallProc, Params
        IRP     P, <Params>
                mov     ax,     P
                push    ax
        endm
        call    CallProc
endm
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ; установка графического видео режима
        mov     ax,     000Dh
        int     10h
 
        mov     ah,     0Fh     ;уточнение параметров видеорежима
        int     10h
        mov     [VideoPage],    bh
 
        invoke  Bar, <[sqHeight], [sqWidth], [Ystart], [Xstart], [sqColor]>
 
        @@GetCmd:
                ;ожидание нажатия любой клавиши
                mov     ah,     00h
                int     16h
                ;обработка команды
        @@TestCmd1:
                cmp     ax,     kbArrowUp
                jne     @@TestCmd2
                mov     dx,     [Ystart]
                cmp     dx,     0
                je      @@GetCmd
                dec     dx
                mov     cx,     [Xstart]
                jmp     @@Redraw
        @@TestCmd2:
                cmp     ax,     kbArrowDown
                jne     @@TestCmd3
                mov     dx,     [Ystart]
                add     dx,     [sqWidth]
                cmp     dx,     Mode0D_H
                jae     @@GetCmd
                mov     dx,     [Ystart]
                inc     dx
                mov     cx,     [Xstart]
                jmp     @@Redraw
        @@TestCmd3:
                cmp     ax,     kbArrowLeft
                jne     @@TestCmd4
                mov     cx,     [Xstart]
                cmp     cx,     0
                je      @@GetCmd
                dec     cx
                mov     dx,     [Ystart]
                jmp     @@Redraw
        @@TestCmd4:
                cmp     ax,     kbArrowRight
                jne     @@TestCmd5
                mov     cx,     [Xstart]
                add     cx,     [sqWidth]
                cmp     cx,     Mode0D_W
                jae     @@GetCmd
                mov     cx,     [Xstart]
                inc     cx
                mov     dx,     [Ystart]
                jmp     @@Redraw
        @@TestCmd5:
                cmp     ax,     kbEsc
                jne     @@GetCmd
                jmp     @@StopCmdLoop
        @@Redraw:
                invoke  Bar, <[sqHeight], [sqWidth], [Ystart], [Xstart], 0>
                mov     ax,     [sqColor]
                inc     ax                      ;Color++
                cmp     ax,     Mode0D_C        ;if (Color>MaxColor)
                sbb     bx,     bx              ;  Color=1
                and     ax,     bx
                cmp     ax,     1
                adc     ax,     0
                mov     [sqColor],      ax
                mov     [Xstart],       cx
                mov     [Ystart],       dx
                invoke  Bar, <[sqHeight], [sqWidth], dx, cx, [sqColor]>
        jmp     @@GetCmd
@@StopCmdLoop:
        ;переключение в текстовый режим
        mov     ax,     0003h
        int     10h
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
;рисование полосы (залитого прямоугольника)
;на входе:
; color - цвет заливки
; x_pos, y_pos - координаты левого верхнего угла
; x_size, y_size - размеры прямоугольника
;на выходе:
; -
Bar     proc    color: word, x_pos:word, y_pos: word, x_size: word, y_size: word
        push    bp                      ;формирование кадра параметров
        mov     bp,     sp
 
        push    ax                      ;сохранение регистров
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        mov     ah,     0Ch             ; настройка параметров для вызова функции 0Ch
        mov     al,     byte ptr color           ;цвет точек
        mov     bh,     0               ;номер видеостраницы
        mov     dx,     y_pos           ;строка
        mov     cx,     x_pos           ;колонка
 
        mov     di,     y_size
@@Vertical:
 
        mov     cx,     x_pos           ;колонка
        mov     si,     x_size          ;вывести x_size точек в горизонтальной линии
@@Horizontal:
        int     10h                     ;вывести точку
        inc     cx                      ;прирастить координату x
        dec     si
        jnz     @@Horizontal
 
        inc     dx                      ;переход к следующей горизонтальной линии с
        dec     di
        jnz     @@Vertical
 
        pop     di                      ;восстановление рагистров
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
 
        pop     bp
        ret     10                      ;удаление параметров из стека
Bar     endp
 
end     main

Объяснение кода листинга программы

Квадрат, движущийся по нажатию кнопок .model small .stack 100h .data kbArrowUp equ 4800h kbArrowDown equ 5000h kbArrowLeft equ 4B00h kbArrowRight equ 4D00h kbEsc equ 011Bh Red equ 4 Gray equ 7 Blue equ 1 White equ 15 Mode0D_W equ 320 Mode0D_H equ 200 Mode0D_C equ 16 Mode0D_A equ 0A000h Xstart equ 100 Ystart equ 70 SquareColor equ 1 SquareWidth equ 37 SquareHeight equ 37 .code main: mov ax, @data mov ds, ax mov ax, 000Dh int 10h mov bh, [VideoPage] invoke Bar, <[SquareHeight], [SquareWidth], [Ystart], [Xstart], [SquareColor]> @@GetCmd: mov ah, 00h int 16h @@TestCmd1: cmp ax, kbArrowUp jne @@TestCmd2 mov dx, [Ystart] cmp dx, 0 je @@GetCmd dec dx mov cx, [Xstart] jmp @@Redraw @@TestCmd2: cmp ax, kbArrowDown jne @@TestCmd3 mov dx, [Ystart] add dx, [SquareWidth] cmp dx, [Mode0D_H] jae @@GetCmd inc dx mov cx, [Xstart] jmp @@Redraw @@TestCmd3: cmp ax, kbArrowLeft jne @@TestCmd4 mov cx, [Xstart] cmp cx, 0 je @@GetCmd dec cx mov dx, [Ystart] jmp @@Redraw @@TestCmd4: cmp ax, kbArrowRight jne @@TestCmd5 mov cx, [Xstart] add cx, [SquareWidth] cmp cx, [Mode0D_W] jae @@GetCmd inc cx mov dx, [Ystart] jmp @@Redraw @@TestCmd5: cmp ax, kbEsc jne @@GetCmd jmp @@StopCmdLoop @@Redraw: invoke Bar, <[SquareHeight], [SquareWidth], dx, cx, [SquareColor]> mov ax, [SquareColor] inc ax cmp ax, [Mode0D_C] sbb bx, bx and ax, bx mov [SquareColor], ax mov [Xstart], cx mov [Ystart], dx invoke Bar, <[SquareHeight], [SquareWidth], dx, cx, [SquareColor]> @@StopCmdLoop: mov ax, 0003h int 10h mov ax, 4C00h int 21h end main

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы