Olá,
Acima segue a última foto atualizada do protótipo
do emulador de interface de disquete. No circuito em si há poucas alterações,
eu troquei o teclado que eu estava usando por um outro mais robusto e fiz um
adaptador de cartão SD usando de fato um conector para cartões SD. Antes eu
estava fazendo testes com cartões sd usando uma adaptação parecida com a da
imagem abaixo:
Uma adaptação como da foto acima funciona mas eu
acho que estes adaptadores de micro sd para sd não foram feitos para você ficar
inserindo e removendo os cartões a todo o instante. Como estamos usando um
circuito de teste que a todo o instante precisamos trocar os cartões logo o
adaptador começa a apresentar problemas de mal contato. Para resolver este
problema eu fiz uma placa de circuito com um conector para cartões micro sd de
verdade e que me parece ser de boa qualidade e na placa eu inseri os resistores
de pull up smd de 33K necessários para a interface com o cartão e um capacitor
de 100nF entre a linha de alimentação e o terra. Os componentes smd não podem
ser vistos porque estão soldados por baixo da placa adaptadora. A inserção
destes componentes smd diminuiu um pouco a quantidade de fios no protoboard e
melhorou a robustez do circuito.
Como podemos ver na foto acima eu coloquei 4
resistores de 100 ohms em série com os sinais do cartão smd e isto também
melhorou bastante a qualidade da comunicação com o cartão sd.
As maiores alterações e aonde eu tenho alocado a
maior parte do meu esforço é em desenvolver o firmware e eu fiz grandes
progressos neste quesito.
As rotinas que fazem a comunicação com o cartão SD
eu já tinha feito e praticamente não sofreram alterações. No estágio atual eu
consigo acessar normalmente alguns cartões e outros não. Conforme eu já havia
escrito anteriormente eu creio que o problema reside no fato de que nem todos
os cartões sd suportam comunicação SPI. De qualquer forma eu consigo acesso
tanto a cartão normais como cartões HD (High Density), então, para mim, já está
bastante satisfatório para não ter mais que me preocupar com estas rotinas.
Numa camada acima estão as rotinas que manipulam a
estrutura FAT existente nos cartões. Inicialmente eu tentei usar o Petit FatFs
sem sucesso então eu parti para criar eu mesmo minhas próprias rotinas de
manipulação do FAT. Hoje eu consigo navegar na estrutura de diretório e abrir
os arquivos dsk o que é também bastante satisfatório.
Com as rotinas descritas acima prontas eu fui capaz
de melhorar a interface com o usuário e de finalmente emular a interface com o
MSX de forma a permitir ao computador que tenha finalmente acesso aos dados
contidos nos arquivos dsk. Abaixo segue uma série de fotos da interface com o
usuário em ação. Abaixo segue a foto da tela inicial do circuito:
A interface do circuito com o usuário se resume a
quatro botões que eu vou chamar de "seta para cima", "seta para
baixo", "Selecionar" e "Voltar". Nesta tela se eu
teclar as setas eu seleciono as várias opções existentes no menu principal, o botão
"voltar" não possui função neste tela e a tecla
"selecionar" seleciona a opção desejada. Se na tela acima eu
pressionar o botão "selecionar" eu pulo para a tela de seleção de
arquivo. Caso não haja um cartão sd inserido ou caso ocorra algum erro de leitura
no cartão sd aparece uma mensagem de erro e teclando qualquer tecla voltamos
para o menu principal. Existindo um cartão sd que não apresente erros nos
pulamos para a tela de seleção de arquivos no qual eu posso navegar na
estrutura de arquivos do cartão sd e eu posso selecionar arquivos com extensão
dsk. Qualquer outro arquivo existente no cartão não será mostrado. Caso o
cartão não possua subdiretórios e não possua arquivos com extensão dsk
aparecerá a mensagem de disco vazio e pressionando qualquer tecla voltaremos
para o menu principal.
Na imagem acima podemos ver o resultado após
pressionarmos a tecla "selecionar". No caso do cartão em questão
temos um subdiretório chamado "TESTE1".
Se teclarmos o botão "selecionar"
novamente nos entramos dentro do subdiretório TESTE1. Na imagem acima podemos
ver a primeira entrada do subdiretório "TESTE1" que é a entrada
"." que nada mais é do que uma referência ao próprio diretório. Na
sequência temos a entrada ".." que é uma referencia ao subdiretório
ou diretório raiz anterior ao subdiretório atual. Uma curiosidade: se teclarmos
ao botão "voltar" nos não voltamos para o subdiretório anterior, mas
sim para o Menu Principal. Enquanto na tela de seleção de arquivos o botão
"voltar" sempre volta para o menu principal. Sendo assim para
voltamos um nível na estrutura de diretórios temos que selecionar a entrada
".." e teclar o botão "selecionar".
Navegando na estrutura do subdiretório de exemplo
"TESTE1" encontramos o arquivo da imagem abaixo:
No meio do nome do arquivo existe uma seta para a
direita mas isto na verdade é o equivalente no display LCD ao caractere
"~" de forma que o nome correto do arquivo é
"ELEVAT~1.DSK". No display de LCD que eu estou usando não existe o
caractere "~" mas eu creio que da para viver com este caractere
trocado. O nome do arquivo continua bastante legível. Aliás, a rotina também
somente amostra as entradas de diretório com o nome no formato 8.3. Nomes de
arquivos e subdiretórios estendidos não são apresentados, mas isto não chega a
ser um problema porque sempre existe duas entradas de diretório para o mesmo
arquivo ou subdiretório uma no formato 8.3 e a outra no formato estendido. Isto
faz parte da especificação do FAT32.
Neste momento se pressionarmos a tecla
"selecionar" finalmente disponibilizamos um arquivo para o MSX
manipular. Antes deste momento o MSX sempre obtém do registrador de status a
informação de "drive not ready", i.e., uma leitura no endereço de IO
D0 sempre obtém o valor 0x80. Com a seleção do arquivo a leitura do status
passa a representar o estado atual do arquivo. Por exemplo, se o arquivo dsk
selecionado tiver com a flag de read-only ativa o MSX receberá a informação de
disco protegido contra gravação. Abaixo segue a foto da tela após a seleção do
arquivo.
Na tela acima além de vermos o nome do arquivo
selecionado podemos ver que o disco não está protegido contra gravação -
cadeado aberto - e podemos ver os valores selecionados de cabeça, trilha e
setor. Estes valores são atualizados automaticamente quando o MSX passa a
manipular o "disk drive". Neste momento o MSX poderia acessar o
arquivo dsk como se fosee um disco magnético real e é neste ponto que eu estou
tendo problemas.
Com o arquivo selecionado se eu executar o comando
"files" para listar os arquivos existente dentro do arquivo dsk o MSX
apresenta a listagem correta. No caso da imagem acima está sendo apresentado o
conteúdo do disco do jogo "Elevator Action", mas se eu digitar load
"autoexec.bas" o MSX acessa o setor 2 da trilha 0, cabeça 0, depois o
setor 6 da trilha 0 e da cabeça 0 e depois fica lendo o registrador de status
indefinidamente como se estivesse esperando alguma coisa acontecer e não
concluí o comando load. Eu realmente não consigo entender que alteração do
status que ele está esperando que aconteça. De qualquer forma eu estou neste
estágio de desenvolvimento.
Além disto, estou tendo problemas com a programação
do PIC em si. Não consigo em hipótese alguma fazer com que a rotina de
interrupção de baixa prioridade funcione para mim. Eu não consigo entender o
porquê e eu preciso que isto funcione porque eu preciso temporizar diversas
tarefas dentro do meu código. Isto é uma coisa que tem me aborrecido bastante e
estou inclusive pensando em trocar o PIC 18F4550 por um PIC24FJ64GA004. A minha
maior resistência a esta ideia é o fato de que isto representaria um retrocesso
muito grande para tudo aquilo que eu já obtive até o momento. Se na próxima
semana eu não obtiver uma resposta para este problema vou ter que começar quase
que do zero na criação do meu projeto.
Abaixo segue o link do código fonte do firmware até
o momento. O código está precisando de um clean up porque você vai testando e
mudando coisas no seu código e chega um pouco que as coisas começam a ficar
confusas. De qualquer forma o código está ai para quem quiser estudar e
participar do projeto.
https://dl.dropboxusercontent.com/u/62498964/MSXFirmware_3.X%2020130929.zip
Um
abraço,
José
Paulo