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;
}
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;
}
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 ROLLS: ;D