Efeito Raster para Atari 65XE

imagem

Em janeiro de 2020, iniciei os preparativos para participar da demopartia do Forever 2020. O tema da composição foi anunciado pela ROBO, então decidi escrever um trabalho simples para o Atari 65XE. Quando a introdução ficou pronta, decidi adicionar um efeito de bitmap. Infelizmente, devido ao cancelamento do Forever, parte da introdução foi publicada.

O processador Atari é MOS 6502 -. Registros de 8 bits e a falta de portas para acessar hardware Outro componente do computador é ANTIC - ele implementa imagens -. Cores, modos de vídeo, símbolos Existem células de hardware para acessar ANTIC, sua finalidade é descrito em Mapeamento da Atari

Não vou listar todos os endereços das células e o destino, vou descrever a ideia do efeito em si. Deve-se notar que, por conveniência, os endereços no Mapeamento têm mnemônicos - eles são muito fáceis de lembrar.

imagem

O que é uma tela? No modo de texto, um retângulo com símbolos e um quadro é visível.

Por conveniência, você pode desativar o retângulo escrevendo o valor de 0 a 559. Como você pode ver, há espaço para um efeito de varredura.

Agora você precisa sincronizar o desenho com a saída na tela. Existem dois métodos:

RTCLOK      equ $0012
      lda RTCLOK+2
waits
      cmp RTCLOK+2
       beq waits

Aqui, o RTCLOCK é o relógio em tempo real iniciado quando o computador está ligado. Primeiro aumenta $ 14, depois $ 13 e $ 12. A ideia da sincronização é simples: compare o valor da célula $ 14 com o atual. Se o valor anterior não corresponder, ocorreu uma interrupção.

Mas, na minha opinião, o método não se encaixa, portanto, é mais conveniente usar um contador de linhas verticais VCOUNT ($ D40B) geradas no quadro. Aguardando o início do quadro será:

ws
	lda $D40B ; VCOUNT
	bne ws

A idéia em si é gravar valores de cores no registro COLBK ($ D01A) - a cor do quadro.
O valor gravado no registro é dividido em duas partes: tipo de cor e brilho, calculado como tipo * 16 + brilho. Descrito em detalhes aqui e aqui .

Porém, ao definir a cor de cada linha, a sincronização é necessária - a gravação de qualquer valor no WSYNC (D40A) interromperá o processador e aguardará o início da próxima linha. O mesmo método é usado nas interrupções da lista de exibição.

O efeito em si é dividido em aguardar o quadro, gerando valores de cores e gravando-os nos registros descritos. Usei zero endereços de página para simplificar. Você pode usar o montador xasm para compilar.

imagem


	org $4000
	
start

wait_frame
ws
	lda $D40B ; VCOUNT
	bne ws
       LDY #0
       STY 559
zz
	LDA $CD
	CLC
	ADC #5
	STA $CD
	BCC BR1
	INC $CE
BR1
	ADC $CB
	STA $CB
	BCC BR2
	INC $CC
BR2
	LDA $CC
	STA $D40A ; WSYNC
	STA $D01A
	INY
	BNE zz
	BEQ wait_frame
	run start

Descobriu-se 54 bytes. 54-6 (cabeçalho do programa) = 48 bytes. Há tempo para experimentar, por exemplo, brincar com o brilho do verde

	lda $CC
;*  
	and #$0f
	ORA #$C0
;*  
	sta $D40A ; wsync
	sta $D01A

Outras opções para gerar cores, deixarei para quem estiver interessado e eu mesmo tentarei. Crie, experimente e crie. Isso é tão emocionante!

All Articles