A ROM 128 faz um teste simples dos 8 bancos de RAM que pode ser empregado na TKMEM-128.
Criado a partir de fotos de Leonardo Suárez e WOS |
Existe um trabalho de disassembly dos dois bancos de ROMs do ZX Spectrum 128, cujas listagens estão neste link. Analisando a rotina de teste da RAM, que se segue logo após a inicialização do computador, encontra-se o seguinte trecho:
; --------------------------------------------
; Reset Routine (RST $00 Continuation, Part 1)
; --------------------------------------------
; Continuation from routine at $0000 (ROM 0). It performs a test on all RAM banks.
; This test is crude and can fail to detect a variety of RAM errors.
L00C7: LD B,$08 ; Loop through all RAM banks.
L00C9: LD A,B ;
EXX ; Save B register.
DEC A ; RAM bank number 0 to 7. 128K mode, ROM 0, Screen 0.
LD BC,$7FFD ;
OUT (C),A ; Switch RAM bank.
LD HL,$C000 ; Start of the current RAM bank.
LD DE,$C001 ;
LD BC,$3FFF ; All 16K of RAM bank.
LD A,$FF ;
LD (HL),A ; Store $FF into RAM location.
CP (HL) ; Check RAM integrity.
JR NZ,L0131 ; Jump if RAM error found.
XOR A ;
LD (HL),A ; Store $00 into RAM location.
CP (HL) ; Check RAM integrity.
JR NZ,L0131 ; Jump if difference found.
LDIR ; Clear the whole page
EXX ; Restore B registers.
DJNZ L00C9 ; Repeat for other RAM banks.
Se um erro for detectado, o seguinte trecho exibe a cor da borda correspondente ao banco defeituoso e trava o computador:
; ---------------
; Fatal RAM Error
; ---------------
; Set the border colour to indicate which RAM bank was found faulty:
; RAM bank 7 - Black.
; RAM bank 6 - White.
; RAM bank 5 - Yellow.
; RAM bank 4 - Cyan.
; RAM bank 3 - Green.
; RAM bank 2 - Magenta.
; RAM bank 1 - Red.
; RAM bank 0 - Blue.
L0131: EXX ; Retrieve RAM bank number + 1 in B.
LD A,B ; Indicate which RAM bank failed by
OUT ($FE),A ; setting the border colour.
L0135: JR L0135 ; Infinite loop.
A rotina testa somente o primeiro byte de cada banco, no endereço 49152 ($C000). Eu sempre ficava intrigado pela inicialização do Spectrum 128 ser mais rápida do que do 48, mas agora entendi o motivo. Do jeito que se apresenta, este teste é menos sofisticado que o programa que eu elaborei em BASIC.
O teste do Spectrum 48 é melhor, pois verifica todos os bytes de RAM presentes, porém não consegue acessar os bancos não paginados. A solução é inicializar o computador com cada um dos bancos selecionados na última página de memória. O primeiro passo é selecionar o 48 BASIC se estiver no modo 128, o que pode ser feito digitando:
Uma vez que aparece o editor de linhas do 48 BASIC, digite:
em que x deve ser 16 para o banco de RAM 0, 17 para o banco 1 e assim por diante, até chegar a 23 para o banco 7. Depois da inicialização, basta digitar:
para ver o endereço do último byte detectado subtraído de 167. Se o banco estiver perfeito, o valor deve ser 65368 (65535−167). Qualquer valor menor, significa RAM danificada. O teste deve ser repetido para cada banco de RAM.
No caso de páginas de RAM espelhadas (mirror) o teste não funciona e o resultado acusará o valor 48984 (49151−167). Os bancos 2 e 5 são espelhadas no Spectrum 128 e TKMEM-128. Futuramente eu darei mais detalhes sobre mirroring da RAM.
O teste do Spectrum 48 é melhor, pois verifica todos os bytes de RAM presentes, porém não consegue acessar os bancos não paginados. A solução é inicializar o computador com cada um dos bancos selecionados na última página de memória. O primeiro passo é selecionar o 48 BASIC se estiver no modo 128, o que pode ser feito digitando:
USR0
Uma vez que aparece o editor de linhas do 48 BASIC, digite:
CLEAR 3e4: OUT 32765,x: RAND USR 0
em que x deve ser 16 para o banco de RAM 0, 17 para o banco 1 e assim por diante, até chegar a 23 para o banco 7. Depois da inicialização, basta digitar:
PRINT USR "a"
para ver o endereço do último byte detectado subtraído de 167. Se o banco estiver perfeito, o valor deve ser 65368 (65535−167). Qualquer valor menor, significa RAM danificada. O teste deve ser repetido para cada banco de RAM.
No caso de páginas de RAM espelhadas (mirror) o teste não funciona e o resultado acusará o valor 48984 (49151−167). Os bancos 2 e 5 são espelhadas no Spectrum 128 e TKMEM-128. Futuramente eu darei mais detalhes sobre mirroring da RAM.
Nenhum comentário:
Postar um comentário
Seu comentário é bem vindo, mas peço que use este espaço adequadamente.