Created
June 3, 2019 22:50
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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