terça-feira, 12 de março de 2013

Detecção de RAM 48/128

Conforme tinha prometido na postagem sobre incompatibilidade do Bubble Bobble, eu vou mostrar a rotina de detecção de tamanho de RAM 48/128K que elaborei na ocasião. 


A ideia era fazer uma rotina que não altere o conteúdo da RAM a ser testada; sem este requisito, o código de máquina poderia ser bem menor. São usados os bancos de RAM 0 e 1, sendo que, no final, é chaveado o banco 0.

; Detecção de tamanho da RAM.
  LD BC,32765     ; Porta para chaveamento de bancos de memória.
  LD D,16         ; Valor para selecionar banco de RAM 0. 
  LD HL,49152     ; Endereço para testar (49152-65535).
  OUT (C),D       ; Seleciona banco de RAM 0. 
  LD A,(HL)       ; Pega um valor da RAM, inverter todos os bits 
  CPL             ;
e guarda em A'.
  EX AF,AF'
  INC D
  OUT (C),D       ; Seleciona banco de RAM 1. 
  LD A,(HL)       ; Pega um valor da RAM e guarda em A', mas em
  EX AF,AF'       ;A fica o complemento do valor tirado da RAM 0.
  LD (HL),A       ; Armazena valor que é complemento do valor da
  DEC D           ;
RAM 0 supostamente na RAM 1.
  OUT (C),D       ; Seleciona banco de RAM 0. 
  CPL             ; Desinverte os bits e compara. O resultado será 
  CP (HL)         ;guardado em F'. 
  LD (HL),A       ; Restaura valor na RAM 0. 
  EX AF,AF'       ; Em F': Z=1 se 128K; Z=0 se 48K. 
  INC D
  OUT (C),D       ; Seleciona banco de RAM 1. 
  LD (HL),A       ; Restaura valor na RAM 1. 
  DEC D
  OUT (C),D       ; Seleciona banco de RAM 0.

Em BASIC, ficaria mais ou menos assim (só funciona no modo USR0 ou na TKMEM-128 com ROM 128 desativada):

  10 OUT 32765,16: LET A0=255-PEEK 49152
  20 OUT 32765,17: LET A1=PEEK 49152: POKE 49152,A0
  30 OUT 32765,16: LET A0=255-A0: LET RAM=48: IF A0=PEEK 49152 THEN LET RAM=128
  40 POKE 49152,A0
  50 OUT 32765,17: POKE 49152,A1
  60 OUT 32765,16

Nenhum comentário:

Postar um comentário

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.