¿Como funciona una "op_illegal" en el 68000?

Foro dedicado a la programación en todo tipo de sistemas clásicos.
jepalza

¿Como funciona una "op_illegal" en el 68000?

Mensajepor jepalza » 20 Nov 2014, 07:29

Hace un tiempo comencé a programar un emulador de 68000 de motorola en Basic 100%, pero tenía muchos problemas, sobre todo por que usaba masivamente punteros (al estilo de "c") y no me convencía mucho como quedó, por lo que lo retome hace unos meses y lo he reescrito desde cero, mirando otros emuladores mas sencillos que solo usan punteros en unas pocas instrucciones en las que bien poca solución se puede aplicar, si no son punteros.

Ahora, el emulador lo vuelvo a tener funcional al 90% mas o menos, como tenía el anterior en ESTE HILO.

EL tema, es que hay una excepcion en el 68000 , que por mas que leo no entiendo, y quizás por eso, no consigo avanzar. Para comprobar que el emulador funciona, en lugar de tratar de emular un "Mac128k" como hice la vez anterior, lo estoy haciendo con un arcade llamado "FoodFight" de Atari y todo va bien, hasta que el juego genera instrucciones ilegales, del tipo "000E", y ahí me pierdo por que el juego se detiene y los monigotes no se actualizan (o sea, no se mueven).
Yo entiendo, que un OP_ILEGAL debería detener la CPU (HALT) y no continuar, pero entonces, ¿cómo es posible que el juego arcade exista en la vida real? :---)

¿sabe alguien si un opcode ilegal se debe tratar como una excepción y saltar a alguna rutina concreta leyendo de la tabla de interrupciones del inicio de ROM? :rezo
Adjuntos
food_fight_inicio.jpg
food_fight_inicio.jpg (24.33 KiB) Visto 6821 veces
emu68k1.jpg
emu68k1.jpg (201.58 KiB) Visto 6822 veces

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 840
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: ¿Como funciona una "op_illegal" en el 68000?

Mensajepor Namek » 20 Nov 2014, 07:36

Pues segun recordaba y he podido confirmar en este articulo, las op ilegales generan una excepción... :mrgreen:

http://www.cse.dmu.ac.uk/~sexton/WWWPag ... tions.html

jepalza

Re: ¿Como funciona una "op_illegal" en el 68000?

Mensajepor jepalza » 20 Nov 2014, 08:27

Jopetas, pues esa página también la estuve leyendo, pero sigo sin entender. La excepción lleva una palabra (word) con sus dos bytes , pero ¿qué se hace con ella? Esa es la duda. Con una excepción tipo IRQ si entiendo la jugada, pero una ilegal, al hacer el rollo del "nibble", se me queda en "0", y luego, ¿qué? a dónde salto..... >| :---)

Edito:
Esta es la parte que lo explica, pero me suena a marciano

Código: Seleccionar todo

Illegal op-codes Any instruction fetched whose opcode does not represent a legitimate instruction causes an exception. Note that a special case exists in that two instructions for handling floating point data are not implemented - the user may use the exception to simulate such instructions in software.


(traducido por san gugle):

Código: Seleccionar todo

Códigos de operación ilegales Cualquier instrucción extraída cuyo código de operación no representa una instrucción legítima causa una excepción. Tenga en cuenta que existe un caso especial en el que las dos instrucciones para el manejo de datos de punto flotante no se aplican - el usuario puede utilizar la excepción a simular las instrucciones en el software.

Avatar de Usuario
Chui
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 226
Registrado: 18 Oct 2008, 17:31
Sistema Favorito: Atari ST
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Saturn
Primera consola: TV Games/Pong Clone
Gracias dadas: 3 veces
Gracias recibidas: 15 veces
Contactar:

Re: ¿Como funciona una "op_illegal" en el 68000?

Mensajepor Chui » 20 Nov 2014, 10:12

Cuando hay una opcode ilegal (opcode 4AFC, opcodes de A000 a AFFF y opcodes de F000 a FFFF) la CPU salta a la excepción correspondiente (vectores numero 4, 10 y 11 respectivamente) metiendo previamente en la pila tanto SR como el valor de PC que provoco la excepción. También cambia a modo supervisor si se estaba en modo usuario, usando la pila a ASP en vez de SP (A7).

Básicamente se trata de pillar de la tabla de vectores el nuevo valor de PC que corresponda. Te corto/pego el código que escribimos en nuestro core FAME:
-----------------------------------------------------------------------------
static void execute_exception(s32 vect)
{
/* comprobar si hay tabla funciones manejadoras */
if (FAME_CONTEXT.icust_handler && FAME_CONTEXT.icust_handler[vect])
{
FAME_CONTEXT.sr = GET_SR;
FAME_CONTEXT.pc = UNBASED_PC;
(*(icust_handler_func*)&FAME_CONTEXT.icust_handler[vect])(vect);
}
else
{
u32 newPC;
u32 oldPC;
u32 oldSR = GET_SR;

READ_LONG_F(vect * 4, newPC)

/* swap A7 and USP */
if (!flag_S)
{
u32 tmpSP;

tmpSP = ASP;
ASP = AREG(7);
AREG(7) = tmpSP;
}

oldPC = UNBASED_PC;
PUSH_32_F(oldPC)
PUSH_16_F(oldSR)

/* adjust SR */
flag_S = M68K_SR_S;

SET_PC(newPC)
}

io_cycle_counter -= exception_cycle_table[vect];
}
-----------------------------------------------------------------------------

Además, si dentro del tratamiento de la excepción (flag_S activado) se provoca otra excepción, hay que saltar al vector de doble excepción.

Entiendo que el juego tiene un opcode ilegal o bien porque esta mal dumpeao o bien porque tiene una protección anti-copia de la época, muy común en los juegos de AtariST y Amiga500. Algunas protecciones y sus correspondientes cracks eran muy complicados, incluyendo en la ecuación el modo traza.

jepalza

Re: ¿Como funciona una "op_illegal" en el 68000?

Mensajepor jepalza » 20 Nov 2014, 11:33

mMMMM... Vale, ahora entiendo ( o creo entender, hasta que lo reescriba en basic). Pero otra duda ahora que lo leo: ¿una segunda excepción dentro de otra no provoca un HALT de verdad, o sea, no se congela la CPU por ilegal de narices? Yo lo tengo así programado por ahora.


Chui escribió:Entiendo que el juego tiene un opcode ilegal o bien porque esta mal dumpeao o bien porque tiene una protección anti-copia de la época, muy común en los juegos de AtariST y Amiga500. Algunas protecciones y sus correspondientes cracks eran muy complicados, incluyendo en la ecuación el modo traza.

Releo, y sí que entiendo. Solo tenemos tres direcciones a pillar , la 4 la 10 y la 11 (entiendo que palabras largas, o sea 4 bytes), que viene a corroborar lo que veo en el código del juego en cuestión, por que solo veo tres opcodes ilegales. Luego lo aplico, por la tarde, que ahora se supone que estoy trabajando. Y es lo que tú dices, al ser de atari, será una protección de la época.
Por cierto, los modos de trazado no creo que los implemente, por que es un emulador para mi, no para vender. Y si se lo dejo a alguien, dudo que emplee el modo traza, que no sea para meter un depurador por diversión.



Y otra cosa: ¿tú (vosotros) hiciste el Fame, el core DLL con soporte para el VBasic? Lo estuve probando, pero en VBasic no me manejo bien y no conseguí hacerlo andar, y luego, me hice un ".BI" para el FreeBasic y ahí si pude probarlo, pero me ocurrió algo con los accesos a memoria (que ahora no recuerdo) y me tiraba con error de todas todas (memoria corrompida), por que se usa mucho el CDECL , el Byval y todos esos, de temas de acceso directo a RAM, y en cuanto pones algo que no es, corrompes el espacio. ¿no tendrás ejemplos en VBasic funcionales? Podría pasarlos a FreeBasic y tratar de emular un A500 usando vuestro core, y así gano velocidad, por que el mio, en Basic 100% necesita un I7 como poco para mover con soltura un simple arcade de los 80

Avatar de Usuario
Chui
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 226
Registrado: 18 Oct 2008, 17:31
Sistema Favorito: Atari ST
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Saturn
Primera consola: TV Games/Pong Clone
Gracias dadas: 3 veces
Gracias recibidas: 15 veces
Contactar:

Re: ¿Como funciona una "op_illegal" en el 68000?

Mensajepor Chui » 20 Nov 2014, 23:09

FAME lo escribio Oscar (Fox68k), yo estuve ayudándole a hacerlo y depurándolo hasta el infinito, sobretodo cuando hicimos NEO4ALL y UAE4ALL. Siempre lo he usado o bien en Dreamcast o en Linux, por lo que no se decirte como se podría usar en Basic. No toco el Basic desde la época del Spectrum, ya con el AtariST programaba en ensamblador y mas adelante sobretodo C/C++ y Java.

En cualquier caso, entiendo que se puede usar FAME como una libreria desde cualquier sitio con facilidad, al estar basado en contexto.

Para emular un A500 sin duda FAME podría ayudar, a mi me dio la vida en UAE4ALL para Dreamcast, pero fue un dolor ponerlo porque el amiga es muy cabrón de emular. El código fuente esta libre, por lo que puedes echar un vistazo como se integra el core:
http://chui.dcemu.co.uk/uae4all.html

Sobre las excepciones, creo recordar que es una tabla de 32 vectores, las hay de varios tipos, como excepciones por division por 0 o un simple trap de sistema operativo. La doble excepción existe y es importante, si no la implementas no veras el precioso 'GURU MEDITATION' del amiga500, o las bombas de atariST.

El modo traza lo mismo, si no se implementa muchos de los juegos petaran en las intro/cracks. No es necesario para emular consolas como la NeoGeo o la MegaDrive, pero esencial para AtariST y Amiga500.

jepalza

Re: ¿Como funciona una "op_illegal" en el 68000?

Mensajepor jepalza » 21 Nov 2014, 08:47

Gracias. Los de las excepciones ya estoy con ello, poco a poco, que lo primero es el trabajo. A ver si esta vez (es el tercer intento) consigo emular un Mac128 en Basic, que sería el primero del mundo :jumper:

Lo del fame, algún día lo retomaré. Si logro que el freebasic no se corrompa con las llamadas a la DLL, mi idea es hacer un A500 en Basic, usando en CM solo el 68000. ](*,)


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados