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.