• Bueno, primero voy a corregir algo que acabo de notar sobre los tipos de cartuchos:

    Los cartuchos tipo Ultimax pueden ser de 16K si tienen una segunda ROM de 8K ubicada en $8000


    Otra cosa que me olvide de poner en el primer post es como se seleccionan los cartuchos.
    En el puerto de expansión de la c64 hay 2 salidas llamadas -ROML y -ROMH.
    -ROML se activa (se pone a 0) cuando el procesador esta accediendo entre $8000 y $9FFF.
    -ROMH se activa cuando el procesador accede entre $A000 y $BFFF en caso de los cartuchos normales de 16K o entre $E000 y $FFFF en el caso de los cartuchos Ultimax.


    Ademas, existen otras 2 salidas en el puerto de expansión llamadas -IO1 e -IO2 que mapean las direcciones $DExx y $DFxx respectivamente (esto es decir, 2 ventanas de 256 bytes cada una)
    Estas salidas estan dentro del rango de los chips de IO de la C64 ($D000 a $DFFF) y por lo tanto tambien estan pensadas para hardware adicional que se conecte a travez del puerto de expansión.
    Expansiones como la REU, GeoRAM, MMC64, Swiftlink, IDE64, SuperCPU, etc se manejan mediante accesos a esas 2 zonas de memoria.
    Pero también los cartuchos ROM usan este espacio para implementar mappers que permitan acceder a ROMs más grandes que 8 o 16K, o formas de ocultarse mientras no se estan usando (como los fastloads por ej).


    Pasando a mi pretensión de hacer un cartucho multijuegos.
    En 512K entrarian 64 programas de 8K, 32 de 16K o una mezcla de ambos tipos. A eso hay que restarle el programa que permitiría la seleccion en pantalla de cual programa se quiere correr.
    Ademas, mi intención es en un principio incluir una 'emulación' del cartucho Warpspeed, que es el fastload de Cinemaware, que incluye ademas monitor/assembler, editor de disco y copiador de discos.
    Otro 'emulacion' que se puede agregar sin complicar mucho el diseño es el cartucho del Simons BASIC.

     

  • Bien, voy a pasar un limpio lo poco que he avanzado en el diseño de este aparatejo:

    -No va a incluir capacidad para grabar la Flash, porque agrandaría mucho el circuito (se necesitan 3 integrados más al menos, 1 latch y 2 multiplexores)
    -Va a tener 4 modos: Normal, Warpspeed, Simons BASIC y Apagado, seleccionables por software. El modo apagado solo se puede revertir mediante RESET
    -2 Registros: $DE01 selecciona el banco de 8/16K dela Flash que se va a direccionar (A13-A18), los cartuchos de 16K tienen que estar alineados a 16K dentro de la Flash. Los 2 bits restantes del registro seleccionan el estado de /GAME y /EXROM.
    $DE00 solo los 2 bits inferiores se usan, seleccionan el modo del cartucho.
    Ambos registros on solo escritura.

    -La implementación tendría en total 4 integrados: FLASH, registro 74LS273, OR 4071 (o TTL no se si va a afectar acá mezclar familias) y una GAL16V8


    Funcionamiento del modo Warpspeed: El cartucho es de 16K entre $8000 y $BFFF, la parte entre $9E00 y $9FFF se repite entre $DE00 y $DFFF (en lectura claro). Escribir a $DFxx deshabilita la ROM entre $800 y $BFFF mientras que escribir a $DExx la vuelve a habilitar.

    Funcionamiento del modo SimonsBASIC: Tambien un cartucho de 16K entre $8000 y $BFFF, escribir $00 en $DE00 deshabilita la ROM entre $A000 y $BFFF mientras que escribir $01 la vuelve a habilitar.

    La GAL: Para los que no saben, las GAL son un tipo de chips (re)programables, algo así como los abuelos de los FPGA. Con estos chips se pueden implementar tanto circuitos combinacionales como sequenciales ya que tienen flip flops dentro.
    Las entradas hasta ahora las tengo definidas así: phi2 en el pin 1 y en el resto de las entradas irian R/-W, /IO1, /IO2, /RESET, D1, D0 y A0 y me queda una entrada libre.
    Las salidas no las tengo muy pensadas pero en principio:
    - /IOEN seleccion de la FLASH cuando en modo Warpspeed y accediendo a $DE00-$DFFF (OR con diodo hacia /OE de la flash)
    - /LCLK reloj para el latch 74LS273, o sea accediendo a $DE01 en modo normal
    - /SGAME Estado del latch ($DE00, interno a la GAL) del modo Simons BASIC, OR con salida /GAME del latch 74LS273

    -/WEXROM Estado del latch interno del modo Warspeed, OR con salida /EXROM del latch 74LS273

    Eso es todo por el momento, les dejo el esquema 'original' del cartucho warpspeed, lo arregle porque el que se consigue por internet esta mal.


    Edit: agregado /WEXROM

    Wrpspeed1
     

  • Acá esta en principio las ecuaciones para la GAL16V8, primero me daba error de que la ecuación para WGAME era demasiado complicada y no iba a entrar, despues de muchas pruebas el error se fue simplemente quitando un statement 'default' y dejando el next solito.

    Ahora que funcione es otra cosa  ;D, todavia no terminé de armar la simulación (estoy usando WinCUPL).
    Es la primera vez que escribo algo en CUPL, si llega a funcionar bien va a ser un milagro  ;D


    Name      MCART;
    Partno    SS0001;
    Date      09/05/09;
    Revision  02;
    Designer  Woz;
    Company   SolidState;
    Assembly  None;
    Location  None;
    Device    g16v8a;

    /****************************************************************/
    /* Decodificador y registro                                     */
    /****************************************************************/

    /**  Inputs  **/

    Pin 1        = clk;             /* System clock                */
    Pin 2        = rw;              /* Read/Write                  */
    Pin 3        = io1;             /* IO1 ($DExx)                 */
    Pin 4        = io2;             /* IO2 ($DFxx)                 */
    Pin 5        = reset;           /* System /RESET               */
    Pin 6        = d1;              /* Data bit 1                  */
    Pin 7        = d0;              /* Data bit 0                  */
    Pin 8        = a0;               /* Address bit 0               */
    Pin 11       = !oe;             /* Register output enable      */

    /**  Outputs  **/

    Pin 19       = !ioen;           /* ROM enable on IO1 and 2      */
    Pin 18       = lclk;            /* Latch clock                  */
    Pin 17       = !wexrom;         /* /EXROM status wspeed mode    */
    Pin 16       = !sgame;          /* /GAME status simons mode     */
    Pin [13..12] = [M1..0];         /* cartridge mode               */

    /** Declarations and Intermediate Variable Definitions **/

    field mode = [M1..0];           /* declare mode bit field */
    field imode = [d1..0];          /* mode at input pins */
    $define NORMAL    'b'00         /* define mode states */
    $define WARPSPEED 'b'01
    $define SIMONS    'b'10
    $define INACTIVE  'b'11

    field banking = [wexrom, sgame];

    io1w       = mode:WARPSPEED & !rw & !io1; /* write to IO1 on Warpspeed mode */
    io2w       = mode:WARPSPEED & !rw & !io2; /* write to IO2 on Warpspeed mode */

    R0W        = !rw & !a0 & !io1; /* write to even addr at IO1 */

    simw       = mode:SIMONS & R0W; /* write to even addr at IO1 on SIMONS mode */


    /** Logic Equations **/


    ioen       = mode:WARPSPEED & rw & (!io1 # !io2);
    lclk       = mode:NORMAL & !rw & !io1 & a0;  /*write to odd addr at IO1 clocks latch on NORMAL mode */

    Sequenced banking {                       /* Banking selection */

    present 'b'00   /* No external rom selected */
                   /* Bank in 16K rom if not in Warpspeed mode, */
                   if io1w # !reset   next 'b'11; /* write to $DExx */
                   /* or reset */
                   default            next 'b'00;
    present 'b'01   next 'b' 11;                  /* Ultimax mode, switch 16K ROM */
    present 'b'10   if (simw & d0)     next 'b'11; /*8K ROM selected*/
                   if !reset          next 'b'11;
                   default            next 'b'10;
    present 'b'11   if simw & !d0      next 'b'10; /*16K ROM selected*/
                   if io2w            next 'b'00; /*disable ROM if write to IO2 on Warspeed mode */
                   next 'b'11;
    }


    Sequenced mode {                     /* Mode selection */

    present NORMAL    if imode:SIMONS & R0W next SIMONS;    /* Normal mode, enable mode selection */
                     if imode:WARPSPEED & R0W next WARPSPEED;
                     if imode:INACTIVE & R0W next INACTIVE;
                     default         next   NORMAL;
    present WARPSPEED if !reset          next NORMAL;    /* other modes only react to RESET */
                     default next WARPSPEED;
    present SIMONS    if !reset          next NORMAL;
                     default next SIMONS;
    present INACTIVE  if !reset          next NORMAL;
                     default next INACTIVE;
    }
     

  • Y no funcionó nomas...  ;D
    El default no se puede sacar porque sino no le hace caso a los IFs.
    Igual pude hacer entrar toda la logica en la GAL, aprendí 2 cosas: Si el compilador se queja de que una ecuación tiene demasiados terminos AND, pero tenes algún pin de salida libre, podes mandar alguno de los terminos temporales a la salida y de esta manera saltear el problema, el compilador aprovecha la logica extra de esta nueva salida y luego manda el resultado a la ecuación que primero no entraba.

    El SIMONS' BASIC no funciona como dice el documento sobre .CRT, viendo el codigo fuente del VICE descubrí que desactiva parte de la ROM al escribir a $DExx y la vuelve a activar leyendo a $DExx. Una variable menos para la ecuacion que me estaba dando problemas. smile

    Aca el codigo CUPL arreglado:

    Name      MCART;
    Partno    SS0001;
    Date      09/05/09;
    Revision  02;
    Designer  Woz;
    Company   SolidState;
    Assembly  None;
    Location  None;
    Device    g16v8a;

    /****************************************************************/
    /* Decodificador y registro                                     */
    /****************************************************************/

    /**  Inputs  **/

    Pin 1        = clk;             /* System clock                */
    Pin 2        = rw;              /* Read/Write                  */
    Pin 3        = io1;             /* IO1 ($DExx)                 */
    Pin 4        = io2;             /* IO2 ($DFxx)                 */
    Pin 5        = reset;           /* System /RESET               */
    Pin 6        = d1;              /* Data bit 1                  */
    Pin 7        = d0;              /* Data bit 0                  */
    Pin 8        = a0;               /* Address bit 0               */
    Pin 11       = !oe;             /* Register output enable      */

    /**  Outputs  **/

    Pin 19       = !ioen;           /* ROM enable on IO1 and 2      */
    Pin 18       = lclk;            /* Latch clock                  */
    Pin 17       = !wexrom;         /* /EXROM status wspeed mode    */
    Pin 16       = !sgame;          /* /GAME status simons mode     */
    Pin 15       = simw;
    Pin 14       = simr;
    Pin [13..12] = [M1..0];         /* cartridge mode               */

    /** Declarations and Intermediate Variable Definitions **/

    field mode = [M1..0];           /* declare mode bit field */
    field imode = [d1..0];          /* mode at input pins */
    $define NORMAL    'b'00         /* define mode states */
    $define WARPSPEED 'b'01
    $define SIMONS    'b'10
    $define INACTIVE  'b'11

    field banking = [wexrom, sgame];

    io1w       = mode:WARPSPEED & !rw & !io1; /* write to IO1 on Warpspeed mode */
    io2w       = mode:WARPSPEED & !rw & !io2; /* write to IO2 on Warpspeed mode */

    R0W        = !rw & !io1; /* write to IO1 */

    /** Logic Equations **/

    simw       = mode:SIMONS & !io1 & !rw; /* write to IO1 on SIMONS mode */
    simr       = mode:SIMONS & !io1 & rw;  /* read to IO1 on SIMONS mode  */

    ioen       = mode:WARPSPEED & rw & (!io1 # !io2);
    lclk       = mode:NORMAL & R0W & a0;  /*write to odd addr at IO1 clocks latch on NORMAL mode */

    Sequenced banking {                       /* Banking selection */

    present 'b'00   /* No external rom selected */
                   /* Bank in 16K rom if not in Warpspeed mode, */
                   if io1w # !reset   next 'b'11; /* write to $DExx */
                   /* or reset */
                   default            next 'b'00;
    /*present 'b'01   next 'b' 01;*/                  /* Ultimax mode, switch 16K ROM */
    present 'b'10   if simr # !reset   next 'b'11; /*8K ROM selected*/
                   default            next 'b'10;
    present 'b'11   if simw            next 'b'10; /*16K ROM selected*/
                   if io2w            next 'b'00; /*disable ROM if write to IO2 on Warspeed mode */
                   default            next 'b'11;
    }


    Sequenced mode {                     /* Mode selection */

    present NORMAL    if imode:SIMONS & R0W & !a0 & reset next SIMONS;    /* Normal mode, enable mode selection */
                     if imode:WARPSPEED & R0W & !a0 & reset next WARPSPEED;
                     if imode:INACTIVE & R0W & !a0 & reset next INACTIVE;
                     default         next   NORMAL;
    present WARPSPEED if !reset          next NORMAL;    /* other modes only react to RESET */
                     default next WARPSPEED;
    present SIMONS    if !reset          next NORMAL;
                     default next SIMONS;
    present INACTIVE  if !reset          next NORMAL;
                     default next INACTIVE;
    }
     

  • Acá les dejo el esquema, la ROM en realidad tendría que ser una 29F040, pero yo estoy usando una 29F400 soldada a un adaptador para que funcione como 27C400...

    La compuerta OR y el circuito RC en la linea de RESET que va a la GAL y al latch es para resetear solo la C64 con un pulso corto o resetear tambien el cartucho con un pulso largo.

    Siguiente paso ahora seria ver de emular el comportamiento del cartucho en el VICE y escribir el software que permita la elección del juego/aplicación guardado en ROM.

    Edit: Veo que la ROM no tiene nombre directamente en el esquema (es el integrado a la derecha), todavia me falta bastante con el asunto de crear librerias en el Eagle...
     

  • No tengo muchas novedades, tengo hecha la plaqueta para el grabador de GALs, doble faz, no salio del todo bien porque se me corrio 1/2 mm de un lado, justo donde hay 2 integrados. Todavia sirve (creo) pero voy a tener que tener cuidado cuando suelde.

    Ahora estoy escribiendo el menú de selección, mi assembler esta medio oxidado, escribo escribo y despues me doy cuenta que tengo 20 opcodes de más  ;D

    Estuve seleccionando juegos para poner en la Flash pero no hay muchos interesantes de 16K o menos, no llego a 200K. Incluir una rutina de copia desde la ROM a RAM me permitiría poner programas comunes (BASIC o no) y cargarlos 'instantaneamente' desde el cartucho.
    Incluir el kernel GEOS suena tentador, solo se necesitaría un disco con el desktop y a bootear GEOS es 10 segundos biglaughROLLS: ;D
     


  • Ahora estoy escribiendo el menú de selección, mi assembler esta medio oxidado, escribo escribo y despues me doy cuenta que tengo 20 opcodes de más  ;D

    Estuve seleccionando juegos para poner en la Flash pero no hay muchos interesantes de 16K o menos, no llego a 200K. Incluir una rutina de copia desde la ROM a RAM me permitiría poner programas comunes (BASIC o no) y cargarlos 'instantaneamente' desde el cartucho.
    Incluir el kernel GEOS suena tentador, solo se necesitaría un disco con el desktop y a bootear GEOS es 10 segundos biglaughROLLS: ;D


    No habia visto este trhead antes y tambien estuve con este tema de pasar juegos a cartuchos, tambien me entere por mi cuenta de lo de /ROMH y /GAME !
    Logre meter en un cartucho el predatore/monteznosecuanto y me di cuenta que ya era de cartucho smile, asi que no hizo falta mi cargador.
    El juego de menos de 16KB que logue pasar a cartucho fue el Oligofrenico  ::) y tambien el Panic Express (puede que sea tambien originalmente de cartucho). Estoy tratando de pasar el Henry's House, basicamente es sacarle cosas para poder comprimirlo mejor. Uso el Exomizer que comprime muy bien los ejecutables, aunque tarda unos segundos en descomprimir. No probe con programas en BASIC, el problema es que solo se pueden usar programas en basic de hasta 8KB, porque el basic esta en a000 y desaparece cuando se usa el segundo banco de 8Kb del cartucho (no me acuerdo si era la linea game o romh) entonces habria que grabar en el cartucho una copia exacta del basic porque sino no hay forma de habilitarla una vez que esta el cartucho puesto.

           Saludos
          MARCOS
     

  • El thread tenía otro titulo antes que no llamaba mucho la atención, por eso se lo cambié.

    Este diseño permitiría copiar un programa de 'cualquier' tamaño desde la Flash hacia RAM, porque se puede desactivar el cartucho despues de copiar pero antes de ejecutar el programa en cuestion.
    Para eso el programa de copia debería copiarse primero a sí mismo, o al buffer de cassete o a la memoria de pantalla en $0400. Copiar el programa, desactivar el cartucho, inicializar el BASIC (menos la parte que muestra el mensaje de inicio porque tambien hace un NEW ahí el interprete) y saltar a la rutina de RUN.
     

  • Aca estan los 3 juegos que pase a cartucho, el predatore (que ya era, asi que no tiene loader), el panic expres (yo estoy loco o la version que tenia de chico el tipo avanzaba hacia de derecha?) y el oligofreico, mas el programa a medio hacer que iba a transformar de PRG a CRT.

    Igual me parece que no hay forma de acceder al basic habiendo un cartucho de 16KB conectado a la maquina, salvo que desactives la linea /GAME, pero eso se puede hacer solo desde hardware, no desde programa. Asi que no habria forma de ejecutar ni un SYS ni listar nada. Fijate en  http://codebase64.org/doku.php?id=base:memory_management

             LHGE   LHGE   LHGE   LHGE   LHGE   LHGE   LHGE   LHGE   LHGE

              1111   101X   1000   011X   001X   1110   0100   1100   XX01
     10000  default                00X0                             Ultimax
     -------------------------------------------------------------------------
      F000
             Kernal  RAM    RAM   Kernal  RAM   Kernal Kernal Kernal ROMH(*
      E000
     -------------------------------------------------------------------------
      D000    IO/C   IO/C  IO/RAM  IO/C   RAM    IO/C   IO/C   IO/C   I/O
     -------------------------------------------------------------------------
      C000    RAM    RAM    RAM    RAM    RAM    RAM    RAM    RAM     -
     -------------------------------------------------------------------------
      B000
             BASIC   RAM    RAM    RAM    RAM   BASIC   ROMH   ROMH    -
      A000
     -------------------------------------------------------------------------
      9000
              RAM    RAM    RAM    RAM    RAM    ROML   RAM    ROML  ROML(*
      8000
     -------------------------------------------------------------------------
      7000

      6000
              RAM    RAM    RAM    RAM    RAM    RAM    RAM    RAM     -
      5000

      4000
     -------------------------------------------------------------------------
      3000

      2000    RAM    RAM    RAM    RAM    RAM    RAM    RAM    RAM     -

      1000
     -------------------------------------------------------------------------
      0000    RAM    RAM    RAM    RAM    RAM    RAM    RAM    RAM    RAM
     -------------------------------------------------------------------------

    Las unicas 2 formas de tener el basic en A000 es con /GAME deshabilitado.
    La verdad que nunca me meti en este tema, con la poca informacion tecnica que tenia cuando programaba la C64 no hubiera llegado muy lejos, es poco intuitivo.

    EDIT: Yo habia entendido que estabas haciendo un cartucho comun de 16KB pero con flash y algun otro chiche, pero veo que tambien tenes para manejar las lineas /GAME desde afuera con un puerto especial desde el programa, asi que no dije nada  ;) Despues lo miro un poco mas en detalle, lindo proyecto!

          Saludos
         MARCOS
     

  • [s]Por eso, el circuito que puse acá puede activar o desactivar GAME y EXROM segun como pongas los bits 6 y 7 del registro en $DE01.[/s]

    No dije nada yo tampoco wink

    Revisando un poco las ecuaciones en el codigo CUPL me parece que tengo que hacer algunos arreglos...
     

Moderador (s): homecomputer, Selandari, ArielP, pastbytes, Durandal