domingo, 3 de fevereiro de 2013

Teste da RAM da TKMEM-128

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:

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.