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 AtariNã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.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. 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!