Skip to content

Instantly share code, notes, and snippets.

@plainspooky
Created June 3, 2019 22:50
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save plainspooky/3184aaa04f63ff4869b4be88d5fe3d53 to your computer and use it in GitHub Desktop.
Save plainspooky/3184aaa04f63ff4869b4be88d5fe3d53 to your computer and use it in GitHub Desktop.
Código fonte em assembly da rotina para desenho de janelas em modo texto para utilizar nos seus programas em MSX-BASIC.
CHPUT: equ $00a2
CSRY: equ $f3dc
CSRX equ $f3dd
org $d000-7 ; simula binário do MSX-BASIC
db $fe ; cabeçalho de arquivo binário
dw start_code ; início do código
dw end_code ; final do código
dw main ; endereço de execução
start_code:
position_x: db 0 ; coordenada X da janela
position_y: db 0 ; coodernada Y da janela
width: db 0 ; largura da janela
height: db 0 ; altura da janela
work_x: db 0 ; coordenada X de trabalho
work_y: db 0 ; coordenada Y de trabalho
work_w: db 0 ; largura de trabalho
work_h: db 0 ; altura de trabalho
main:
proc
local __middle_loop
ld ix,CSRX ; 'IX' é a posição X do cursor
ld iy,CSRY ; 'IY' é a posição Y do cursor
call init_work_values ; inicializa as variáveis
ld a,(work_x) ; lê a posição X do cursor
ld (ix+0),a ; posiciona o cursor (X)
ld a,(work_y) ; lê a posição Y do cursor
ld (iy+0),a ; posiciona o cursor (Y)
ld hl,frame_top ; padrão do topo da janela
call draw_frame ; desenha a parte superior da janela
inc (iy+0) ; desce uma linha
ld a,(work_h) ; pega a altura da janela
ld b,a
rept 2
dec b ; desconsidera a moldura no altura
endm
__middle_loop:
push bc ; salva 'BC'
ld a,(work_x) ; lê a posição X do cursor
ld (ix+0),a ; posiciona o cursor (X)
ld hl,frame_middle ; padrão do meio da janela
call draw_frame ; desenha a parte central da janela
inc (iy+0) ; desce uma linha
pop bc ; recupera 'BC'
djnz __middle_loop ; faz o laço
ld a,(work_x) ; lê a posição X do cursor
ld (ix+0),a ; posiciona o cursor (X)
ld hl,frame_bottom ; padrão de baixo da janela
call draw_frame ; desenha a parte de baixo da janela
ret ; retorna pro MSX-BASIC
endp
init_work_values:
proc
local __loop
ld hl,position_x ; diferente do comando LOCATE a
inc (hl) ; posição do cursor é armazenada na
inc hl ; BIOS como começando em 1 ao invés
inc (hl) ; de 0. Aqui retifico isto.
dec hl ; volta HL ao valor original
ld de,work_x ; variáveis de trabalho
ld b,4 ; ao todo são 4 repetições
__loop:
ld a,(hl) ; lê a variável do usuário
ld (de),a ; grava na área de trabalho
inc hl ; próxima variável do usuário
inc de ; próxima variável de trabalho
djnz __loop ; faz o laço
ret ; fim da rotina
endp
draw_frame:
proc
local __draw_loop
__draw_frame:
ld e,(iy+0) ; salva a linha atual
ld a,(hl) ; caracter que abre
call safe_chput ; escreve na tela
ld a,(work_w) ; lê a largura da janela
ld b,a ; salva em 'B'
rept 2
dec b ; desconsidera a moldura da largura
endm
inc hl ; caractere do centro
ld d,(hl) ; lê o caractere do centro
__draw_loop:
ld a,d ; 'A' = 'D'
call safe_chput ; escreve na tela
djnz __draw_loop ; faz o laço
inc hl ; caracter que fecha
ld a,(hl) ; caractere que fecha
call safe_chput ; escreve na tela
ld (iy+0),e ; restaura a linha atual
ret ; fim da rotina
endp
safe_chput:
proc
local __normal_code
local __control_code
cp " " ; compara 'A' com 32 (espaço)
jr c, __control_code ; se memor, é caractere de controle
__normal_code:
jp CHPUT ; escreve ASCII entre 32 e 255
__control_code:
ld c,a ; salva 'A' em 'C'
ld a,1 ; 'A' = 1
call CHPUT ; habilita modo de caractere gráfico
ld a,64 ; 'A' = 64
add a,c ; 64 + caractere gráfico
jp CHPUT ; escreve na tela o caractere gráfico
endp
frame_top:
db 24,23,25
frame_middle:
db 22,32,22
frame_bottom:
db 26,23,27
end_code:
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment