Do not write on the screen, turn black and should appear a square 2x2

3
Pos_Bloco_Ini_x  dw 30 ; posição inicial do bloco em x
Pos_Bloco_Ini_y dw 30 ; posição inicial do bloco em y
Tam_Bloco DW 2 ;tamanho do bloco

MOV AH, 00h ;Prepara para definir o modo graf.
    MOV AL, 13h ;Modo graf. 320x200 color mode 
    INT 10h ;Invoca  a interrupção 10h da BIOS


DESENHAQUADRADO PROC NEAR
    push ax
    push bx
    push cx
    push dx


    mov cx, Pos_Bloco_Ini_x ;Posicao x do inicio do bloco
    mov bx, Pos_Bloco_Ini_x ;Iniciar a posicao final do bloco(x)passando para um registo para a seguir ser feita a adicao do tamanho
    mov dx, Pos_Bloco_Ini_y ;Posicao y do bloco
    mov ax, Pos_Bloco_Ini_y ;Iniciar a posicao final do bloco(y) passando para um registo para a seguir ser feita a adicao do tamanho

    add bx, Tam_Bloco ;adiciona a posicao inicial o tamanho do bloco e guarda no registo bx
    add ax, Tam_Bloco
    MOV Pos_Bloco_Fin_x, bx ;guarda na variavel Pos_Bloco_Fin_x o valor anterior de bx(Posicao inicial + tamanho do bloco)
    mov Pos_Bloco_Fin_y, ax
    mov ax, Pos_Bloco_Fin_y
    xor ax, ax
    xor bx, bx

    DESENHALINHA:       
        mov AH, 0010B ;cor do pixel
        ;mov aL, 13h
        INT 10H
        INC CX
        CMP CX, Pos_Bloco_Fin_x
        je MUDALINHA
    JMP DESENHALINHA
    MUDALINHA:
        INC DX
        MOV CX, Pos_Bloco_Ini_x
        CMP DX, Pos_Bloco_Fin_y
        je PARAR
    JMP DESENHALINHA

    PARAR:
        MOV     AH,06h        ; leitura de um caracter, config INT21h
        INT     21H           ; invoca  a interrupção do 21h do DOS
        CMP     AL, 33H ;compara com a tecla '3'
        JE SAIRJOGO
    JMP PARAR

DESENHAQUADRADO ENDP
    
asked by anonymous 12.01.2016 / 18:18

1 answer

2

In VGA video mode (% with%), you can plot points in two different ways:

1) Accessing the 13h service of the BIOS (however, this method is slow ):

mov    ah, 0ch ; serviço 0Ch
mov    bh, 00h ; página de vídeo
mov    al, 0fh ; cor do pixel. 0F -> branco
mov    cx, 09h ; coluna 9
mov    dx, 05h ; linha 5
int    10h     ; plota o ponto em (9, 5)

2) Directly accessing the video memory located at 0Ch :

mov    ax, 0a000h              ; carrega o valor 0a000h ...
mov    es, ax                  ; ... no registrador de segmento es
mov    bx, 02dh                ; offset onde ponto irá aparecer (9, 5)= 5*320 + 9 = 02dh
mov    byte ptr es:[bx], 0fh   ; coloca o valor 0fh (branco) na memória de vídeo

Here are some links for reference:

Below is a modified and commented version of your code, which plots the points directly in the video memory:

.model tiny
.stack 100h
.code
.startup
        mov     ax, cs                  ; carrega ax com o segmento de execução cs
        mov     ds, ax                  ; seta o segmento de dados para o valor de cs
        mov     ah, 00h                 ; Prepara para definir o modo graf.
        mov     al, 13h                 ; Modo graf. 320x200 color mode
        int     10h                     ; Invoca  a interrupção 10h da BIOS
        call    DESENHAQUADRADO         ; chama a função 
        mov     ah, 00h                 ; Prepara para definir o modo graf.
        mov     al, 03h                 ; restaura o modo texto 
        int     10h                     ; Invoca  a interrupção 10h da BIOS
        mov     ax, 4c00h               ; finaliza o programa e retorna para o DOS
        int     21h

DESENHAQUADRADO:
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di

;--------------
; Aqui, utiliza os registradores SI e DI pois 
; os registradores AX e DX serão utilizados
; na operação de multiplicação.
        mov     si, [Pos_Bloco_Ini_x] ;Posicao x do inicio do bloco
        mov     di, [Pos_Bloco_Ini_y] ;Posicao y do bloco

        mov     ax, si
        add     ax, [Tam_Bloco] ;adiciona a posicao inicial o tamanho do bloco e guarda no registo bx
        mov     [Pos_Bloco_Fin_x], ax

        mov     ax, di
        add     ax, [Tam_Bloco] ;adiciona a posicao inicial o tamanho do bloco e guarda no registo bx
        mov     ds: [Pos_Bloco_Fin_y], ax

;--------------
; Carrega o endereço inicial da memória de vídeo no registrador es
        mov     ax, 0a000h
        mov     es, ax


DESENHALINHA:
        mov     ax, di                  ; utilizar o registador si, pois o dx será utilizado na multiplicação
        mov     cx, 0140h               ; carrega o número de linhas da tela = 320
        mul     cx                      ; multiplica pelo número de colunas da tela = 320
        add     ax, si                  ; adiciona a coluna     
        mov     bx, ax                  ; transfere o endereço para bx (endereço só pode ficar em bx, si e di)
        mov     byte ptr es:[bx], 0fh   ; 0fh --> cor branca
        inc     si
        cmp     si, [Pos_Bloco_Fin_x]
        je      MUDALINHA
        jmp     DESENHALINHA

MUDALINHA:
        mov     si, [Pos_Bloco_Ini_x]   ; reseta si para o valor da coluna inicial
        inc     di
        cmp     di, [Pos_Bloco_Fin_y]
        je      PARAR

        jmp     DESENHALINHA

PARAR:
        mov     ah, 06h                 ; leitura de um caracter, config INT21h
        mov     dl, 0ffh                ; nessa chamada, precisa setar dl=0xff
        int     21h                     ; invoca  a interrupção do 21h do DOS
        cmp     al, 33h                 ; compara com a tecla '3'
        je      SAIR
        jmp     PARAR

SAIR:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret

; Bloco de Dados
Pos_Bloco_Ini_x     DW 30  ; posição inicial do bloco em x
Pos_Bloco_Ini_y     DW 30  ; posição inicial do bloco em y
Pos_Bloco_Fin_x     DW ?
Pos_Bloco_Fin_y     DW ?
Tam_Bloco           DW 2          ;tamanho do bloco

end

This program has been compiled with Turbo Assembler Version 3.2 and Turbo Link version 5.1, running in DOSBox version 0.74.

    
26.01.2016 / 22:57