Skip to content

Instantly share code, notes, and snippets.

@plainspooky
Last active February 1, 2020 21:50
Show Gist options
  • Save plainspooky/e4cd26a2f993f1b179d702251791a40e to your computer and use it in GitHub Desktop.
Save plainspooky/e4cd26a2f993f1b179d702251791a40e to your computer and use it in GitHub Desktop.
Converte uma tela de ZX-Spectrum para ser exibida em um MSX (versão cartucho)
;
; Converte uma tela de ZX-Spectrum para ser exibida em um MSX
;
; Para montar:
; pasmo -d -v zxview.asm zxview.rom
;
; Não esqueça de baixar a imagem, instruções lá no final!
;
; endereços da MSX-BIOS
DISSCR: equ $0041
ENASCR: equ $0044
INIGRP: equ $0072
GRPCGP: equ $F3CB
GRPCOL: equ $F3C9
WRTVDP: equ $0047
WRTVRM: equ $004D
rom_size: equ 8192
rom_area: equ $8000
ram_area: equ $C000
; variáveis usadas no programa
zx_ink: equ ram_area
zx_paper: equ ram_area+1
org rom_area
db "AB" ; cabeçalho do cartucho
dw start_code ; endereço de execução
db "ZXVIEW" ; identificação => "ZXVIEW"
ds 6,0 ; mantenha em branco
start_code:
proc
call INIGRP ; inicializa a SCREEN 2
call DISSCR ; desliga o vídeo
ld b,0 ; 'B' <- (cor transparente)
ld c,7 ; registrador 7, cor da borda
call WRTVDP ; muda a cor da borda
call decode_patterns ; traduz a tabela de padrões
call decode_attributes ; traduz a tabela de atributos
call ENASCR ; religa o vídeo
loop:
jr loop
endp
;
; decodifica a tabela de padrões diretamente na VRAM
;
decode_patterns:
proc
local __loop_tt
local __loop_lll
local __loop_rrr
local __loop_ccccc
; composição do vídeo do endereço de vídeo no speccy
;
; +-------------------+-------------------+
; | H | L |
; +---------+---------+---------+---------+
; | 0 0 0 T | T L L L | R R R C | C C C C |
; +---------+---------+---------+---------+
;
ld de,scr_file ; 'DE' na tabela de padrões do speccy
ld hl,(GRPCGP) ; 'HL' no tabela de padrões da VRAM.
ld b,3 ; repetições do laço TT (×3)
__loop_tt:
push bc ; salva 'BC' atual
ld b,8 ; repetições do laço LLL (×8)
__loop_lll:
push bc ; salva 'BC' atual
push hl ; salva 'HL' atual
ld b,8 ; repetições do laço RRR (×8)
__loop_rrr:
push bc ; salva 'BC' atual
ld b,32 ; repetições do laço CCCCC (×32)
__loop_ccccc:
push bc ; salva 'BC' atual
ld a,(de) ; lê um byte da tela do speccy
call WRTVRM ; escreve na VRAM do MSX
inc de ; próximo byte da tela do speccy
ld bc,8 ; 'BC' <- 8
add hl,bc ; avança a VRAM oito posições
pop bc ; recupera 'BC'
djnz __loop_ccccc ; repete o laço
pop bc ; recupera 'BC'
djnz __loop_rrr ; repete o laço
pop hl ; recupera 'HL'
inc hl ; avança a VRAM uma posição
pop bc ; recupera 'BC'
djnz __loop_lll ; repete o laço
ld bc,2040 ; 'BC' recebe 2040
add hl,bc ; avaça a VRAM em 2040 posições
pop bc ; recupera 'BC'
djnz __loop_tt ; repete o laço
ret ; fim da rotina
endp
;
; decodifica a tabela de atributos diretamente na VRAM
;
decode_attributes:
proc
local __loop0
local __loop1
local __apply_bright
local __skip_bright
; tabela de atributos do speccy:
;
; +-------+--------+----+----+----+---+---+---+
; | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
; +-------+--------+----+----+----+---+---+---+
; | flash | bright | paper | ink |
; +-------+--------+--------------+-----------+
;
; (esta versão ainda não trata o 'flash')
ld de,scr_file+6144 ; 'DE' na tabela de atributos do speccy
ld hl,(GRPCOL) ; 'HL' na tabela de atributos da VRAM.
ld bc,768 ; número de repetiçõpes do laço
__loop0:
push bc ; salva 'BC' atual
ld b,8 ; número de repetiçõpes do laço
__loop1:
push bc ; salva 'BC' atual
ld a,(de) ; lê um byte da tela do speccy
call extract_attr ; traduz os atributos
bit 6,a ; o 6º bit (brilho) está ligado?
jr z,__skip_bright ; se desligado, pula a conversão
__apply_bright:
ld a,1 ; 'A' <- 1
and b ; 'A' <- 'A' and 'B'
cp 0
jr z,__skip_bright ; se 'A' é 0, pula a conversão
ld c,8 ; 'C' <- 8
ld a,(zx_ink) ; lê o valor de 'zx_ink'
or c ; 'A' <- 'A' or 'C'
ld (zx_ink),a ; atualiza o valor de 'zx_ink'
ld a,(zx_paper) ; lê o valor de 'zx_paper
or c ; 'A' <- 'A' or 'C'
ld (zx_paper),a ; atualiza o valor de 'zx_paper'
__skip_bright:
ld a,(zx_ink) ; lê o valor de 'ink'
call translate_color ; converte para a cor do MSX
rept 4
sla b ; desloca 'B' para esquerda (×4)
endm
ld c,b ; 'C' <- (cor de frente)
ld a,(zx_paper) ; lê o valor de 'paper'
call translate_color ; converte para a cor do MSX
ld a,b ; 'A' <- (cor de fundo)
or c ; 'A' <- 'A' or (cor de frente)
call WRTVRM ; escreve na VRAM do MSX
inc hl ; avança a VRAM uma posição
pop bc ; recupera 'BC'
djnz __loop1 ; repete o laço
inc de ; próximo byte da tela do speccy
pop bc ; recupera 'BC'
dec bc ; decrementa o contador
ld a,b ; 'A' recebe 'B'
or c ; 'A' <- 'A' or 'C'
cp 0 ; 'A' é zero?
jr nz, __loop0 ; se 'A' != 0, repete o laço
ret ; fim da rotina
endp
;
; extrai os valores de INK e PAPER da tabela de atributos
;
extract_attr:
proc
push af ; salva 'AF' atual
ld i,a ; salva em 'I' o valor de 'A'
and $07 ; 'A' <- 'A' AND %00000111
ld (zx_ink),a ; armazena o valor em 'zx_ink'
ld a,i ; recupera de 'I' o valor de 'A''
and $38 ; 'A' <- 'A' AND %00111000
rept 3
srl a ; desloca 'B' para esquerda (×3)
endm
ld (zx_paper),a ; armazena o valor em 'zx_paper'
pop af ; recupera 'AF'
ret ; fim da rotina
endp
;
; traduz a cor do ZX Spectrum em sua cor de MSX
;
translate_color:
proc
local __loop
local __zx_colors
push hl ; salva 'HL'
ld hl,__zx_colors-1 ; aponta para a tabela de cores
ld b,a ; 'B' <- (cor a traduzir)
inc b ; decrementa 'B'
__loop:
inc hl ; incrementa o ponteiro
djnz __loop ; repete o laço
ld b,(hl) ; 'B' <- (cor traduzida)
pop hl ; recupera 'HL'
ret ; fim da rotina
__zx_colors:
db $1, $4, $6, $d, $c, $7, $a, $e
db $1, $5, $8, $9, $2, $f, $b, $f
endp
scr_file:
; este arquivo pode ser baixado diretamente do World of Spectrum em:
; https://www.worldofspectrum.org/pub/sinclair/screens/load/h/scr/HeadOverHeels.scr
incbin "HeadOverHeels.scr"
; ou substitua-o por qualquer imagem SCR de sua preferência.
rom_pad:
ds rom_size-(rom_pad-rom_area), 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment