Quão rápido o 6502 pode transferir memória

By | Junho 16, 2022

Incrivelmente Gregório Naçu publicou uma imagem do título do artigo esta semana para chamar a atenção para o honroso processador 6502 e riu dos slides de marketing da Apple para os chips M2. Provavelmente funciona o projeto individual do Commodore 64 mais ambicioso que conheço e tem um blog fantástico.

A Apple afirma que o novo chip M2 tem as seguintes especificações.

M2 apresenta Imagem da Apple via YouTube

Todos nós sabemos que esses números são provavelmente um pouco fofos. Eles podem ser bastante fofos e, em aplicações práticas, provavelmente estão muito longe. O benchmarking no laboratório é bom, mas os números raramente refletem o desempenho do mundo real.

O hardware de Tom funciona muito bem neste novo chip. Parece bem legal!

Quão rápido é o 6502?

Depois que Gregorio divulgou esta imagem no início desta semana, ela provocou bastante discussão na internet sobre a velocidade de transferência de memória dos processadores 6502.

O 6502 nas máquinas Commodore compartilha um relógio com um chip de vídeo. Como o quadro de porta dupla não era financeiramente viável na época, eles escolheram um truque de acesso à memória que permitia que o chip de vídeo e o processador acessassem a memória durante um único ciclo de clock. Acho que é o mesmo na maioria dos Commodores, mas no VIC-20 o processador acessa a memória na extremidade inferior do sinal e o chip VIC na extremidade superior. Talvez esteja ao contrário… de qualquer forma, você entendeu.

Sinal VIC-20 PAL Clock s 6561

Memória a 1 MB por segundo

Voltando ao slide, essa banda de memória de 1 MHz é o que as pessoas estão perguntando.

Em cada ciclo de clock, o 6502 lê a memória de algum lugar… pilha, registradores, contador de programa, locais de memória, etc. O pessoal do marketing está saindo.

Autor da imagem Gregório Naçu em c64os. com

É importante notar isso Gregório NaçuO slide era uma paródia e não pretendia ser uma questão de números exatos. Lembre-se disso porque se você não fizer isso, o resto desta discussão vai irritar suas penas.

Vamos tentar algumas transferências de memória para ter uma ideia de como podem ser as velocidades de transferência reais usando o hardware padrão do Commodore. Outras plataformas baseadas no 6502 podem ser mais rápidas ou mais lentas, então eu encorajo você a tentar alguns de seus próprios testes e me contar o que você encontrou.

Novamente, lembre-se de que a transferência de memória leva mais tempo do que apenas ler ou escrever…

Vamos tentar isso no sistema mais popular de todos os tempos baseado no 6502, Commodore 64.

Hoje em dia, todo mundo tem uma tela de heads-up para seu Commodore 64.

Transferir

Vamos nos alinhar imediatamente com o venerável Rodney Sachs.

a propósito, Robin fez um longo vídeo corrigindo a implementação deste livro incomodar. Usarei a versão revisada porque acho que este é um exemplo bem estabelecido de realizar uma transferência de bloco no mundo real. Claro, pode haver maneiras mais rápidas, mas esta é uma maneira realista, que é o que estamos buscando.

Você pode ler este ótimo capítulo sobre como funciona, e o vídeo de Robin é descrito em detalhes. Aqui está o que faremos:

source   = $0800
dest     = $4800
len      = $4000
from     = $fb
to       = $fd
tmpx     = $a6


copyr
         .block

         lda #<source
         sta from
         lda #>source
         sta from+1
         lda #<dest
         sta to
         lda #>dest
         sta to+1

         ldy #0
         ldx #>len
         beq remain
next     lda (from),y
         sta (to),y
         iny
         bne next
         inc from+1
         inc to+1
         dex
         bne next
remain   ldx #<len      
         beq done
nextr    lda (from),y
         sta (to),y
         iny
         dex
         bne nextr
done     rts

         .bend

Na Commodore, podemos contar com passos rápidos que nos darão uma ideia da rapidez com que esta cópia demora. Claro, há uma pequena carga na instalação, mas acho que é marginal o suficiente para que possamos negligenciá-la para nossas necessidades.

$ 12 (18) juffies

Ok, isso é bem rápido. Como são 16k transferidos, está rodando em torno de 54,6k por segundo.

Vamos fazer um monte deles e ver o que sai.

Podemos chamá-lo bem rápido 255 vezes e fazer a mesma matemática.

         lda #$00
         sta $a2
         sta $a1
         sta $a0

         ldx #255
         stx tmpx
lp
         jsr copyr
         dec tmpx
         ldx tmpx
         bne lp

         lda $a0
         jsr printbyte
         lda $a1
         jsr printbyte
         lda $a2
         jsr printbyte
1128 USD (4392)

Assim, a uma taxa de $ 1.128 (4.392) e 255 marchas de $ 16.384, vemos cerca de $ 57.000 por segundo.

Um grão de sal, sim, mas suficiente no mundo real.

Sim, existem alguns custos para configurar e operar a transmissão. Provavelmente poderíamos acelerar esse loop em alguns por cento. Talvez possamos melhorar 15% se fizermos isso com firmeza. Mas o ponto era o uso no mundo real, e este é um bom exemplo de um loop de transmissão estreito, mas flexível. Não vamos ser muito meticulosos aqui.

O que é importante notar é que a transferência de memória leva vários ciclos de clock por byte. Se os contarmos, são cerca de dez ciclos, que são aproximadamente seguidos por nossos resultados.

O KIM-1 é provavelmente a plataforma 6502 mais simples e limpa, então será interessante experimentar a transferência de memória nele.

Ele roda um pouco mais devagar que o Commodore 64, então espero que ele transfira um pouco mais devagar. Mas não precisa competir durante o acesso como as “linhas ruins” do VIC-II, então pode ser bem próximo.

Vamos ver.

Eu não possuo o “KIM-1 real”, mas possuo o que é considerado o melhor clone. Usamos hoje Clone de Corsham KIM-1. De agora em diante vou chamá-lo de KIM-1, principalmente porque gosto de receber cartas raivosas sobre isso. Você foi avisado.

Cronometragem

O KIM-1 não possui um relógio rápido como outras máquinas Commodore.

Os “conectores de aplicativos” são facilmente acessíveis, portanto, se definirmos o pino alto quando iniciarmos e redefini-lo baixo quando terminarmos, podemos facilmente usar um osciloscópio para medir o tempo.

Com o barramento de expansão conectado à minha placa Corsham KIM, a direção da porta do aplicativo está definida para sair.

	lda #$ff
	sta $1603
Defina a saída de todas as portas

E então, podemos alternar o pino PA0 configurando-o para alto ou baixo. Para isso, usaremos $ FF e $ 0 para simplificar.

Nota: este é um local não padrão para esta porta, seu KIM-1 ou clone provavelmente o possui na faixa de $ 1700. Verifique sua documentação.

16k em 262 milissegundos é cerca de 62,5k por segundo. Ligeiramente mais rápido que o Commodore 64, embora o NTSC Commodore 64 funcione a uma velocidade um pouco mais alta (1.023MHz) do que o nosso KIM aqui.

Vamos fazer isso 255 vezes em um loop estreito, ignorando o custo de coisas como JSR, que requer vários ciclos de clock em cada loop. Vamos para o campo aqui.

Então, nosso código de loop parece aproximadamente

         lda #$ff
         sta $1603
         sta $1601 ;technically setting all pins high here
         		   ;could just use #$01


         ldx #255 
         stx tmpx
lp
         jsr copyr
         dec tmpx
         ldx tmpx
         bne lp
         
         lda #$00
         sta $1601


         brk

Então, se examinarmos com um osciloscópio, podemos medir uma onda quadrada de 1+ minutos.

Assim, 255 transmissões de 16.384 bytes levam 67 segundos. Ou cerca de 62k por segundo.

Eu tenho uma placa Cerberus 2080. Até onde eu sei, o meu é o único verde do mundo.

Ele tem RAM de porta dupla e pode rodar um processador WDC 65c02S novinho em folha (sim, ainda produz) a uns incríveis 8Mhz. Vamos ver quais resultados teremos com isso.

Novamente, não temos problemas com o relógio rápido, então vou pular a transferência de 4 MB para a direita, medi-la durante a gravação do vídeo e exibi-la “quase” na tela quando terminar. Ao contrário do KIM-1, não tenho uma maneira fácil de medi-lo com um pino de E/S. Isso nos dará uma boa ideia de onde estamos.

Cerca de 6,29 segundos

16.384 bytes 255 vezes levou 6,29 segundos, então é usado ao máximo, o moderno 6502 a 8MHz pode fazer cerca de 664,2k por segundo. Nada mal!

Claro, este não foi um conjunto abrangente de testes. Mas no mundo real, o 6502 pode copiar todo o conteúdo da memória do Commodore 64 de um lugar para outro em cerca de um segundo. Bastante respeitável, e foi muito rápido durante esse tempo.

Você certamente poderia usar código auto-alterável e executar essa rotina de cópia para obter melhor desempenho ao custo de flexibilidade e provavelmente compreensão para o codificador 6502 assembler casual médio. Esta cópia pode enviar de um a 216 bytes e cada número entre eles. E como meu Youtuber favorito gosta de dizer: “Eu sei que sei, mas não fiz isso. Que comecem os e-mails raivosos”.

Se você tiver um REU em seu Commodore, teoricamente ele pode substituir byte de memória por ciclo de clock. 1 MB reais por segundo. Ouvi dizer que os jogos são como A jornada de Sam aproveite bastante esse recurso.

A jornada de Sam primeiro nível

Eu adoraria ouvir sua opinião sobre como você abordaria isso, meticulosamente, seletivamente e de qualquer outra forma. Pontos de bônus se você demonstrar métodos que mostram resultados dramaticamente melhores.

Faça o que fizer, certifique-se de se divertir e não leve os slides de marketing muito a sério.

Deixe uma resposta

O seu endereço de email não será publicado.