Does not write on screen, turns black and should appear a square 2x2

Asked

Viewed 85 times

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

1 answer

2


In VGA video mode (13h), it is possible to plot the points in two different ways:

1) Accessing the service 0Ch 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 the address A000:0000:

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

Follow some links (in English) as reference:

Below is an amended and commented version of your code, which plots the dots 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 was compiled with Turbo Assembler Version 3.2 and Turbo Link version 5.1, running on Dosbox version 0.74.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.