Revista: Micro Sistemas número 98 Conteúdo: parcial Autor: DDX Comentários: Texto extraído de um informe publicitário explicando os procedimentos para ler e gravar dados nas Megarams. Falta incluir o programa exemplo (Que espero que esteja intacto no meu "Disco Vermelho"). "COMO UTILIZAR UMA MEGARAM Tome fôlego, pois agora vamos explicar um pouco mais a fundo o processo de leitura e gravação da memória da interface Megaram, possibilitando que o usuário desfrute de toda a potencialidade destas incríveis interfaces, dando, inclusive, um exemplo de utilização em Basic e linguagem de máquina. Antes de descrever como se faz o acesso propriamente dito à Megaram, vamos esclarecer alguns pontos gerais muito importantes em se tratando de cartões de expansão de memória. 1) NÃO EXISTE CARTÃO DE MEMÓRIA CAPAZ DE AUMENTAR A MEMÓRIA NO BASIC, isto é, a limitação de aproximadamente 28kbytes livres no Basic é inerente ao próprio sistema do computador (programa em ROM e o próprio hardware). 2) NÃO EXISTE CARTÃO DE MEMÓRIA CAPAZ DE AUMENTAR A MEMÓRIA UTILIZÁVEL POR PROGRAMAS IMIGRADOS DO CP/M, isto é, como no ítem anterior, estes programas são limitados fisicamente pela própria estrutura da máquina (limitação de 64kbytes do próprio Z80). A não ser que sejam escritos para 'descobrir' e utilizar a expansão de memória, não há como fazer com que o dBase, Supercalc, Turbo Pascal e outros, por si próprios, acessem mais memórias. Na realidade, os ítens acima mostram que a limitação de memória em Basic ou do próprio DOS é inerente à própria estrutura do micro. É verdade que o MSX supera tais limitaçõe por meio da arquitetura de SLOTS e outros padrões de expansão de memória mas, repetindo, se o programa não for feito para utilizar tal memória, não há como utilizá-la diretamente. Obs.: Mesmo os IBM-PC são limitados em aproximadamente 640kbytes. Acima disso também foram criados padrões de expansão como os 'LIM-EMS', que também só estão disponíveis para quem os reconhece. Um dos padrões adotados pelos fabricantes de MSX é o do 'Memory Mapper', utilizado em alguns micros europeus. Mesmo assim a memória adicional só é reconhecida por alguns programas (feitos para isso obviamente) e pelo novo DOS2 (sistema operacional da ASCII japonesa que só funciona em micros MSX2 com memória expandida). Ainda nesse caso, programas feitos não reconhecendo a expansão não 'ganharão' mais memória, mesmo rodando sob este novo sistema. Agora falaremos sobre o acesso à espansão Megaram. O exemplo dado faz uso das rotinas padrão do MSX e portanto elas funcionarão em qualquer máquina (Expert Plus, MSX2 japoneses, etc.). Note que a explicação vale também para a Megaram Disk, uma vez que na parte de acesso à RAM ela é idêntica à versão simples. NOTA: É imprescindível que o leitor que deseje fazer acesso da Megaram por meio de linguagem de máquina tenha uma boa noção e prática da própria linguagem de máquina bem como da estrutura da BIOS, interface entre programas em linguagem de máquina e Basic, etc. Sem este prévio conhecimento é praticamente impossível que o leitor sequer entenda o que for descrito a seguir. A Megaram foi criada com base nos famosos cartuchos japonese Megarom, que como o nome já diz são constituídos de ROMs ou EPROMs, na verdade memórias não voláteis, que servem apenas para leitura. O espaço que pode ser destinado a um jogo ou programa em um cartucho é de no máximo 64k por limitação do próprio Z80, mas na prática este espaçõ reduz-se a 32k se o jogo em questão fizer chamadas para as rotinas padrão do BIOS (espaço total de 64k menos as páginas 0 e 3 que são as chamadas localizadas em 0000-3FFF e as variáveis do sistema de 8000-FFFF). Como foi feito então para rodar um jogo de 256k? Asolução foi criar um artifício no qual toda a ROM (de 256k) pudesse ser visualizada no espaço de 32k (4000-BFFF). Foi então utilizado o 'bank switching' em bancos de 8k, da seguinte forma: A ROM total de 256k e dividida em 32 bancos de 8k e qualquer combinação de 4 destes bancos pode 'aparecer' na área de 4000-5FFF, 6000-7FFF, 8000-9FFF e A000-BFFF respectivamente. Exemplificando, na prática, para fazer com que o banco 10 seja 'visto' em 6000-7FFF executa-se um 'Write' com o valor 10 em qualquer endereço pertencente ao espaço de 6000-7FFF (por exemplo: 6000 para facilitar). Note que o valor do número do banco vai de 0 a 31. Ficou claro então que como a memória utilizada é apenas de leitura, foi aproveitada a instrução 'write' para selecionar o banco desejado. Como o custo deste cartuchos em ROM é proibitivo (alem de permitir acesso a um único jogo) foi idealizada a Megaram, comportando-se exatamente como a Megarom com a vantagem de poder ser alterado seu conteúdo, fazendo com que possa funcionar com qualquer jogo deste tipo, bastando que se acrescente um programa 'carregador' em disco, por exemplo. Foi criado então um mecanismo para que o conteúdo da RAM possa ser alterado, isto é, ora a Megaram funciona como uma ROM (apenas leitura) e ora como RAM (que permite leitura e escrita). Este mecanismo é na verdade acesso à porta de I/O 8Eh. Depois de um acesso de gravação a esta porta (instrução OUT do Assembler) com qualquer valor, a megaram comporta-se como uma Megarom, isto é, uma instrução de gravação em sua área é entendida como o selecionamento de um banco para leitura. Depois de um acesso de leitura a esta porta (outra vez não importando o valor lido) a Megaram funciona como RAM mesmo, isto é, uma instrução de gravação em sua área é entendida como gravação de um byte de dado que posteriormente será lido. Note que, neste último modo, não é possível o chaveamento de bancos, visto que a instrução de gravação está sendo utilizada para gravação propriamente dita e não para o chaveamento. Exemplificando: se o usuário deseja gravar o valor '50h' no endereço 4010h e que em 4000-5FFF seja mostrado o banco '18', deve-se executar a seguinte seqüência: 1) Habilitar o selecionamento dos bancos com uma instrução de gravação na porta 8Eh. 2) Executar uma instrução de gravação do byte '18' em qualquer endereço de 4000-5FFF. 3) Habilitar a gravação da RAM com uma instrução de leitura da porta 8Eh. 4) Executar uma instrução de gravação do valor '50h' no endereço 4010h. 5) Desabilitar a gravação da RAM (igual a habilitar o selecionamento dos bancos) com uma instrução de gravação na porta 8Eh. Obs.: este ítem é opcional e tem apenas o intuitode proteger a RAM de acessos inadvertidos. A seqüência acima poderia se resumir nas seguintes intruções assembler (Note que é assumido que o slot em que a megaram está conectada já está selecionado). OUT (08Eh) LD A,18 LD (4000h),A IN A,(08Eh) LD A,50h LD (4010h),A OUT (08Eh),A Para o acesso à Megaram é necessário também que se saiba em que slota a megaram está conectada ( e se realmente está). Por exemplo: pode-se utilizar uma simples rotina de busca em todos os slots possíveis de uma interface com as características de uma Megaram, isto é, depois de um acesso de leitura à porta 8Eh funciona como RAM e depois de um acesso de gravação comporta-se como ROM. A partir do que foi descrito aqui, o usuário com bom conhecimento em linguagem de máquina poderá fazer qualquer utilização da Megaram nos seus programas. Também existem vários meios para se descobrir e acessar a Megaram. Pode-se utilizar byte a byte por meio da instrução RDSLOT (endereço 0000Ch do BIOS). Para transferências mais rápidas pode-se habilitar o slot da Megaram pela chamada a ENASLT (endereço 024h do BIOS) e depois executar instruções como por exemplo LDIR do Z80. Em todos os casos, reiteramos que é imprescindível um bom conhecimento em linguagem de máquina e a estrutura de chamadas do BIOS do MSX, pois quando se opera com chaveamento de slots é necessário cuidado redobrado com a área de 'stack', a área onde se está 'rodando' o programa, etc. Incluímos para clarear ainda mais o processo um programa Basic que exemplifica um dos muitos métodos de interfacear a MEGARAM com o Basic e a rotina em linguagem de máquina utilizada. Neste programa são utilizadas 3 rotinas básicas em linguagem de máquina (FINDSLOT, READRAM e WRITERAM) que podem servir como ponto de partida para suas próprias rotinas. O programa, visto ser apenas um exemplo, apenas lê e grava valores em qualquer posição da MEGARAM. NOTA: Como sua Megaram pode ser de 256k, 512k ou 768k, os bancos poderão variar de 0..31, 0..63 ou 0..95 respectivamente, isto é, a 256 dividida em 32 bancos de 8k cada, a 512 dividida em 64 bancos de 8k, e a 768 dividida em 96 bancos de 8k cada. Estes bancos podem ser acessados, 4 de cada vez, nos endereços 4000h-5FFFh, 6000h-7FFFh, 8000h-9FFFh e A000h-BFFFh dos slot em que for inserida qualquer destas interfaces. Vale também notar que no caso de uma Megaram-Disk qualquer alteração a um byte da Megaram acarretará em possível perda ou alteração dos arquivos nela gravados. Portanto, a não ser nos casos em que você saiba exatamente o que está fazendo, é aconselhável inicializar o computador cancelando-se a RAMDisk (por meio da tecla DEL). Segue abaixo o programa em Basic e as rotinas em linguagem de máquina. OBS.: O programa em linguagem de máquina inicia no endereço B000h; portanto o usuário que for utilizar este exemplo num editor Assembler tradicional, deverá executar a instrução "ORG B000h" no início do programa." *************** Continua ****************