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.