Skip to content

OCM_SM 3.9c - Release v2

Compare
Choose a tag to compare
@ducasp ducasp released this 01 Jun 14:43
· 69 commits to master since this release

OCM-PLD v3.9c

ko-fi

Para ler em português do Brasil, continue rolando a tela. :)

#WARNING

While I and some testers do our best to make sure there are no issues
that should cause device bricking or causing hardware failures, we are
in no way responsible for any issues that might arise.

Also, notice this has been tested on MC2+, SM-X, SM-X Mini and
SMX-HB, but not tested on SX2 as currently no one with SX2 has shown
interest on testing it. If you have a SX2, an USB Blaster and is willing
to make a few tests, please contact me. So, for SX2 users, I'm sorry
but while I did my best to make sure it will work fine, it is untested on
that platform.

Release v2

- only MC2+ changed
- possible improvement on compatibility with expansion #02

New in relation to v3.9b

- MC2+ supported
- Fixes for MC2+ related to original 3.8 build from Focosi/Trucco
- Improvements and fixes to MSX Mouse emulation over PS/2 mouse
- As a result, paddle emulation also is now smooter

Release notes

OCM-PLD v3.9c is an extension on KdL OCM release v3.9. What this extension
brings to the table:

  • New supported devices:

    • SMX-HB: It is a 1.75gen device. Its FPGA has about 1/3 less logic cells
      as a fruit of component shortage. It is meant to replace the motherboard
      of Hotbit MSX Computers, adding (almost) the full OCM-SM experience. As
      being a device with real MSX Keyboard, it has its own needs:

      • I've allowed Joystick port debounce to be disabled, this perhaps can
        alleviate the issues some users were having with paddles. To turn off
        Joystick port debounce use the command SETSMART -89 , to turn it back
        on use SETSMART -8A , power cycle will restore default, on.

      • I've added support to a third keyboard map table, so you have the one
        from the build (us/br/fr/es), japanese and one for the built-in MSX
        keyboard Hotbit has. Built-in keyboard of Hotbit is not standard and
        its map is very peculiar and PS/2 keyboards have a different mapping.
        DIP switch 9 set to OFF is the default, using the internal mapping, if
        set to ON it will use the mapping the firmware was built-in, that is
        handy when you want to use an external PS/2 keyboard.

      • Fix: Select key was not working on original 3.7.1 based release, it
        works now.

      • Improvement: SELECT + UP and SELECT + DOWN replaces Page Up and Page
        Down, so it is possible to activate the autofire module using only
        SMX-HB internal keyboard. Also, SELECT + F1 to F4 replaces F9 to F12,
        making it possible to use most of the keyboard shortcuts.

      • Missing: it doesn't support OPL3 as it won't fit on the FPGA used.

    • Multicore 2+: it is like a MiSTER device, but with less FPGA capacity (
      more than double of second gen devices, but about half of MiSTER) and also
      without an extra ARM core to help with USB devices (so it uses SEGA Genesis
      / Mega Drive controllers or SEGA Master System controllers and PS/2 mouse
      and keyboards). One advantage it has over MiSTER is that it was made with
      an expansion slot that you can insert expansions that allows to use real
      cartridges/interfaces for the device. There is a SM-X expansion available
      that adds three MSX Slots and ESP Wi-Fi.

      • Legacy: all features from OCM 3.8 build by Roberto Focosi and Victor
        Trucco were ported, so it supports the external slots extension, usage
        of images instead of needing a dedicated SD card, keyboard layout
        selection using OSD menu, etc.

      • Fix: when using images instead of dedicated SD card, writing to the
        card could cause errors / failures, now it should be working fine
        everytime.

      • Improvement: MC2+ has SEGA Genesis / Mega Drive joystick port. As
        such, my initial 3.7.1 version used only two buttons of any joystick
        and allowed invoking OSD using MODE + START on an eight button joystick
        , Focosi release ditched invoking OSD for sake of simplicity of design,
        I've restored invoking OSD and now ALL 8 buttons can be used on Joymega
        compatible games/software as well, for both joysticks. It also works
        with 4 buttons joysticks (Joymega) and 2 buttons joysticks (Master
        System joystick detected as regular MSX joystick).

      • Unique behavior: since MC2+ doesn't have dip switches but uses OSD
        being invoked through F12 key, turbo changing through F12 key was
        removed and it can be adjusted only on the OSD menu (F12 or MODE+START
        on joystick 1) or using switched I/O or software that sets the CPU
        speed. Since you need to hit F12 to invoke OSD and hit it back to
        remove it, it was not nice having F12 also switching the CPU clock.

      • Unique behavior: paddle emulation is turned on/off through the OSD
        menu, SETSMART commands for paddle won't have any effect.

      • Improvement: in general all DIP settings are done through the OSD. If
        you are using a disk image, settings are saved / kept on the SD Card,
        and restored back when OSD is invoked. NOTE: the following is valid if
        you have a STM firmware lower than 2.01, on STM firmware 2.01 there
        is an OSD option, SAVE & RESET, that overcomes this at the expense of
        rebooting the MSX. On STM 2.00, when using a dedicated SD Card,
        since the card is owned by the MSX as a whole, it is not possible to
        save settings in it as the SD Card I/O is not assigned to the MC2+
        microcontroller that makes the OSD a reality, so whenever you pop up
        the OSD, settings are reset to "default values", since microcontroller
        doesn't know settings on FPGA and could not save the settings into the
        SD Card to read back when invoked again. Due to that I've changed a few
        of those settings to alow sane defaults. Remember: if using dedicated
        SD card, set all settings the way you want before exiting OSD. If you
        invoke OSD again the default values will be loaded and your settings
        all lost / need to set it again. There is no other way around it
        currently.

      • Extra: if you have a ZX Next Expansion for MC2+ but doesn't have the
        SM-X one, you can use it after enabling it on the OSD. Currently the
        only feature supported is use of Wi-Fi / ESP. IMPORTANT: SM-X / Second
        Gen OCM devices use a customized ESP firmware, and ZX Next use standard
        "AT" firmware from Espressif. In order to make this feature useful, you
        need to have a second ESP-01 module flashed with the customized ESP
        firmware, so you can just put it into the extension when using it for
        MSX, and put back the original one when using it for ZX Next.
        Instructions on how to flash the custom ESP firmware are available at:
        https://youtu.be/uoaiEamWUUg

  • For devices/builds supporting OPL3:

    • Fix: I've fixed OPL3, it had two issues that prevented it to work with
      the latest VGMPlay version:

      • IRQ was not connected, so timers programmed wouldn't trigger,
        instead only the VDP interrupt, to slow, so music would play darn
        slow with VGMPlay.

      • Even after fixing that, playing speed was almost half of the correct
        speed for VGMs. The timer scaler was not properly set causing it to
        trigger slower than programmed.

      Since VGMPlay 1.3 relies on OPL3 timer when present to drive a high speed
      interrupt, not having IRQ and not having the proper scaler for timer
      caused its timing to be slow, darn slow...

    • Fix for second gen devices: I've fixed OPL3 sound rendering as it was
      discarding all information that is on right output channel only,
      unfortunately we do not have enough FPGA resources to run the sequencer
      for two channels, but a clever trick allows all songs content to be
      properly played in MONO glory :P Try as an example Doom soundtrack track
      3 before updating and after updating it. :)

    • Improvement for Multicore 2+: since MC2+ has a really large FPGA, OPL3
      works in real stereo mode since it can acommodate the extra registers
      needed for it that do not fit on regular second gen devices.

  • For devices supporting SN76489 / Second PSG:

    • Extra: I've added partial support to a built-in Franky. That partial
      support is good enough to work with SG1000, COL4MMM (using COM\Franky
      versions) VGMPLAY, ROBOPLAY and Sofarun (remember to set it to use MSX
      VDP and Franky's PSG). As Franky sound uses I/O ports 0x48 and 0x49, and
      those ports are part of the switched I/O, it is usually disabled, as OCM
      IPL loader will leave switched I/O selected after booting. There are
      different ways to enable Franky sound:

      • Latest release of COL4MMM automatically disables switched I/O, so no
        need for a SETSMART command or using VGMPLAY before.

      • VGMPLAY will automatically disable switched I/O, so you can play a
        VGM song that uses SN76489 and after exiting VGMPLAY you can use other
        software.

      • De-select the internal switched I/O by sending the basic command
        OUT &H40,0

      • Use SETSMART -8C to enable the I/O ports 0x48 and 0x49 for that, so
        any program relying on reading OCM information on those ports won't
        get it.

    • Extra: Second PSG on ports 0x10 to 0x13. It also allows the PSG registers
      to be read back.

  • For all devices:

    • Improved: Victor Trucco made improvements on the SDRAM controller so it
      is able to work with different chips. Some SM-X mini and SMX-HB use chips
      that need this to work.

    • Extra: I've added Paddle emulation when using a PS/2 mouse. To enable
      VAUS (Arkanoid/Taito) Paddle emulation use SETSMART -8E, to enable MSX
      standard paddle emulation use SETSMART -8F, to disable it (default) use
      SETSMART -8D. Note that MSX Standard paddle only works properly if Z80
      clock is 3.58MHz, like a real MSX Standard paddle on a MSX machine with
      turbo CPU. Supported on all builds except SMX-HB with Franky sound.

    • Fix: I've fixed mouse emulation. It was not possible to move a single
      pixel on X axis, now it is. Also, four different levels of sensibility
      are available by clicking the third mouse button (if your mouse is not an
      intellimouse compatible mouse w/ 3 buttons, sensibility will be fixed
      almost the same as before)

    • Fix: Mouse emulation would not work nice if you had an eight button mega
      drive joystick connected with joymega. Now it detects properly

    • Fix: When switching from mouse to joystick or joystick to mouse, joystick
      port is "disconnected" for 1 second. On a real MSX it is not possible to
      change from joystick to mouse without disconnecting each one so HIDTEST
      and software that uses HIDLIB to detect rely on the device being
      disconnected for a while to detect its removal and then be able to see
      the new device being connected

    • Improvement: ported the Multicore 2+ Mouse emulation to all devices. It
      is a better approach as it has a time-out to return to the first state
      after a few time without communication, like a real MSX mouse.

  • Future, devices that have full franky build:

    • Missing: FPGA in those devices can't fit OPL3 along with Franky VDP and
      PSG, so that build won't have OPL3 support. Exception will be MC2+ that
      can have it all.

    • Extra: this is a WIP, please wait, but it will have Franky VDP :P

All source code and binaries that changed in relation to OCM 3.9:
(c)2022 Oduvaldo Pavan Junior - ducasp@gmail.com

All source code from OCM 3.9 originally is a work of many people, including
KdL and Hara-san that are really huge contributors to it!

All code can be re-used, re-written, derivative work can be sold, as long as the
source code of changes is made public as well.

#AVISO

Eu e algumas pessoas testamos da melhor maneira possível para nos
certificarmos que não há qualquer problema que possa causar danos aos
dispositivos testados ou bricking (necessitando um USB Blaster para
restaurar o dispositivo), não somos de forma alguma responsáveis por
quaisquer problemas que possam acontecer.

Também, note que foi testado no MC2+, SM-X, SM-X Mini e SMX-HB,
mas não foi testado no SX2 já que atualmente ninguém que tenha um
SX2 se mostrou interessado em testar. Se tiver um SX2 e um USB Blaster
e puder fazer alguns testes, por favor entre em contato. Então, usuários do
SX2, sinto mas apesar dos meus esforços para garantir que funcione em seu
dispositivo, essa é uma plataforma que segue sem testes e sem garantias.

Release v2

- mudanças apenas pro MC2+
- uma possível melhoria no suporte a expansão #02 do MC2+

Novidades em relação a v3.9b

- Suporte ao MC2+
- Algumas correções para o MC2+ em relação ao build 3.8 original do Focosi/Trucco
- Melhorias e correções na emulação de mouse MSX usando mouse PS/2
- Como resultado, a emulação do paddle ficou mais suave

Notas de liberação da versão

OCM-PLD v3.9c é uma extensão da OCM v3.9 do KdL. O que essa versão tem de
diferente:

  • Novos dispositivos suportados:

    • SMX-HB: É um dispositivo geração "1.75". Seu FPGA tem cerca de 1/3 menos
      células como resultado da falta de components. Seu uso principal é de
      substituir a placa princial de um Hotbit, tendo (praticamente) toda a
      experiência OCM-SM. Por ter um teclado próprio de MSX, tem suas
      peculiaridades:

      • Permite o debounce das portas de joystick ser desligado, talvez possa
        ajudar com problemas que algumas pessoas estavam tendo com paddles.
        Para desligar o debounce use o comando SETSMART -89 , para religar use
        SETSMART -8A , ao desligar e religar a placa, o padrão é debounce
        ligado.

      • Suporte a um terceiro mapa de teclados, então tem o mapa da versão
        (us/br/fr/es), japonês e um para o teclado do Hotbit. O teclado do
        Hotbit não segue o padrão dos teclados de PC portanto seu mapa é bem
        diferente dos teclados PS/2. A chave DIP 9 em OFF é o padrão, uso do
        mapa Hotbit, configurada em ON irá usar o mapa da versão do firmware,
        útil quando quiser conectar um teclado PS/2 externo.

      • Correção: a tecla Select não estava funcionando na versão 3.7.1 que
        as placas foram enviadas, agora funciona.

      • Melhoria: SELECT + CIMA e SELECT + BAIXO substitui Page Up e Page
        Down, sendo possível ativar o disparo automático usando apenas teclas
        do Hotbit. Também temos SELECT + F1 a F4 sbustituindo F9 a F12, sendo
        possível utilizar a maioria dos atalhos de teclados do OCM.

      • Ausente: não há suporte a OPL3, não cabe no FPGA do SMX-HB. Também
        não foi possível suportar emulação de paddle na versão frankysnd pela
        mesma razão.

    • Multicore 2+: parecido com o MiSTER, porém com um FPGA menor que o mesmo(
      mais que o dobro dos OCM segunda geração, mas cerca da metade do MiSTER) e
      sem o ARM embutido no FPGA que é utilizado para interface com dispositivos
      USB (MC2+ usa controles SEGA, Mega Drive ou Master System e mouse/teclados
      PS/2). Uma vantagem sobre o MiSTER é o slot de expansão aonde podem ser
      colocadas expansões que permitem utilizar cartuchos/interfaces reais dos
      dispositivos. Existe uma expansão SM-X que dá três slots de MSX e o Wi-Fi
      usando ESP-01.

      • Legado: tudo que a versão OCM 3.8 do Roberto Focosi e Victor Trucco
        tem a mais foi trazido, então tem suporte a extensão SM-X, uso de
        imagens de disco para não ter que dedicar um cartão SD para MSX, mapas
        do teclado todos em uma única versão escolhidos pelo menu OSD, etc.

      • Correção: no uso de imagens ao invés do cartão SD dedicado, erros de
        escrita occorriam às vezes, agora deve estar funcionando sempre.

      • Melhoria: MC2+ usa controles SEGA. Inicialmente, a versão 3.7.1 que
        eu havia feito primeiro usava apenas dois botões de qualquer cotrole, e
        permitia chamar o OSD com MODE + START usando controle de 8 botões, o
        Focosi na 3.8 dele optou por uma solução simples que também usava apenas
        dois botões mas não permitia mais chamar o OSD. Agora nessa versão eu
        fiz com que os dois controles fossem mapeados internamentes para um
        "Joymega" interno. Com isso, dá para usar 4 ou 8 botões aonde o Joymega
        funciona (desde que use um controle com 4 ou 8 botões), chamar o OSD na
        combinação de START + MODE, tudo automático.

      • Comportamento único: o MC2+ não tem DIP switch, utiliza um OSD que é
        chamado pela tecla F12, portanto alterar o turbo da CPU com F12 key foi
        desabilitado e pode ser ajustado apenas pelo menu OSD (F12 ou MODE+START
        no controle 1) ou utilizando I/O chaveado ou software que configure a
        velocidade da CPU. Como o uso de F12 é necessário para chamar e depois
        tirar o OSD da tela, ter a velocidade da CPU sendo alterada por essa
        tecla não funcionava bem.

      • Comportamento único: a emulação de paddle é ligada/desligada apenas
        pelo menu OSD, os comandos SETSMART para paddle não tem efeito no MC2+.

      • Melhoria: as configurações do DIP são feitas pelo OSD. Se estiver
        utilizando uma imagem de disco, as mudanças são salvas no cartão SD e
        restauradas novamente quando o OSD é chamado ou ao religar. NOTA:
        a descrição a seguir é valida caso seu STM firmware esteja em na versão
        2.00 ou menor, STM firmware 2.02 adiciona uma opção no OSD, SAVE &
        RESET, que resolve essa questão ao custo de resetar o MSX. Ao usar um
        cartão SD diretamente, como o cartão é "controlado" pelo MSX, não é
        possível ao microcontrolador do OSD salvar configurações no cartão,
        então nesse caso sempre que o menu OSD é chamado as configurações que
        aparecem são configurações padrão, já que o microcontrolador do OSD não
        sabe das mudanças no FPGA e não pode salvar as mesmas no cartão que
        está dedicado para o MSX. Por isso alterei algumas das configurações
        de forma que os valores padrões atendam a maioria. Lembre: ao usar um
        cartão dedicado ao MSX ao invés de imagem, configure tudo que deseja
        ANTES de sair do OSD. Ao entrar novamente no OSD, as configurações
        padrão serão restauradas, então terá que configurar tudo novamente.
        Infelizmente, no momento não há maneira de contornar isso (a não ser
        utilizar uma imagem de SD ao invés de um SD dedicado).

      • Novidade: se tiver a expansão "ZX Next" do MC2+ mas não tiver a
        expansão SM-X, poderá usar a do ZX Next após habilitar a mesma no OSD.
        Atualmente a única característica adicionada com isso é o uso de Wi-Fi.
        IMPORTANTE: SM-X / dipositivos OCM de segunda geração usam um firmware
        customizado para o ESP, e o ZX Nest utiliza um firmware "AT" padrão da
        Espressif. Para o Wi-Fi funcionar no MSX, necessita um segundo módulo
        ESP-01 com o firmware customizado, assim pode colocar o ESP do MSX na
        extensão quando for usar MSX, e colocar o ESP original de volta quando
        for usar a extensão para ZX Next. Instruções de como gravar o firmware
        customizado do ESP estão disponíveis em:
        https://youtu.be/uoaiEamWUUg

  • Para dispositivos/firmwares suportando OPL3:

    • Correção: Arrumei a OPL3, tinha dois problemas que faziam OPL3 não
      funcionar com a última versão do VGMPlay:

      • IRQ estava desconectado, então os temporizadores programados não
        geravam interrupção, e com apenas a interrupção do VDP, a música
        tocava muito devagar.

      • Mesmo com IRQ conectado, a velocidade melhorou mas estava lenta. O
        temporizador tem uma escala que estava com valor incorreto para o
        clock utilizado, causando os temporizadores demorarem mais que o
        programado para acionar a interrupção.

      O VGMPlay 1.3 depende dos temporizadores da OPL3 quando a mesma está
      presente, como um temporizador de alta resolução, e não ter o IRQ ligado
      e não ter a escala correta nos temporizadores causava o mal funcionamento
      do mesmo...

    • Correção para dispositivos segunda geração: originalmente a OPL3 estava
      apenas com um canal conectado, descartando qualquer som tocando apenas no
      canal desconectado. Imagino que a razão disso é que ao conectar e mixar
      ambos canais, o uso de recursos FPGA vão além do que os FPGA de segunda
      geração tem disponível (o sequenciador de cada canal usa vários registros
      e ao ter um canal conectado apenas, o Quartus simplesmente corta esses
      registradores já que a saída não é conectada a nada). Fiz um pequeno
      truque para resolver essa situação, permitindo que todo o conteúdo seja
      tocado em apenas um canal sem ter que renderizar ambos e mixar depois. :P
      Tente por exemplo a terceira música da trilha sonora do Doom antes e
      depois da correção para sentir a diferença. :)

    • Melhoria pro MC2+: como o MC2+ tem um FPGA enorme, a OPL3 funciona em
      estéreo real. Permiti que a OPL3 possa ser usada em MONO pelo OSD.

  • Para dispositivos/firmwares suportando SN76489 e 2xPSG:

    • Novidade: suporte parcial a uma "Franky" embutida. Esse suporte parcial
      é suficiente para que SG1000, COL4MMM (usando as versões COM\Franky),
      VGMPLAY, ROBOPLAY e Sofarun (lembre de configurar de forma que use o VDP
      do MSX e PSG do Franky para SMS/SG1000). Como a Franky utiliza as portas
      0x48 e 0x49 que fazem parte das portas reservadas para I/O chaveado, irá
      estar desabilitado inicialmente, já que o módulo que carrega a BIOS MSX
      deixa o dispositivo de I/O chaveado selecionado após o boot. Há várias
      opções para habilitar o som da Franky:

      • A última versão do COL4MMM automaticamente desabilita o I/O chaveado,
        então não é necessário nada para que funcione. :)re.

      • VGMPLAY também desabilita automaticante o I/O chaveado, então se usar
        o VGMPLAY e tocar uma música que usa o SN76489, após sair do VGMPLAY
        poderá utilizar qualquer outro software que o som irá funcionar.

      • Enviar pelo BASIC o comando OUT &H40,0 que desabilita o I/O chaveado.

      • Usar SETSMART -8C para reservar as portas 0x48 e 0x49 para o Franky,
        ao fazer isso qualquer programa que dependa dessas portas para ler
        informações do OCM não irá obter a informação correta.

    • Novidade: Segundo PSG nas porta 0x10-0x13. Também permite que os
      regsitradores do segundo PSG sejam lidos.

  • Para todos dispositivos / firmwares:

    • Melhoria: Victor Trucco fez melhorias no controlador de SDRAM que agora é
      capaz de trabalhar com diferentes chips. Alguns SM-X mini e SMX-HB usam
      chips que precisam dessa melhoria pra funcionar.

    • Novidade: Emulação de Paddle usando um mouse PS/2. Para habilitar o modo
      VAUS (Arkanoid/Taito) use SETSMART -8E, to habilitar o modo MSX use
      SETSMART -8F, para desabilitar (padrão) use SETSMART -8D. Note que um
      paddle MSX apenas funciona corretamente se o Z80 estiver a 3.58MHz, como
      um veradeiro paddle MSX em um MSX com CPU turbo. A única exceção é o
      firmware para SMX-HB com som Franky, já que não há espaço no FPGA para o
      SN76489, o segundo PSG e o paddle.

    • Correção: Não era possível mover apenas um ponto no eixo X. Também
      adicionei quatro níveis de sensibilidade que podem ser alternados com o
      clique do terceiro botão do mouse (se seu mouse não for compatível com o
      padrão intellimouse / três botões, a sensibilidade estará fixa próximo ao
      que era originalmente).

    • Correção: a emulação de Mouse MSX não funcionava muito bem se um controle
      SEGA de quatro ou oito botões estivesse conectado com um Joymega. Agora o
      mouse é detectado adequadamente, porém, o controle só retoma o uso da
      porta de Joystick se apertar os botões A, B, C ou START (ou 1 e 2 em
      controles de 2 botões).

    • Correção: ao mudar de controle para mouse e vice versa, agora a porta de
      controles é "desconectada" por 1 segundo. Em um MSX real não é possível
      mudar de controle para mouse (e vice versa) sem desconectar o mesmo da
      porta, HIDTEST e jogos/programas que usem a HIDLIB dependem desse evento
      de desconexão e posterior conexão para detectar a troca de dispositivo.

    • Melhoria: a emulação de mouse MSX do MC2+ foi portada para todos. É uma
      forma melhor que contam com time-out para retornar sozinho ao primeiro
      estado após algum tempo sem leitura, assim como um mouse MSX real.

  • Futuro, dispositivos que terão um build Franky Completo:

    • Ausente: salvo pelo MC2+, o FPGA nos dispositivos OCM segunda geração não
      tem espaço suficiente para ter OPL3 junto com o VDP e PSG do Franky, logo
      esse build não terá suporte a OPL3. O MC2+ terá também a OPL3 junto com o
      Franky completo.

    • Novidade: ainda está em desenvolvimente, por favor aguarde, logo teremos
      o Franky com VDP e PSG :P

Todo código fonte e binários alterados em relação ao OCM 3.9:
(c)2022 Oduvaldo Pavan Junior - ducasp@gmail.com

Todo código fonte do OCM 3.9 é um trabalho de muitas pessoas, incluindo KdL e
Hara-san que são grandes contribuidores!

Todo código adicional pode ser reutilizado, re-escrito, trabalhos derivados
podem ser vendidos DESDE QUE o código fonte das mudanças seja publicado também.
Para o código original do OCM 3.9, verifique a licença do mesmo.