Explorando um pouco mais o emulador de drive E100S

Estava cá eu, confabulando com meus botões a respeito da Vida, do Universo e de Todas as Coisas quando nosso colega fudeba Emiliano Fraga resolveu compartilhar suas experiências com o emulador de drive E100S, sobre o qual escrevi um tempo atrás e fiquei devendo um follow-up.

e100s-f700O relato do Emiliano consiste exatamente no que fiquei devendo, com uma diferença: para manipular as imagens de disco, ele usa o software para Windows indicado pelo copiador fabricante do hardware, enquanto que eu ignorei olimpicamente tal software e parti para uma rota alternativa – chegando inclusive a algumas conclusões diferentes. Confira aí abaixo.

Para ficar mais fácil de entender o que o emulador faz com o pendrive, comecei com um cartão microSD (com adaptador, vira pendrive) que zerei de cabo a rabo usando o comando dd do Linux. Sim, tudo neste post é feito em Linux. 0000Para descobrir que nome o Linux dá ao dispositivo que representa o  pendrive, é só olhar o arquivo /proc/partitions antes e depois de inserir o pendrive na USB do PC, e conferir que uma linha a mais aparece. Aqui, ele atribuiu o nome /dev/sdb. Então vamos começar a manipular a tabela de partições com o comando fdisk /dev/sdb (rodando como root).

0001O fdisk nos avisa que o dispositivo não tem uma tabela de partições válida (tudo zerado, lembra?) e vai criar uma quando for gravar as alterações. Usando a opção n, vamos criar uma partição de 160 megabytes. (Depois eu explico o porquê desse tamanho.)
0002Por padrão, o fdisk do Linux cria partições do tipo Linux. (Puxa, que surpresa.) Para evitar confundir Linuxes e Windowses e Macses nos quais eu venha a inserir esse pendrive no futuro, decidi mudar o tipo da partição para algo que seja alienígena para todos.
0003“Non-FS data” (Dados que não são sistema de arquivos) parece perfeito. Vou usar esse código (hexa DA).
0004Como eu não gosto de desperdício, vou usar o resto do espaço livre para uma partição FAT. Usando o velho esquema inventado pelo MS-DOS na década de 80: criar uma “partição estendida” e, dentro dela, um “drive lógico”.
0005O tipo do drive lógico, mais uma vez, foi definido por padrão como Linux. Mudamos para FAT32, que é o tipo C. (Nada a ver com “drive C”.)
0006E assim ficou nossa tabela de partições:
0007Com a opção w do fdisk, gravamos as alterações e voltamos ao prompt do Linux. Agora vamos fazer a formatação lógica do nosso drive FAT. (Reiterando, este não será usado pelo emulador, ele usará a primeira partição.)
00080009Desmontamos o pendrive do PC (em windowsês, “removemos o dispositivo com segurança”) e estamos prontos pra começar a brincar com ele no MSX.

0009aNão há problema em ligar o MSX sem o pendrive inserido. Assim que você o insere no emulador, desaparece o código de erro no display e aparece “00”, indicando que, para o micro, há um disquete inserido no drive. Pois vamos formatá-lo como qualquer usuário de MSX cristão (e muçulmano) formata disquete, oras.
0009bVamos testar a gravação digitando um sofisticadíssimo programa em BASIC e salvando-o.
0009cAo que parece, tudo bem. Agora, vamos apertar o botão da direita no emulador para mudar da imagem 00 para a 01. Sob a visão de mundo do MSX, você retirou o disquete do drive e colocou outro.
0009dNaturalmente, temos que formatar esse “outro” “disquete”.
0009eO programa BASIC ainda está na memória. Vamos salvá-lo… com outro nome.
0009fChegou a hora de trazer o pendrive de volta pro PC pra ver o que cargas d’água foi gravado nele. Para isso, nada melhor que um editor/visualizador hexa. Como sou fã do rústico, eu uso o comando hexdump. Estamos interessados em ver a primeira partição do dispositivo, que no Linux aparece como /dev/sdb1. Isso porque o dispositivo inteiro era /dev/sdb, lembram? (No seu PC pode aparecer diferente, /dev/sdc, /dev/sdd…)

Para visualizar paginado e poder fazer buscas, uso a seguinte linha de comando: hexdump -C /dev/sdb1 | less
0010O primeiro bloco é o setor de boot do MSX-DOS. Observe que aparece um “volume label” SNYJX101 (o MSX é um F-700 da Sony), uma mensagem de erro, e o nome do arquivo que, se existir, será carregado para a memória como sistema operacional. (MSXDOS.SYS) Mais à frente, o diretório-raiz com o nome que a gente salvou, e o conteúdo do programa BASIC.

E a segunda imagem? Lembram que, nela, a gente salvou um “IDIOTA2.BAS”? Pois bem, vamos procurar por “IDIOTA2″… Ahá!
0011O mesmo setor de boot, um diretório-raiz com o arquivo de nome diferente, e o conteúdo. Achamos. Vê-se que a segunda imagem começa na posição hexa 180000, que convertido para decimal dá 1572864 – exatamente um mega e meio. Espaçamento excelente para imagens de 1.44, o que indica que as versões 720K e 1.44M do emulador usam o mesmo firmware.

E é esse o motivo para o tamanho da nossa partição de imagens. 100 imagens x 1.5 MB = 150 MB. E eu botei mais 10 porque sou paranoico.

(O Emiliano reporta um uso de 342 MB pelo software da IPCAS. Essa discrepância merece futura investigação.)

Como eu sou teimoso e tinhoso e não quero não quero não quero usar esse software Windows, vou usar o bom e velho dd de novo para ler e gravar imagens .DSK do pendrive. E aproveita que eu tô calmo.

As opções de linha de comando que nos interessam são count, seek e skip.
0012Agora vamos gravar um .DSK de um jogo na terceira imagem do emulador (que aparecerá como 02 no display). Para isso usamos a opção seek, que pula um certo número de blocos no dispositivo destino antes de iniciar a gravação. Quantos blocos?

O tamanho do bloco (ou setor), tanto no MSX quanto no PC, é obrigatoriamente 512 bytes, logo também precisamos da opção bs=512. Os deslocamentos devem ser múltiplos de 1.5 MB. Em blocos, isso dá 1024 * 1024 * 1.5 / 512 = 3072.

Ou seja, para gravar na primeira imagem, seek de zero; para gravar na segunda, seek de 3072; para gravar na terceira, seek de 3072×2 e por aí vai. As contas podem ser feitas na própria linha de comando, como pode ser visto abaixo:
0013Levamos o pendrive pro MSX, avançamos no botão até o número 02…
0013a…e voilá! A imagem está visível pro MSX como drive A:!
0013bRoda beleza.
0013cE para trazer pro PC um disco gravado no MSX? Ora, usamos o processo inverso, usando as mesmas contas com a opção skip em vez de seek. Com mais um cuidado: temos que especificar a contagem de blocos, senão ele vai gerar um arquivo imenso contendo uma imagem até o final da partição. Como a imagem é de 720K, a contagem de blocos é 720 * 1024 / 512 = 1440.

O Linux nos permite montar um arquivo imagem como se disco fosse, o que torna muito fácil conferir se o que foi lido está correto. Vejam:
0014Çudaí, galera. Qualquer dúvida, comentem. Aqui no blog tanto quanto no podcast, seu comentário é o nosso salário.

Sobre Juan Castro

Juan Castro é uma das mentes em baixa resolução que compõem o Governo de Retrópolis – a única cujo Micro Formador não foi o MSX (e sim o TRS-80). Idealizador, arquiteto e voz do Repórter Retro. Com exceção do nome, que foi ideia do Cesar.

0 pensou em “Explorando um pouco mais o emulador de drive E100S

  1. Muito legal! Inclusive com um pouco de paciência, bash e pitadas de dialog seria possível criar um programinha “bem tosco porém funcional” que te permite catalogar as partições, montá-las e até mesmo fazer um sistema de “swapping” entre as que estão ativas (visíveis pelo emulador) e inativas (disponíveis na outra partição/resto do dispositivo)… ….opa, ideias surgindo, preciso comprar (aceito doação) um emulador desses.

    1. Heheh, pensei “la mesma cosa” señor Giovanni.

      Um script para preparar um USB drive com tantas partições possíveis dado o tamanho do USB Drive, ou um número de partições arbitrário à escolha do usuário.

      Um script para selecionar qual destas partições estaria “ativa”.

      Outro script para manipular esta partição ativa, isto é, escrever / recuperar os DSK nela contidos!

      Abração!

      e-1000

  2. FANTASTICO EXELENTE INVESTIGAÇÂO! estou grudado no tópico!

  3. Juan, post muito bom mesmo!

    Altamente didático, e mais, demonstra como podemos popular pendrives com imagens DSK fora do ambiente Windows e, mais, no tamanho de partição correto.

    Sou usuário Linux, este post vem de um Ubuntu + LXDE.

    Quanto aos 342 MB, esta informação é oriunda do manual da IPCAS:

    “Please note:
    One image uses approx. 7 MB on your pen drive. For 100 images, your pen drive
    should hold 1 GB.”

    Oras, se 1 imagem 1.44 MB disco ocupam 7 MB no USB, temos uma razão de 4.86 por megabyte da imagem.

    Uma imagem 720 KB (MSX) equivale a 3.42 MB no USB seguindo esta mesma razão.

    Bem, estas são informações advindas do manual da IPCAS…

    Seria interessante desmistificar estes números através de uma análise de um USB formatado pela aplicação Windows (eca!).

    Não me surpreenderia se descobrirmos que a aplicação sub-utiliza o espaço disponível do pen-drive. Isto é, aloca 100 discos em, digamos, 150 MB, e o restante fica não-utilizado na partição.

    Abraços e mais uma vez, obrigado pela excelente contribuição!!!

    Emil

    1. Nem sempre IDE resolve.

      Precisei esses dias de um drive de disquetes para rodar alguns programas, levantar dados sobre alguns MSX para mandar ao povo do OpenMSX. E o software indicado por eles só funciona com disquetes.

      Meu Spectravideo tem drive de disquete embutido, mas só um slot. Um emulador é muito bem-vindo, pois aí desocupa o slot que ficaria reservado à IDE-Mapper, e posso por a MegaFlashROM por lá, por exemplo.

      Repito: nem sempre a IDE resolve.

      1. Complemento com mais um exemplo, certos jogos setorizados só funcionam em disquete.

        ( Sim, sempre jogos, quem vai usar um MSX para trabalhar? 🙂

        Por sinal são raros os computadores clássicos ainda em funcionamento para fins que não lúdicos / fudebistas. )

        E sim, o emulador de disquetes ainda libera o uso de slots, como Ricardo apontou, substituindo os floppies já instalados nos gabinetes.

        Veja como o F700 ficou show na primeira foto do post de Juan! 🙂

        Além da praticidade, se tenho dois MSX com floppy emulator, posso usar o mesmo “pendrive” com ambos, sequer preciso desligar as máquinas.

        Por último, nem sempre temos uma CF que funciona em MSX 1.

        Tenho uma CF preparada para MSX-DOS 2, reconhecendo FAT-16, por sinal muito legal MESMO, 4 GB prum MSX é algo insano.

        …mas não posso usá-la no Hotbit matusquelo. O emulador de floppy resolve esta parada.

        Abraços e um bom FDS a todos!

  4. Juan, beleza me amarrei, mas agora para de brincar com MSX e testa nos nossos necessitados CoCos, por favor. Se conseguir que esse cara funcione neles, compro um na hora!

    MSX já tá cheio de emulador e mass storage…

    #pronto falei! 😛

    1. Concordo!

      ainda Não possuo nada de outra plataforma clássica, mas entendo que colocar este emulador de floppy a serviço dos outros computadores é algo de impacto estratosférico.

      Fudebagem “like a boss”. 😀

  5. pergunta do ano , suporta 1.2 de 5 1/4?

    abraços amigo

    Márcio Lima

  6. a sim , vc fez mais algum teste em outros micros como pedido ?

  7. Juan, só posso dizer: post show de bola!!! Parabéns!!!

  8. Massa !!! To super triste comprei um emulador da gotek e o mesmo nao funcionou fiz os procedimentos mas na hora de formatar da erro de BAD PARAMETER

    1. Creio que tua unidade seja apenas para discos de 1.44MB. Dê uma olhada no post do Emiliano e veja o que ele fez no jumper J8 da unidade, talvez seja o que você precisa.

  9. tem que ver pode ser outro modelo que n funciona ou algum problema no cartao ou no driver 8(

  10. acabei de gerar os discos com o programa de pc original, gerou os 100 discos no meu cartão de 2gb como comentado, acredito que eu esteja com o cartão subutilizado 8(

  11. Tô fuçando no treco aqui. Além de montar discos direto de imagens – como, aliás, muito bem lembrado no artigo – acho que nesse caso é ainda mais interessante montar disco por disco direto no usb stick:

    sudo losetup -o $((*1024*1024*3/2)) –sizelimit $((1024*1024*3/2)) /dev/loop0 /dev/sdb1
    sudo mount -t msdos /dev/loop0 mnt

    Aí é só usar o mount point como seu disco MSX e colocar nele o que vc quiser:

    ls mnt
    idiota2.bas idiota3.bas idiota4.bas
    cp /media/danilo/MSX/games/Boggle.rom mnt
    ls mnt
    boggle.rom idiota2.bas idiota3.bas idiota4.bas idiota5.bas

    para desmontar:

    sudo umount mnt
    sudo losetup -d /dev/loop0

    Pronto. Vai jogar no MSX agora.

    1. Correção: o 1o comando é

      sudo losetup -o $(([NUMERO DO DISCO]*1024*1024*3/2)) –sizelimit $((1024*1024*3/2)) /dev/loop0 /dev/sdb1

      []s
      Danilo